监督机器学习问题无非就是在规则化参数的同时最小化误差。最小化误差是为了让我们的模型拟合我们的训练数据,而规则化参数是防止我们的模型过分拟合我们的训练数据。因为参数太多,会导致我们的模型复杂度上升,容易过拟合,也就是我们的训练误差会很小。但训练误差小并不是我们的最终目标,我们的目标是希望模型的测试误差小,也就是能准确的预测新的样本。所以,我们需要保证模型“简单”的基础上最小化训练误差,这样得到的参数才具有好的泛化性能(也就是测试误差也小),而模型“简单”就是通过规则函数来实现的。
本文参考的资料参考网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex5/ex5.html 主要是给定7个训练样本点,需要用这7个点来模拟一个5阶多项 式。主要测试的是不同的regularization参数对最终学习到的曲线的影响。
模型表达式为:
代价函数:
模型的normal equation求解为:
实验实现
%加载数据
数据下载: ex5Data.zip
http://openclassroom.stanford.edu/MainFolder/courses/MachineLearning/exercises/ex5materials/ex5Data.zip
X = load('ex5Linx.dat');
y = load('ex5Liny.dat');
%显示原始数据
plot(X,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r');
分别对lamda=0,1,10三种情况下拟合,结果如下:
可以看出,当lambda=1时,模型最好,不容易产生过拟合现象,且有对原始数据有一定的模拟。
实验主要代码如下:
%参照斯坦福大学提供的练习题
%Exercise: Regularization
%http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex5/ex5.html
clc
clear all
close all
%加载数据
X = load('ex5Linx.dat');
y = load('ex5Liny.dat');
%显示原始数据
plot(X,y,'o','MarkerEdgeColor','b','MarkerFaceColor','r');
x = [ones(length(X), 1), X, X.^2, X.^3, X.^4, X.^5];
[m,n]=size(x);
diag_r=diag([0; ones(n-1,1)]);
lamda=[0,1,10];
sida=zeros(n,3);
X=linspace(min(X),max(X))';
X1 = [ones(size(X)), X, X.^2, X.^3, X.^4, X.^5];
for i=1:3 %求得参数sida,最后是一个n*3的矩阵
sida(:,i)=inv(x'*x+lamda(:,i)*diag_r)*x'*y;
norm_sita=norm(sida);
end
Y=X1*sida; %向量化求得Y的值,无需放在for循环里
hold on
plot(X,Y(:,1),'r--')%lamda=0的情况
plot(X,Y(:,2),'g--')%lamda=1的情况
plot(X,Y(:,3),'b--')%lamda=10的情况
legend('traning data', '\lambda=0', '\lambda=1','\lambda=10')%注意转义字符的使用方法
hold off