exercise1

一个最简单的线性拟合

1.单位矩阵,使用eye函数实现

2.绘制曲线,使用plot函数,颜色线条及其使用案例在点击打开链接点击打开链接

3.实现线性分类器。

原理:y = w * x+b。

现在所有的元素都是矩阵,将x增加常数列为1,表示常数项b

将等式缩减为 y = w * x

所取得的变量中,x为97*2,y为97*1。

调参过程:

参数调整的目的是使得建模更加效果好,就是预测值和实际值的差别越小越好。在线性分类器中,这个是用损失进行衡量的。如何找到最小的损失,就是要使用求导方法。将损失变成一个函数式,求导过程中不断调整参数。


用这个式子进行调整,含义是在每一次递归过程中,每一次参数都下降a倍现在导数的平均。在实际实现的过程中需要注意的是,在每次循环中使用的计算量是上次的不是刚刚得到的。

具体实现如下:

function thetaNew = gradientDescent(X, y, theta, alpha, iterations)
%GRADIENTDESCENT Summary of this function goes here
%   Detailed explanation goes here
m=size(X,1);
thetaOld=theta;
thetaNew=theta;
for i=1:iterations
    for j=1:size(theta,1)
    	thetaNew(j,1)=thetaOld(j,1)-alpha/m*sum((X*thetaOld-y).*X(:,j));
    end
    if (abs(thetaNew-thetaOld)<0.01*thetaOld)
        break;        
    end
    thetaOld=thetaNew;
end
end


在其他的参考资料里面,theta不是用循环处理的,是展开一个个处理的。我认为用循环要简单一些,所以采用的是循环。退出的判断条件可以改成其他的。

这样对于一个属性的计算就结束了。之后我们解决多个属性的变量建模。

首先接触一个概念就是“归一化”。

归一化用于属性的数值相差非常大的一种情况。比如,在这里房子的单价就是面积的成千或者成万倍,这时候在建模的过程中,面积很可能会被忽略。所以这个时候将所有的数据变成0-1范围内的值。


使用repmat函数进行简化运算。函数的含义就是将第一个参数矩阵重复第二个参数行,第三个参数列。这样就避免了使用循环。

之后进行梯度下降优化参数,并且在每次迭代的过程中打印cost。

最后使用normalEqu方法直接求得导数为0的地方,也可以得到最优参数。这适用于矩阵规模比较小,容易计算的情况。

剩下的没有技术含量的就略去不提了。

源代码地址:http://download.csdn.net/detail/yinyanting1/9905369


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章