吴恩达机器学习ex1-matlab版学习总结笔记-(1)单变量线性回归

作业任务项一:5*5矩阵A

代码如下:

A=eye(5);

eye()是单位矩阵,除了对角线为1,其余项都为0。5为矩阵维度,即生成5*5矩阵。

作业任务项二:单变量线性回归预测

代码如下:

data=load('E:\研究生\机器学习\吴恩达机器学习python作业代码\code\ex1-linear regression\ex1data1.txt');
x=data(:,1);y=data(:,2);
m=length(y);
plot(x, y, 'rx', 'MarkerSize', 10); % Plot the data
ylabel('Profit in $10,000s'); % Set the y?axis label
xlabel('Population of City in 10,000s');% Set the x?axis label

其中load()中的参数为文件所在位置,可在根目录下复制。上述代码可绘出原始数据的图,rx表示红色和叉图形,markersize表示了整个标记的大小,如下图1所示:
图1 原始数据图像

图1 原始数据图像

下面进行预测部分,由于是单变量线性回归,因此设 y = θ 0 + θ 1 x y=\theta_0+\theta_1x y=θ0+θ1x,因此 θ \theta θ有两项,是一个2*1的矩阵,同时X需要在开头加上一列全为1的列向量,此时方程可以表示为矩阵形式: y = X ∗ t h e t a y=X*theta y=Xtheta

X = [ones(m, 1), data(:,1)]; % Add a column of ones to x
theta = zeros(2, 1); % initialize fitting parameters
iterations = 1500;
alpha = 0.01;
J=computeCost(X,y,m,theta);
[theta,J_history]=gradientDescent(X,y,theta,alpha,iterations,m);
hold on
y1=X*theta;
% xt=input('population number:');
% predict1 = [1, xt]*theta;
% fprintf('the profit is:%s',predict1);
plot(x,y1,'b');
hold on
% plot(xt,predict1,'gx' ,'MarkerSize', 15);
legend('Training data','linear regression','location','southeast')

其中被注释掉的部分可以用于预测,输入xt,得到predict1,并用绿色叉行标记,大小为15 。输入xt=17,得到predict结果为1.619787e+01,结果如图2所示。

其中computeCost.m如下:

公式为 J = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J=\frac1{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 J=2m1i=1m(hθ(x(i))y(i))2,其中 h θ ( x ( i ) ) = y 1 h_\theta(x^{(i)})=y_1 hθ(x(i))=y1

function J = computeCost(X,y,m,theta)
J=0;
J=1/(2*m)*sum(((X*theta)-y)'*((X*theta)-y));
end

gradientDescent.m如下:

公式为 θ j = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) \theta_j=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1) θj=θjαθjJ(θ0,θ1)(for j = 0 j=0 j=0 and j = 1 j=1 j=1)。其中需要注意的是,需要同时更新 θ 0 、 θ 1 \theta_0、\theta_1 θ0θ1,否则在更新完 θ 0 \theta_0 θ0之后会用更新完的 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1)来更新接下来的 θ 2 \theta_2 θ2。做法是先赋给中间变量temp,最后再转回给theta。其中第一层循环为迭代循环,从1迭代到指定num_iters,第二层为更新循环,对theta进行更新。

function [theta,J_history]=gradientDescent(X,y,theta,alpha,num_iters,m)
temp=theta;
J_history=zeros(num_iters,1);
for iter=1:num_iters
    for i=1:size(X,2)
        temp(i,1)=theta(i,1)-alpha/m*sum((X*theta-y).*X(:,i));
    end
    theta=temp;
     J_history(iter)=computeCost(X,y,m,theta);
end
    

最后结果为:
图2 单变量线性回归

图2 单变量线性回归

作业任务项三:可视化

代码如下:

theta0_val=linspace(-10,10,100);
theta1_val=linspace(-1,4,100);
for i=1:length(theta0_val)
    for j=1:length(theta1_val)
        t=[theta0_val(i);theta1_val(j)];
        Jval(i,j)=computeCost(X,y,m,t);
    end
end
Jval=Jval';
surf(theta0_val,theta1_val,Jval);
xlabel('\theta_0');ylabel('\theta_1');
figure;
contour(theta0_val,theta1_val,Jval,logspace(-2,3,20));

其中linspace(A,B,C)是从A开始,B结束,中间分隔100个量,形成一个向量。此处对theta1和theta2进行值域范围的分割,用for循环做出一个高为-1到4,长为-10到10的网格,每个相交的坐标点都对应一个Jval,在内层for循环中进行计算。由于是使用theta0作为y轴,theta1作为x轴划分的网格,因此需要对Jval进行转置。
surf()可以绘制3d图像,效果如下图3所示:
在这里插入图片描述

图3 surf图像

同样,通过contour投影可以得到等高线图,如下图4所示:
在这里插入图片描述

图4 等高线图

其中logspace(a,b,N)是把10的a次方到10的b次方区间分成N份,在contour中是用来选择层级用的,选择Jval在0.1~1000的20个层级并投影。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tinner_000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值