如何在多变量梯度下降中找到系数?

How to find coefficients in multi-variable gradient descent?

我需要自己实现梯度下降。我的任务是创建一个任意函数,向其添加噪声,然后找到该函数的系数值。所以首先,我创建了一个函数并创建了一些随机值:

# Preprocessing Input data
function = lambda x: x ** 2 +(x)+1 
X=[]
Y=[]
for i in range(-100,100):
  X.append(i)
  Y.append(function(i) + random.randrange(-10,10)

然后我将值归一化-

maxVal = np.max(np.hstack((X,Y)))
X = X/maxVal 
Y = Y/maxVal

X= np.asarray(X)
Y= np.asarray(Y)

这是我的梯度下降代码,使用导数求系数

w1Arr = []
w2Arr = []
bArr = []
lossArr = []

for i in range(epochs):
  Y_pred =w1*np.square(X)+w2*X+b

  D_w1 = (-2/n) * sum( np.square(X) * (Y - Y_pred))  # Derivative for w1

  D_w2 = (-2/n) * sum(X * (Y - Y_pred))  # Derivative for w2

  D_b = (-2/n) * sum(Y - Y_pred)        # Derivative for b

  w1 = w1 - L * D_w1  # Update w1
  w2 = w2 - L * D_w2  # Update w2
  b = b - L * D_b  # Update b

  loss = sum((Y - Y_pred) * (Y - Y_pred)) #MSE
  w1Arr.append(w1)
  w2Arr.append(w2)
  bArr.append(b)
  lossArr.append(loss)

当我尝试绘制结果时:

# Making predictions
Y_pred = w1*(np.square(X))+w2*X+b
#print(Y_pred)
plt.scatter(X, Y)
plt.plot(X, Y_pred) # predicted
plt.legend()
plt.show()

我看到系数几乎相同,看起来就像一条直线-

我几乎被卡住了,不知道我的代码有什么问题或如何修复它。 我在网上寻找解决方案,但找不到任何解决方案。 任何帮助将不胜感激。

找到问题了!

您应用的规范化只是弄乱了 x 和 y 之间的关系,特别是您在 codomain 方面扭曲了域:

maxVal = np.max(np.hstack((X,Y)))
X = X/maxVal 
Y = Y/maxVal

去掉归一化你会发现你可以学习系数

如果你真的想要,你可以标准化两个轴,但它们必须是两个比例值:

X = X / np.max(X)
Y = Y / np.max(Y)