python - 梯度下降曲线拟合
问题描述
我写了一些对几个数据点执行梯度下降的代码。由于某种原因,曲线没有正确收敛,但我不知道为什么会这样。我总是以爆炸的尾巴结束。
我做错了其中一个计算吗?我真的陷入了局部最小值还是其他什么?
这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
def estimate(weights, x, order):
est = 0
for i in range(order):
est += weights[i] * x ** i
return est
def cost_function(x, y, weights, m):
cost = 0
for i in range(m-1):
cost += (((weights[i] * x ** i) - y) ** 2)
return (np.sum(cost ** 2) / ( 2 * m ))
def descent(A, b, iterations, descent_rate, order):
x = A.T[0]
y = b.reshape(4)
# features
ones = np.vstack(np.ones(len(A)))
x = np.vstack(A.T[0])
x2 = np.vstack(A.T[0] ** 2)
# Our feature matrix
features = np.concatenate((ones,x,x2), axis = 1).T
# Initialize our coefficients to zero
weights = np.zeros(order + 1)
m = len(y)
# gradient descent
for i in range(iterations):
est = estimate(weights, x, order).T
difference = est - y
weights = weights + (-descent_rate * (1/m) * np.matmul(difference, features.T)[0])
cost = cost_function(x, y, weights, m)
print(cost)
plt.scatter(x,y)
u = np.linspace(0,3,100)
plt.plot(u, (u ** 2) * weights[2] + u * weights[1] + weights[0], '-')
plt.show()
A = np.array(((0,1),
(1,1),
(2,1),
(3,1)))
b = np.array((1,2,0,3), ndmin = 2 ).T
iterations = 150
descent_rate = 0.01
order = 2
descent(A, b, iterations, descent_rate, order)
我想避免陷入这样的最低限度。我尝试将初始权重设置为随机值,但无济于事,有时它会下降一点,但随后又给了我相同的行为。
这是通过最小二乘解获得的预期结果:
解决方案
推荐阅读
- python - find_peaks() 把峰放在了正确的地方,但是把图挤到了左边
- android - 无法在 Android 10 设备上使用 ADB shell 将应用程序设置为设备所有者 (DO)
- r - 如何处理效果函数中的 NA 值?
- awk - awk 行大于特定值并在输出中包含文件名
- java - OpenCV Android Studio Java IP 摄像头未连接
- c# - EF Core:删除迁移中意外创建的列
- javascript - 在 JavaScript 中使用 _("divId") 作为 HTML 选择器无法按预期工作。我如何让它按预期工作?
- regex - 使用 sed 在匹配“xyz”之前将所有出现的 X 替换为 Y
- javascript - 在加载时禁用 Angular2 多选下拉选项
- azure - 具有多租户应用程序模式的 Microsoft Azure 目录