变量多于两个时,线性回归模型就变成了多元线性回归模型:
代价函数为:
线性回归模型的训练(就是用梯度下降法求解最小代价函数)需要注意一些问题:
1.的值
1和
2的值相差太多时,梯度下降法难以收敛
2.学习速率
代价函数应该是递减的,如果代价函数不减反增,那么很可能是学习速率太大,跳过了极小值。
3.代价函数
代价函数必须是凸的,否则一样存在难以收敛的问题
4.过拟合
特征参数选的过多了,也就是n过大,会使模型对于新的数据预测准确性降低。
解决方法:减少特征参数;合并线性相关项;正则化;
多元线性回归模型的求解也可以通过Normal Equation的求解(其实就是通过矩阵变换求解线性方程),求解Normal Equation的好处是不用担心特征参数相差过多,不过变量矩阵必须是可逆的。
参考练习:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex3/ex3.html
x = load('ex3x.dat');
y = load('ex3y.dat');
x = [ones(size(x,1),1) x];
%Normal equation
theta = (x'*x)\x'*y
x1=[1 1650 3];
y=x1*theta
meanx = mean(x);
sigmax = std(x);
x(:,2) = (x(:,2)-meanx(2))./sigmax(2);
x(:,3) = (x(:,3)-meanx(3))./sigmax(3);
figure
itera_num = 100;
sample_num = size(x,1);
alpha = [0.01, 0.03, 0.1, 0.3, 1, 1.3];
plotstyle = {'b', 'r', 'g', 'k', 'b--', 'r--'};
theta_grad_descent = zeros(size(x(1,:)));
for alpha_i = 1:length(alpha)
theta = zeros(size(x,2),1);
Jtheta = zeros(itera_num, 1);
for i = 1:itera_num
Jtheta(i) = (1/(2*sample_num)).*(x*theta-y)'*(x*theta-y);
grad = (1/sample_num).*x'*(x*theta-y);
theta = theta - alpha(alpha_i).*grad;
end
plot(0:49, Jtheta(1:50),char(plotstyle(alpha_i)),'LineWidth', 2)
hold on
end
legend('0.01','0.03','0.1','0.3','1','1.3');
theta = zeros(size(x,2),1);
for i = 1:itera_num
grad = (1/sample_num).*x'*(x*theta-y);
theta = theta - 1.*grad;
end
theta
x2=[1 1650 3];
x2(:,2)=x2(:,2)*sigmax(2)+meanx(2);
x2(:,3)=x2(:,3)*sigmax(3)+meanx(3);
y=x2*theta
参考资料http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=MachineLearning