我正在尝试通过多元线性回归和L2范数作为损失函数来实现随机梯度的基本方法。
结果可以在这张照片中看到:
它离理想回归线还很远,但是我真的不明白为什么会这样。我仔细检查了所有数组的尺寸,它们似乎都适合。
下面是我的源代码。如果有人能看到我的错误或给我提示,我将不胜感激。
def SGD(x,y,learning_rate):
theta = np.array([[0],[0]])
for i in range(N):
xi = x[i].reshape(1,-1)
y_pre = xi@theta
theta = theta + learning_rate*(y[i]-y_pre[0][0])*xi.T
print(theta)
return theta
N = 100
x = np.array(np.linspace(-2,2,N))
y = 4*x + 5 + np.random.uniform(-1,1,N)
X = np.array([x**0,x**1]).T
plt.scatter(x,y,s=6)
th = SGD(X,y,0.1)
y_reg = np.matmul(X,th)
print(y_reg)
print(x)
plt.plot(x,y_reg)
plt.show()
编辑:另一种解决方案是使用x = np.random.permutation(x)
答案 0 :(得分:2)
为了说明我的评论,
def SGD(x,y,n,learning_rate):
theta = np.array([[0],[0]])
# currently it does exactly one iteration. do more
for _ in range(n):
for i in range(len(x)):
xi = x[i].reshape(1,-1)
y_pre = xi@theta
theta = theta + learning_rate*(y[i]-y_pre[0][0])*xi.T
print(theta)
return theta
SGD(X,y,10,0.01)
产生正确的结果