python - 逻辑回归 Python 实现
问题描述
我尝试在 Python 中仅使用 numpy 实现逻辑回归,但结果并不令人满意。预测似乎不正确,损失没有改善,因此代码可能有问题。有谁知道什么可以解决它?非常感谢!
这是算法:
import numpy as np
# training data and labels
X = np.concatenate((np.random.normal(0.25, 0.1, 50), np.random.normal(0.75, 0.1, 50)), axis=None)
Y = np.concatenate((np.zeros((50,), dtype=np.int32), np.ones((50,), dtype=np.int32)), axis=None)
def logistic_sigmoid(a):
return 1 / (1 + np.exp(-a))
# forward pass
def forward_pass(w, x):
return logistic_sigmoid(w * x)
# gradient computation
def backward_pass(x, y, y_real):
return np.sum((y - y_real) * x)
# computing loss
def loss(y, y_real):
return -np.sum(y_real * np.log(y) + (1 - y_real) * np.log(1 - y))
# training
def train():
w = 0.0
learning_rate = 0.01
i = 200
test_number = 0.3
for epoch in range(i):
y = forward_pass(w, X)
gradient = backward_pass(X, y, Y)
w = w - learning_rate * gradient
print(f'epoch {epoch + 1}, x = {test_number}, y = {forward_pass(w, test_number):.3f}, loss = {loss(y, Y):.3f}')
train()
解决方案
乍一看,您错过了截距项(通常称为 b_0 或偏差)及其梯度更新。此外,在backward_pass 和loss 计算中,您不会除以数据样本的数量。
您可以在此处查看如何从头开始实现它的两个示例:
推荐阅读
- c# - MYSQL“使用”查询在应用程序中选择数据库
- java - JPA:通过覆盖数据源在 JSE 和 JUnit 中重用 persistence.xml 和 jta-data-source
- single-sign-on - Keycloak - 直接用户链接注册
- ios - 重置 UITableViewCell 无法正常工作/未选择的单元格在滚动后显示为选中状态
- php - 从句子中查找带有关键字的记录
- laravel - 如何在 laravel 中分离验证错误列表
- java - 启动 SpringBoot 2.0.3.RELEASE 时出错
- spring-boot - Spring Boot 应用程序无法连接到在 Docker 容器中运行的 MySQL 数据库
- laravel - PHPunit 在 Laravel 中忽略 onDelete 设置 null
- php - Laravel - 如何将作业从一个redis队列移动到另一个redis队列?