所以我的想法是(借用神经网络人员),如果我有数据集 D,我可以通过首先计算误差相对于参数(a、b 和 c)的导数来拟合二次曲线,然后然后做一个小的更新来最小化错误。我的问题是,下面的代码实际上并不能适应曲线。对于线性的东西,类似的方法是有效的,但二次似乎由于某种原因失败了。你能看到我做错了什么吗(假设或只是实现错误)
编辑:问题不够具体:以下代码不能很好地处理数据偏差。由于某种原因,它以某种方式更新了 a 和 b 参数,而 c 被抛在了后面。这种方法类似于机器人技术(使用雅可比行列式查找路径)和神经网络(根据错误查找参数),因此它不是不合理的算法,现在的问题是,为什么这种特定实现不会产生我期望的结果。
在下面的Python代码中,我使用math作为m,MSE是计算两个数组之间的均方误差的函数。除此之外,代码是独立的
代码:
def quadraticRegression(data, dErr):
a = 1 #Starting values
b = 1
c = 1
a_momentum = 0 #Momentum to counter steady state error
b_momentum = 0
c_momentum = 0
estimate = [a*x**2 + b*x + c for x in range(len(data))] #Estimate curve
error = MSE(data, estimate) #Get errors 'n stuff
errorOld = 0
lr = 0.0000000001 #learning rate
while abs(error - errorOld) > dErr:
#Fit a (dE/da)
deda = sum([ 2*x**2 * (a*x**2 + b*x + c - data[x]) for x in range(len(data)) ])/len(data)
correction = deda*lr
a_momentum = (a_momentum)*0.99 + correction*0.1 #0.99 is to slow down momentum when correction speed changes
a = a - correction - a_momentum
#fit b (dE/db)
dedb = sum([ 2*x*(a*x**2 + b*x + c - data[x]) for x in range(len(data))])/len(data)
correction = dedb*lr
b_momentum = (b_momentum)*0.99 + correction*0.1
b = b - correction - b_momentum
#fit c (dE/dc)
dedc = sum([ 2*(a*x**2 + b*x + c - data[x]) for x in range(len(data))])/len(data)
correction = dedc*lr
c_momentum = (c_momentum)*0.99 + correction*0.1
c = c - correction - c_momentum
#Update model and find errors
estimate = [a*x**2 +b*x + c for x in range(len(data))]
errorOld = error
print(error)
error = MSE(data, estimate)
return a, b, c, error
慕勒3428872
慕姐4208626
随时随地看视频慕课网APP
相关分类