机器学习算法分为有监督学习和无监督学习,回归算法属于监督学习一类。本人小白一个,想学习机器学习,以后有新的学习结果,希望都可以写在博客上面,以此来监督自己的学习,如有不对的地方,还希望大家多多谅解,指出错误。
回归算法主要是对已给的数据通过调整参数的手段来使计算结果接近于标签值,但是数据点并非完全都恰好在一条直线上,因此需要有一个来评定调整后的参数的标准,一般使用类似方差的损失函数来评定调整后的参数的好坏,损失函数值越小,说明拟合度越好,越大的话则相反。
评定调整后参数的好坏:
假如该批数据有3个变量x1、x2、x3,一个标签值y,符合一次方程。
对应的参数值是a1、a2、a3
列出函数式 y = a1*x1+a2*x2+a3*x3;
一般我们需要添加一个偏移参数a0来使函数式可以上下移动,可以更好的使函数接近真实情况,则 y =a0+ a1*x1+a2*x2+a3*x3;。
现在如何去评定参数值 a1、a2、a3的好坏,这时就需要去判断这些数据点在进行a0+ a1*x1+a2*x2+a3*x3运算后的y与标签Y的差值,此时就形成了[(y0,Y0),(y1,Y1),(y2,Y2)......(yn,Yn),现在构造损失函数 loss = (y0-Y0)^2+(y1-Y1)^2+(y2-Y2)^2+......+(yn-Yn)^2;
前面说到,损失函数的结果值越小越好,那么现在就想办法使损失函数的值最小。
如何调整参数:批量梯度下降是其中的一种方法,该方法类似高中函数中的知识点,即切点方向是函数上升的最快方向,反方向是函数下降最快的方向。现在loss函数对参数a0、a1、a2、a3分别求导,找出他们使loss下降最快的方向。
方向找到了,现在讨论如何向这个方向移动,一次移动多少,如何调整参数。
现在又有一个叫做步长(学习率)的东西,步长太大会越过最优值,步长太小到达最优值又需要太多的步数。
类似如图的形式:
步长一般需要根据经验来设置,一般设置为0.01;
调整参数的公式为ai = ai - ai*步长,以这种形式分别对a0,a1,a2,a3...an进行调整。
可以设置一个标准使两次调整后的损失在一定范围内时停止调整。
python代码实现:
#y = 1*x1+2*x2+3*x3+4*x4; xi = [(1,2,3,4),(1,2,4,5),(1,1,3,4),(1,2,2,2),(1,2,7,5),(1,7,8,8),(1,22,42,51),(1,21,41,25)]; yi = [30,37,28,19,46,71,375,266]; epsilon = 0.000000001 alpha = 0.00001 a0 = 0 a1 = 0 a2 = 0 a3 = 0 error0 = 0; error1 = 0; # y = a0*xi[0]+ a1*xi[1]+ a2*xi[2]+ a3*xi[3]; ctn=0 # dist = (y - (a0*xi[0]+ a1*xi[1]+ a2*xi[2]+ a3*xi[3]))**2 while True: ctn += 1; for i in range(xi.__len__()): deff = (a0*xi[i][0]+ a1*xi[i][1]+a2*xi[i][2]+ a3*xi[i][3])-yi[i] a0 -= alpha * deff * xi[i][0]; a1 -= alpha * deff * xi[i][1]; a2 -= alpha * deff * xi[i][2]; a3 -= alpha * deff * xi[i][3]; error0 = 0; for i in range(xi.__len__()): error0 += ((a0*xi[i][0]+ a1*xi[i][1]+ a2*xi[i][2]+ a3*xi[i][3])-yi[i])**2; if abs(error1 - error0) < epsilon : break; else : error1 = error0; print "ct" print "ctn: %f, a0: %f,a1: %f, a2:%f a3: %f error0: %f"%(ctn,a0,a1,a2,a3,error0)
结果:
ctn: 143878.000000, a0: 0.998394,a1: 2.000357, a2:2.999860 a3: 4.000003 error0: 0.000012
ct
ctn: 143879.000000, a0: 0.998394,a1: 2.000357, a2:2.999860 a3: 4.000003 error0: 0.000012
ct
ctn: 143880.000000, a0: 0.998394,a1: 2.000357, a2:2.999860 a3: 4.000003 error0: 0.000012
Process finished with exit code 0
a0、a1、a2、a3最后接近下面函数中的参数值。
y = 1*x1+2*x2+3*x3+4*x4;