Regularized Linear Regression and Bias v.s. Variance
1 对线性回归进行正则化
1.1观察数据
训练集X为12x1的向量,交叉验证集(CV)为21x1,测试集为21x1。
1.2正则化线性回归的代价函数
公式如上,其中h=x0*θ0 +X1*θ1,这里不太理解的是线性函数为什么要正则化。
打开linearregcostfunction.m文件,输入以下程序
%X = [ones(m,1),X];
h = X * theta;
J = 1/(2 * m)* sum((h - y).^2) + lambda/(2*m)*sum(theta.^2) - lambda/(2*m)*sum(theta(1,:).^2);
以上程序。注意X参数在传入这个函数时已经加偏置(1)了,在ex5.m文件中可查看。
1.3正则化的线性回归梯度
公式
在linearregcostfunction.m中加入以下程序
grad = (1/m*sum(repmat((h-y),1,size(X,2)).*X))';
grad = grad+lambda/m*theta;
grad(1) = grad(1) - lambda/m*theta(1);
以上程序
1.4 线性拟合
2偏差-方差
当模型出现高偏差时会产生欠拟合,出现高方差时会产生过拟合。用学习曲线画出训练集和测试集的误差来进行判断。
2.1学习曲线
打开learningcurve.m文件输入以下代码
for i = 1:m
theta = trainLinearReg(X(1:i,:),y(1:i),lambda);
[error_train(i),w] = linearRegCostFunction(X(1:i,:),y(1:i),theta,0);
[error_val(i),w2] = linearRegCostFunction(Xval,yval,theta,0);
end
以上代码
注意使用trainLinearReg函数求theta时lambda要使用传入的参数,而linearRegCostFunction函数的lambda要用0传过去,否则提交的script会计算错误导致不得分。
训练集要以当前训练量m来算theta和J,所以在循环体中用X(1:i,:),y(1:i)这两个参数。而验证要用全部验证集验证。
因为是线性的假设函数,对于本数据集无法较好的拟合,所以出现当m加大时,训练集和验证集的误差都很大也挺接近,也就是欠拟合,高偏差。
3多项式回归
假设函数为
其中x1 = (waterLevel); x2 = (waterLevel)^2; xp =(waterLevel)^p
打开polyFeatures.m文件加入以下代码
m = size(X,1);
for i = 1:m
for j = 1:p
X_poly(i,j) = X(i).^j;
end
end
以上代码
3.1学习多项式回归
3.2调整正则化参数
这两节都不用添加代码,也没有注意去看。
3.3用验证集来选择lambda。
打开validationcurve.m文件输入以下代码
m = size(X,1);
mcv = size(Xval,1);
%X = (ones(:,1),X);
for i = 1:length(lambda_vec)
lambda = lambda_vec(i);
theta = trainLinearReg(X,y,lambda);
h = X * theta;
J = 1/(2 * m)* sum((h - y).^2) + lambda/(2*m)*sum(theta.^2) - lambda/(2*m)*sum(theta(:,1).^2);
error_train(i) = J;
hcv = Xval * theta;
Jcv = 1/(2 * mcv)* sum((hcv - yval).^2) + lambda/(2*mcv)*sum(theta.^2) - lambda/(2*mcv)*sum(theta(:,1).^2);
error_val(i) = Jcv
end
以上代码
3.4 3.5都没看
可提交代码