Machine learning 使用带有未知常数项的二次函数,如何使用梯度下降法找到这些未知常数?

Machine learning 使用带有未知常数项的二次函数,如何使用梯度下降法找到这些未知常数?,machine-learning,deep-learning,gradient-descent,derivative,Machine Learning,Deep Learning,Gradient Descent,Derivative,各位 我是机器学习的初学者,现在就开始学习梯度下降。然而,我有一个大问题。下面的问题是这样的: given numbers [0,0],[1,1],[1,2],[2,1] and equation will be [ f=(a2)*x^2 + (a1)*x + a0 ] 通过手工求解,我得到了答案[-1,5/2,0] 但是,通过使用这些给定的数据生成具有梯度下降的python代码,很难找到解决方案 在我的例子中,我尝试用梯度下降法编写一个代码,最简单、最快的方法如下: learningRa

各位

我是机器学习的初学者,现在就开始学习梯度下降。然而,我有一个大问题。下面的问题是这样的:

given numbers [0,0],[1,1],[1,2],[2,1] and 
 equation will be [ f=(a2)*x^2 + (a1)*x + a0 ]
通过手工求解,我得到了答案
[-1,5/2,0]
但是,通过使用这些给定的数据生成具有梯度下降的python代码,很难找到解决方案

在我的例子中,我尝试用梯度下降法编写一个代码,最简单、最快的方法如下:

learningRate = 0.1

make **a series of number of x

initialize given 1,1,1 for a2,a1,a0

partial derivative for a2,a1,a0 (a2_p:2x, a1_p:x, a0_p:1)

gradient descent method : (ex) a2 = a2 - (learningRate)( y - [(a2)*x^2 + (a1)*x + a0] )(a2_p)
另外,老实说,我不知道我应该放什么“
x”和“y”或者a2,a1,a0

然而,我每次都得到了不同结果的错误答案。 所以,我想得到一个关于正确等式或代码序列的提示


感谢您阅读我的最低级别问题。

您的公式中有一些错误

对于函数
f(x)=a2*x^2+a1*x+a0
a2
a1
a0
的偏导数分别为
x^2
x
1

假设成本函数
(1/2)*(y-f(x))^2

成本函数的偏导数关于
ai
-(y-f(x))*f(x)对ai
的偏导数,其中
i
属于
[0,2]

因此,梯度下降方程是:
ai=ai+learning_rate*(y-f(x))*f(x)对ai的偏导数,其中
i
属于
[0,2]

我希望这段代码能有所帮助

#Training sample
sample = [(0,0),(1,1),(1,2),(2,1)]

#Our function => a2*x^2+a1*x+a0
class Function():
    def __init__(self, a2, a1, a0):
        self.a2 = a2
        self.a1 = a1
        self.a0 = a0
    
    def eval(self, x):
        return self.a2*x**2+self.a1*x+self.a0
    
    def partial_a2(self, x):
        return x**2
    
    def partial_a1(self, x):
        return x
    
    def partial_a0(self, x):
        return 1

#Initialise function
f = Function(1,1,1)

#To Calculate loss from the sample
def loss(sample, f):
    return sum([(y-f.eval(x))**2 for x,y in sample])/len(sample)

epochs = 100000
lr = 0.0005
#To record the best values
best_values = (0,0,0)

for epoch in range(epochs):
    min_loss = 100
    for x, y in sample:
       #Gradient descent
       f.a2 = f.a2+lr*(y-f.eval(x))*f.partial_a2(x)
       f.a1 = f.a1+lr*(y-f.eval(x))*f.partial_a1(x)
       f.a0 = f.a0+lr*(y-f.eval(x))*f.partial_a0(x)
    
    #Storing the best values
    epoch_loss = loss(sample, f)
    if min_loss > epoch_loss:
        min_loss = epoch_loss
        best_values = (f.a2, f.a1, f.a0)
       
print("Loss:", min_loss)
print("Best values (a2,a1,a0):", best_values)
输出

Loss: 0.12500004789165717
Best values (a2,a1,a0): (-1.0001922562970325, 2.5003368582261487, 0.00014521557599919338)

谢谢你的好意和帮助!然而,我不得不问你们关于弹出式问题的答案。首先,如果我有这样或更多的多变量,我必须考虑x^n。分别计算未知常数项的x^n-1…1?第二,谢谢你的帮助,现在我理解了成本函数和损失的必要概念,但仍然没有理解它们,例如“样本和总和的损失意味着什么?”,“为什么最小损失=100?”,第三,如果没有为最佳值查找器设置条件,那么在这种情况下会发生什么?再次感谢您的帮助!这是一个随机梯度下降,其中每个点的损失被发现,并进行更新。我还记录了样本的平均损失,作为检查每个历元性能的指标。它不会干扰梯度下降。min_损失可以初始化为任意大的数字,我只选择了100。在梯度下降过程中,如果学习速率较大,则值可能超过最小值,因此为了以最小成本捕获值,我将它们记录为最佳值。现在,我可以理解您的代码了!谢谢你的额外建议!