一个最简单的线性拟合
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