python - 为什么我的梯度下降算法不起作用?
问题描述
我在 Python 中做了一个梯度下降算法,但它不起作用。我的 m 和 b 值不断增加并且永远不会停止,直到我得到 -inf 错误或在平方错误中遇到溢出。
import numpy as np
x = np.array([2,3,4,5])
y = np.array([5,7,9,5])
m = np.random.randn()
b = np.random.randn()
error = 0
lr = 0.0001
for q in range(1000):
for i in range(len(x)):
ypred = m*x[i] + b
error += (ypred - y[i]) **2
m = m - (x * error) *lr
b = b - (lr * error)
print(b,m)
我希望我的算法能够为我的数据(x 和 y)返回最佳的 m 和 b 值,但它不起作用。出了什么问题?
解决方案
import numpy as np
x = np.array([2,3,4,5])
y = 0.3*x+0.6
m = np.random.randn()
b = np.random.randn()
lr = 0.001
for q in range(100000):
ypred = m*x + b
error = (1./(2*len(x))) * np.sum(np.square(ypred - y)) #eq 1
m = m - lr * np.sum((ypred - y)*x)/len(x) # eq 2 and eq 4
b = b - lr * np.sum(ypred - y)/len(x) # eq 3 and eq 5
print (m , b)
输出:
0.30007724168011807 0.5997039817571881
背后的数学
使用 numpy 向量化操作来避免循环。
推荐阅读
- r - R如何排列数据帧的所有行,以便在列表中返回所有可能的行组合?
- python - Python unix时间戳没有转换但似乎很有价值
- jenkins - Jenkins 工作触发了两次
- excel - 在 VBA 中使用“sumif”和“.formula”和变量
- keycloak - 为什么'id'在keycloak中被称为'sub'?
- javascript - 无法链接 CSS 和 Javascript
- oauth-2.0 - IdentityServer4 丢失登录会话
- gwt - 带有类型化响应的 JsonpRequestBuilder 抛出 InCompatibleClassChangeError
- bash - bash:以编程方式组装列表
- amazon-cloudwatch - 如何确定 Fargate 服务的 Cloudwatch 日志流?