如何在多变量梯度下降中找到系数?
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)
我需要自己实现梯度下降。我的任务是创建一个任意函数,向其添加噪声,然后找到该函数的系数值。所以首先,我创建了一个函数并创建了一些随机值:
# 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)