机器学习基本算法之正则化技术
本文图片都是吴恩达的机器学习课程上的截图。
数据集下载
前几篇文章的数据集下载连接:
click
提取码:3ryg
线性回归模型 正则化
下图中的第一个曲线:拟合效果并不理想,这种数据集的分布用线性的回归函数并不好,而应当采用多项式的回归函数。
下图中的第二个曲线:在当前数据看来,拟合效果可以说是非常精确了,而且就算增加数据点,该回归函数在这个模型表现上应该也不错。
下图中的第三个曲线:尽管在当前数据看来,这条回归函数的曲线经过了所有点。但是一旦加多数据点,该模型的拟合能力可能会表现得很糟糕,造成这种情况出现最本质的原因是数据量少,而回归函数的特征点多。这必然导致回归函数过拟合,使得模型的泛化能力不强,根本无法迁移到针对新的size,预测房价上面去。
lambda选取的太大,也会导致测试集上的loss值偏大。
costFunctionJ_regression.m文件修改:
...
lambda=80; %自定义系数,尽量大,但也不能太大
theta_square=theta.^2;
regularization=lambda*sum(theta_square(2:end)); %正则化的偏置项
J=1/(2*m)*(sum(sqrErrors)+regularization);
grad=(x*theta-y)'*x+theta'*lambda;
...
效果:
逻辑回归模型 正则化
下图中的第一个曲线:拟合效果并不理想。
下图中的第二个曲线:在当前数据看来,拟合效果可以说是非常精确了,而且就算增加数据点,该回归函数在这个模型表现上应该也不错。
下图中的第三个曲线:尽管在当前数据看来,这条回归函数的曲线经过了所有点。但是一旦加多数据点,该模型的拟合能力可能会表现得很糟糕。
costFunctionJ_classification.m文件修改:
...
lambda=80;
theta_square=theta.^2;
J=1/m*sum(-y.*(log(sigmoid(x*theta))-(1-y).*log(1-sigmoid(x*theta))))+lambda/(2*m)*sum(theta_square(2:end));
grad =(sigmoid(x*theta)-y)'*x+lambda/m*theta';
...
效果:
原理简述
解决过拟合的方法
1、减少特征点数量;
2、引入正则化技术。
代码 简述
因为我们不知道要将具体哪几个特征点的权重给放缩到很小,因此我们采用将所有的权重点都给缩放。缩放方式就是在权重点集的前面乘以一个较大的lambda的常量再除以2*样本的个数,loss函数里面加上刚刚的结果。我们也可以随时调节其大小来影响最后的效果。
梯度下降法里面就根据loss函数对权重求偏导推导即可。
线性回归的正规方程实现
line_regression.m文件:
function theta_new = line_regression( )
x=load('D:\machineLearning\线性回归\ex3Data\ex3x.dat');
y=load('D:\machineLearning\线性回归\ex3Data\ex3y.dat');
n=length(x(1,:));
m=length(x(:,1)); %样本数
x(:,1)=(x(:,1)-mean(x(:,1)))./std(x(:,1)); %特征缩放 mean表示某个特征值中的平均值,std表示某个特征值中的标准差(除数也可以是max-min)
x(:,2)=(x(:,2)-mean(x(:,2)))./std(x(:,2));
d_x1=-2:0.1:6;
d_x2=-2:0.1:6;
x=[ones(m,1), x]; %x0为1
plot3(x(:,2),x(:,3),y,'r*');
hold on;
theta=[0 0 0];
theta_new=pinv(x'*x)*x'*y; %正规方程
d_y=theta_new(1)+theta_new(2)*d_x1+theta_new(3)*d_x2;
plot3(d_x1, d_x2, d_y, 'k');
title('fitted curve');
end
效果:
线性回归的正规方程 正则化技术实现
样本数小于等于特征数只是X的转置矩阵乘以X矩阵不可逆的充分条件,证明如下:
line_regression.m文件:
function theta_new = line_regression( )
x=load('D:\machineLearning\线性回归\ex3Data\ex3x.dat');
y=load('D:\machineLearning\线性回归\ex3Data\ex3y.dat');
n=length(x(1,:));
m=length(x(:,1)); %样本数
lambda=80;
x(:,1)=(x(:,1)-mean(x(:,1)))./std(x(:,1)); %特征缩放 mean表示某个特征值中的平均值,std表示某个特征值中的标准差(除数也可以是max-min)
x(:,2)=(x(:,2)-mean(x(:,2)))./std(x(:,2));
d_x1=-2:0.1:6;
d_x2=-2:0.1:6;
x=[ones(m,1), x]; %x0为1
plot3(x(:,2),x(:,3),y,'r*');
hold on;
theta=[0 0 0];
temp=zeros(n+1);
temp(1,1)=1;
p=eye(n+1)-temp;
theta_new=pinv(x'*x+lambda*p)*x'*y; %正规方程 正则化技术
d_y=theta_new(1)+theta_new(2)*d_x1+theta_new(3)*d_x2;
plot3(d_x1, d_x2, d_y, 'k');
title('fitted curve(after Regularization)');
end
效果:
总结
正则化技术就是应用于特征选择上,选出影响因子大的特征点集。纯属小白个人见解,有问题希望大家指出,多多指教!!!