线性回归其实就是寻找一条直线拟合数据点,使得损失函数最小。直线的表达式为:
如上图所示,只要自变量 x 沿着负梯度的方向变化,就可以到达函数的最小值了,反之,如果沿着正梯度方向变化,就可以到达函数的最大值。
我们要求解 J 函数的最小值,那么就要求出每个 ω 的梯度和 b 的梯度,由于梯度太大,可能会导致自变量沿着负梯度方向变化时, J 的值出现震荡,而不是一直变小,所以在梯度的前面乘上一个很小的系数 α 。
由以上可以总结出 ω 和 b 的更新公式:
x = np.arange(-2,2,0.1)
y = 2*x+np.random.random(len(x))
x = x.reshape((len(x),1))
y = y.reshape((len(x),1))
开始迭代:
for i in range(maxgen):
alpha = 1/float(i+1)+alpha0
e = np.dot(x,seta.reshape((len(seta),1)))+b-y # 二维列向量
mse = np.linalg.norm(e)
delta_seta = np.dot(e.T,x)[0]
delta_seta_norm = np.linalg.norm(delta_seta)
b = b-alpha*np.sum(e)
seta = seta-alpha*delta_seta
print u'迭代次数:',i
print u'梯度:',delta_seta_norm,'seta',seta,'b:',b,'mse',mse
print 'alpha:',alpha,'sum(e):',sum(e)