python - 从零开始的线性回归实现
问题描述
我试图理解梯度下降算法。
有人可以解释为什么我使用以下代码获得高 MSE 值,或者如果我错过了一些概念,你能澄清一下吗?
import numpy as np
import pandas as pd
my_data = pd.DataFrame({'x': np.arange(0,100),
'y': np.arange(0,100)})
X = my_data.iloc[:,0:1].values
y = my_data.iloc[:,1].values
def gradientDescent(X, y, lr = 0.001, n = 1000):
n_samples, n_features = X.shape
cost = []
weight = np.zeros([n_features])
b = 0
for _ in range(n):
# predict
y_hat = np.dot(X, weight) + b # y = ax + b
residual = y - y_hat
db = -(2/n_samples) * np.sum(residual)
dw = -(2/n_samples) * np.sum(X.T * residual, axis = 1)
# update weights
weight -= (lr * dw)
b -= (lr * db)
cost.append(((y-y_hat) **2).mean())
return weight, b, cost
gradientDescent(X,y)
解决方案
不是专家,但我认为您目前遇到了这个exploding gradient
问题。如果您单步执行您的代码,您会注意到您的权重值在递增的步骤中从正值变为负值。我相信你找不到最小值,因为对这个数据集使用 mse 会导致你来回跳跃,永远不会收敛。您的 x 和 y 范围为 100,因此当您查看成本时,它只是在爆炸。
如果您想将 mse 与当前的 x 和 y 值一起使用,您应该标准化您的数据。您可以通过减去平均值并除以标准偏差来做到这一点,或者只是将 x 和 y 归一化为 1。
例如:
my_data.x = my_data.x.transform(lambda x: x / x.max())
my_data.y = my_data.y.transform(lambda x: x / x.max())
如果你这样做,你应该看到你的成本在足够的迭代中收敛到 ~0。
推荐阅读
- c++ - 如何在透视图中绘制文本
- c - 为什么 printf("value: %f",10/2); 输出 0.000000?
- machine-learning - 如何修复“ValueError:发现样本数量不一致的输入变量:[32979, 21602]”?
- vba - ThisDocument 对象引用
- amazon-web-services - 如何从 Azure DevOps 部署到 AWS Kubernetes
- debugging - Code lite 中的调试器会立即打开和关闭
- bash - 仅在找到时打印文件名
- python - 如何使用递归实现快速排序
- java - 使用 HtmlUnit 2.35.0 进行网页抓取
- angular - :主机样式未在 angular6 中应用