我刚刚开始学习机器学习,并且一直在尝试将多项式拟合正弦曲线生成的数据。我知道如何以封闭形式进行此操作,但我也在尝试使其与梯度下降一起使用。
但是,即使罚款期非常长,我的体重也达到了疯狂的高度。我究竟做错了什么?
这是代码:

import numpy as np
import matplotlib.pyplot as plt
from math import pi

N = 10
D = 5

X = np.linspace(0,100, N)
Y = np.sin(0.1*X)*50
X = X.reshape(N, 1)


Xb = np.array([[1]*N]).T
for i in range(1, D):
    Xb = np.concatenate((Xb, X**i), axis=1)

#Randomly initializie the weights
w = np.random.randn(D)/np.sqrt(D)

#Solving in closed form works
#w = np.linalg.solve((Xb.T.dot(Xb)),Xb.T.dot(Y))
#Yhat = Xb.dot(w)

#Gradient descent
learning_rate = 0.0001
for i in range(500):
    Yhat = Xb.dot(w)
    delta = Yhat - Y
    w = w - learning_rate*(Xb.T.dot(delta) + 100*w)

print('Final w: ', w)
plt.scatter(X, Y)
plt.plot(X,Yhat)
plt.show()


谢谢!

最佳答案

更新theta时,您必须采用theta并将其减去学习权重乘以theta的导数除以训练集大小所得的值。您还必须将刑期除以训练规模集。但是主要的问题是您的学习率太大。对于以后的调试,打印成本以查看梯度下降是否有效以及学习率是否太小或恰好是有帮助的。

下面是二阶多项式的代码,该代码找到了最佳的theta(如您所见,学习率确实很小)。我还添加了成本功能。

N = 2
D = 2

#Gradient descent
learning_rate = 0.000000000001
for i in range(200):
    Yhat = Xb.dot(w)
    delta = Yhat - Y
    print((1/N) * np.sum(np.dot(delta, np.transpose(delta))))

    w = w - learning_rate*(np.dot(delta, Xb)) * (1/N)

关于python - 权重在梯度下降的多项式回归中爆炸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59850930/

10-12 21:51