导数
先了解导数,也就是梯度
解释梯度:y=f(x)
x=2(随机取一个值),然后x变化了△x(趋向于0),y值变化了△y,△y除以△x 就是x=2的梯度。当x等于一个值,对应的梯度为0,
代表了y到了该函数的极大值或者极小值。
举例
函数y=x*x ,梯度(也就是导数,高中学过求导函数)y=2x
当x=2,x变化了0.1(△x=0.01),x=2的导数为((2+0.1)*(2+0.1)-2*2)/((2+0.1)-2)=4.1 约等于4,跟导数y=2x计算的结果接近,△x越小越接近。
x在某一点的导数值代表了,切线的陡与缓。值趋向于0,代表了,y也就是目标值到了极大值或者极小值。
线性回归开始
w=4;//预设置权重
x_data=[1,2,3];
y_data=[2,4,6];
1、定义前向传播函数,也就是数学模型, 比如 y=w*x;
def forword(x){return w*x;}
2、定义损失函数,使用设置的w权重,计算出来实际样例数据与模型计算出来的数据取差值的平方和,然后取平均
def cost(xs,ys){costval = 0;for x,y in zip(xs,ys){y_pred = fowrod(x);costval=costval+(y_pred-y)**2;//计算出来实际样例数据与预测出来的数据,取差值的平方和,存储到变量costval}return costval / len(xs);}
3、定义计算梯度的函数。这里的因变量是w,相当于y=f(x)中的x。
导函数为 2*x*(x*w-y)。使用真实数据,灌入梯度函数,求出来平均梯度。
当平均梯度越小,一般情况第二步的损失函数的值也越小(除非数据与模型严重不吻合),梯度越小,代表了,变化量越小,差值越小。grandint得到的值越小,w的取值,使损失函数的值越小,偏差越小,越吻合模型。
def grandint(xs,ys):grad=0for x,y in zip(xs,ys):grad=grad+2*x*(x*w-y)return grad/len(xs)
4、训练,训练100轮
for i in range(100):cost_val=cost(x_data,y_data)grad_val=gradient(x_data,y_data)w=w-0.1*grad_val;//0.1为步长