python - 使用 NumPy 进行 LMS 批量梯度下降

标签 python numpy linear-regression least-squares gradient-descent

我正在尝试编写一些非常简单的 LMS 批量梯度下降,但我相信我在梯度方面做错了。 theta 的数量级与初始值之间的比率对于 theta 的元素来说非常不同,因此 theta[2] 都不会t 移动(例如,如果 alpha = 1e-8)或 theta[1] 发射(例如,如果 alpha = .01)。

import numpy as np

y = np.array([[400], [330], [369], [232], [540]])
x = np.array([[2104,3], [1600,3], [2400,3], [1416,2], [3000,4]])
x = np.concatenate((np.ones((5,1), dtype=np.int), x), axis=1)
theta = np.array([[0.], [.1], [50.]])
alpha = .01

for i in range(1,1000):
    h = np.dot(x, theta)
    gradient = np.sum((h - y) * x, axis=0, keepdims=True).transpose()
    theta -= alpha * gradient
    print ((h - y)**2).sum(), theta.squeeze().tolist()

最佳答案

所写的算法是完全正确的,但如果没有特征缩放,收敛速度将非常慢,因为一个特征将控制梯度计算。

您可以通过多种方式执行缩放;现在,让我们按照 L^1 规范来缩放特征,因为这很简单

import numpy as np
y = np.array([[400], [330], [369], [232], [540]])
x_orig = np.array([[2104,3], [1600,3], [2400,3], [1416,2], [3000,4]])
x_orig = np.concatenate((np.ones((5,1), dtype=np.int), x_orig), axis=1)
x_norm = np.sum(x_orig, axis=0)
x = x_orig / x_norm

也就是说,x 中每列的总和为 1。如果您想保留对正确参数的正确猜测,则必须相应地缩放这些参数。

theta = (x_norm*[0., .1, 50.]).reshape(3, 1)

有了这个,我们可以像您在原始帖子中所做的那样继续,您将再次调整学习率,直到找到最佳点。

alpha = .1
for i in range(1, 100000):
    h = np.dot(x, theta)
    gradient = np.sum((h - y) * x, axis=0, keepdims=True).transpose()
    theta -= alpha * gradient

既然我们发现了一些似乎收敛的东西,那么让我们看看我们得到了什么。同样,您的参数必须进行缩放以与原始未缩放的特征相关。

print (((h - y)**2).sum(), theta.squeeze()/x_norm)
# Prints 1444.14443271 [ -7.04344646e+01   6.38435468e-02   1.03435881e+02]

现在,让我们作弊并检查我们的结果

theta, error, _, _ = np.linalg.lstsq(x_orig, y)
print(error, theta)
# Prints [ 1444.1444327] [[ -7.04346018e+01]
#                         [  6.38433756e-02]
#                         [  1.03436047e+02]]

关于特征缩放的一般介绍性引用是 this Stanford lecture .

关于python - 使用 NumPy 进行 LMS 批量梯度下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44249466/

相关文章:

python - 向下传递参数的递归函数

python - 将 python stdout 重定向到文件失败并出现 UnicodeEncodeError

python - 使用 numpy 数组作为另一个数组的第二个维度的索引?

python - Pandas 在 python Pandas 数据框中获取两行之间交集的方法

r - 如何使用 R 中的 lm() 函数从回归中删除无关紧要的因子水平?

Python scikit-学习 : Why is my LinearRegression classifier's score so low?

Python3插入排序向后迭代不起作用

python - 添加具有货币格式的变量以及搜索列表的最佳解决方案

python - 除了一只 Pandas ,所有行总和

python - 多元线性回归 python