利用梯度下降的方式求线性回归中参数的一些经验总结

来源:互联网 发布:怎么监测串口数据 编辑:程序博客网 时间:2024/05/21 04:41

这个是coursera里的machine learning课程的作业,在用matlab实现的过程中我总结了一些经验
1. 梯度下降也分成两个部分,一个是cost function的实现,一个是θ的实现
2. 这里要尽量采用向量的计算方法,注意向量的计算方法不是矩阵的计算方法,总结一下向量的计算技巧,什么情况下可以一气计算,什么情况下不行,只能循环计算。微批量处理
matlab的优势就在于他可以像数学计算那样,把批量的数据作为单位一气进行运算,而不是像传统的程序一样只能一个数字一个数字的算,最典型的就是向量和矩阵,在matlab里面是可以以矩阵为单位或者以向量为单位进行计算的。如果你是以向量作为单位来计算的,那么在同一个数学等式里面,你要保证参与运算的数据都是纬度一样的向量。这里多说一句,在《线性代数》同济第五版里面,并没有专门介绍向量的运算法则,只说道一个向量的内积。我觉得可以这样理解,因为向量可以看成一个特殊的矩阵(n行1列的矩阵),那么向量的运算很多都是和矩阵以一样的,其实所谓的内积也是矩阵乘法的一种特殊形式。
3. θj:=θjα1mmi=1(hθ(x(i))y(i))xj(i) 这个式子能不能用向量的方式来进行求解,因为这个式子比较复杂,凭空想难度还是比较高的,因此我们用一个小点数将其具体化来观察它的特点(其实Ng就是利用这种方法来讲课的,一个变量的线性回归)。
我们假设m=3,n=2,那么hypothesis的形式为hθ(x)=θ0+θ1x1+θ2x2。我们要确定的参数为θ=θ0θ1θ2。而系数矩阵X
111x1(1)x1(2)x1(3)x2(1)x2(2)x2(3)
我们先令j=0,看一下θ的迭代式子有什么特点。θ0:=θ0α133i=1(hθ(x(i))y(i))xj(i)。我们把这个求和公式展开,于是θ0:=θ0α13[(hθ(x(1))y(1))x0(1)+(hθ(x(2))y(2))x0(2)+(hθ(x(3))y(3))x0(3)],你可以看到方框号里的这一部分,正好就是向量θTxY与向量x0(1)x0(2)x0(3)的内积。而这个向量x0(1)x0(2)x0(3)正好就是系数矩阵X的第一列,我们可以在matlab里用X(:,1)来表示X矩阵的第一列,对于θ0对应的X矩阵的第一列,也就是0+1,那么我们可以推出来针对每一个θj其取值的式子用向量的形式表示为θj=θjα1m[θTxY,X(:,j+1)]。用代码的形式表示就是

predictions = X * theta ;Err = predictions - y ;theta0 = theta(1) - alpha / m * dot(Err , X(:,1));theta1 = theta(2) - alpha / m * dot(Err , X(:,2));theta = [theta0 ; theta1];

这个仍然是一个一个的计算向量θ的分量,那我能不能一个式子就将θ这个向量算出呢?我们还是用简单具体的例子来观察其中的规律:
θ0=θ0α13[Err,X(:,1)]
θ1=θ1α13[Err,X(:,2)]
θ2=θ2α13[Err,X(:,3)]
把这三个式子合成一个就是θ0θ1θ2=θ0θ1θ2α13ErrX(:,1)ErrX(:,2)ErrX(:,3),如果方括号括住的部分能够用合适的方式(比如说以向量运算或者矩阵运算的方式)一次性的表现出来,那么这个问题就解决了。我们仔细观察一下这一部分,把这个地方细化一下,我令Err=e0e1e2,在ErrX(:,1)ErrX(:,2)ErrX(:,3)中的每一个分量都是Err这个向量和系数矩阵X=111x1(1)x1(2)x1(3)x2(1)x2(2)x2(3)中的一列的进行内积的结果,可以观察出来,ErrX(:,1)ErrX(:,2)ErrX(:,3)其实就是矩阵XT与向量Err的积(这个矩阵乘法),即XTErr,于是将θ向量一次性求出来的式子为

θ=θα1m(XTErr)

于是这个用matlab代码表示为:

    predictions = X * theta ;    Err = predictions - y ;    theta = theta - alpha / m * (X' * Err);