【问题标题】:How to find coefficients in multi-variable gradient descent?如何在多变量梯度下降中找到系数?
【发布时间】:2021-12-19 15:10:32
【问题描述】:

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

# 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()

我看到系数几乎相同,只是看起来像一条线性线-

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

【问题讨论】:

  • plt.plot([min(X), max(X)],[min(Y_pred),max(Y_pred)],color='red', label="MSE") 这段代码只是在两点之间画了一条线:(minX, minY_pred)(maxX, maxY_pred),这就是你要找的吗?不应该是plt.plot(X, Y_pred)之类的吗?
  • @DDomen 是的,我试过了,我仍然得到一条直线......

标签: python linear-regression gradient non-linear-regression coefficients


【解决方案1】:

发现问题了!

您应用的规范化只是弄乱了 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)

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 2017-06-05
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2020-03-23
    • 2016-06-27
    • 1970-01-01
    • 2017-08-05
    相关资源
    最近更新 更多