机器学习基本算法之多项式回归算法
简单的多项式
引用自斯坦福大学吴老师机器学习课程中讲解的例子。估计房价的时候,倘若有房子的长度(length)和宽度(width)两个特征,即占地面积的宽度和占地面积的长度,我们完全可以把这两个特征乘起来生成一个新的占地面积特征(Area)。
***Area = length * width**那么就可以只用Area这一个变量作为模型的特征。通过选择合适的特征,构建简单的多项式,hθ(x) = θ0 + θ1x 。x即面积Area。
一般多项式
假如有部分住房价格数据集点是以下点:
为了拟合数据,会有多种解决问题的模型。显然线性的函数是拟合不出这样的效果,它只能你和线性区分度高的数据集,参考下图即可了解线性回归函数的缺点:
不过可以选用二次函数模型,但是知道二次函数图像的都知道,开口朝下的二次函数,顶点是最高的,之后便会下来,这明显和我们现实生活中的房价背道而驰(房价不会高到一定程度后下降趴)。
因此我们会转而使用另一种模型,比如三次函数模型使用多元线性回归的方法,可以将我们的模型进行简单的修改。
假设我们使用三次函数作为选用的模型。按照以前的假设形式(hθ(x) = θ0 +θ1x1 +θ2x2 +θ3x3),自定义 θ0、θ1、和θ2。
特征值乘方之后值会很大,因此要一定要特征缩放 !!!
上述文字和图片基本都是课程里面所讲述的。
多项式回归算法实现
梯度下降函数和计算损失值函数的m文件就是上个博客写的,不再赘述。
自己生成满足正态分布的一个列向量,之后计算出适合多项式回归算法的y值。为了避免重,每个值再加上随机噪声(数据集没找到,所以自己生成了)。下面是多项式回归算法实现的m文件:
function [ ] = polynomial_regression( )
x=randn(100,1); %随机生成一个满足正态分布的100*1的列向量
y=0.5*x+x.^2+randn(100,1); %加上随机噪声
plot(x,y,'ko');
x=[ones(100,1),x];
d_x=sort(x);
l_x=d_x;
i=1;
j=2;
while i<=1, %i表示往矩阵第二列后面加的列数
x(:,i+2)=x(:,i+1).*x(:,2); %后面的每一列都乘上第一列的数
i=i+1;
end;
while j<=3,
x(:,j)=(x(:,j)-mean(x(:,j)))./std(x(:,j)); %因为特征值乘方之后值会很大,因此要特征缩放
j=j+1;
end;
theta=[0 0 0];
theta_new=gradient_decline(x,y,theta); %因为是随机种子生成的特征矩阵,所以每次loss达到的最低值都会不一样
hold on;
d_y=theta_new(1)+theta_new(2)*d_x+theta_new(3)*d_x.*d_x;
l_y=theta_new(1)+theta_new(2)*d_x+theta_new(3)*d_x;
plot(d_x,d_y);
title('fitted curve');
legend('data point','polynomial regression');
end
结果:
损失函数(因为是随机种子,所以每次运行得到的最低loss值都会不一样,迭代次数也会变化。这个问题困扰我许久,现在想想有点zz的):
Matlab最后一条竖线暂时不知道那里出来的,知道的大佬告诉我一声哈。
线性回归算法和多项式回归算法比较
脚本代码:
d_x=sort(x);
l_x=d_x;
d_y=theta_new(1)+theta_new(2)*d_x+theta_new(3)*d_x.*d_x;
l_y=theta_new(1)+theta_new(2)*d_x+theta_new(3)*d_x;
plot(d_x,d_y);
plot(l_x,l_y);
title('fitted curve');
legend('data point','polynomial regression','line regression');
结果:
结论
较准确,快速!希望大家多多支持、推广,感谢大家!!!