完整的数据和代码已经更新至GitHub,欢迎fork~GitHub链接
This first exercise will give you practice with linear regression
实验内容
一、下载提供的数据,读入数据,画出相应的坐标点
二、使用数据,拟合出一条直线来,使用机器学习所讲的线性回归的方法来拟合出一条直线
三、理解损失函数,通过数据来画出损失函数的图像,进行可视化
实验步骤
一、读入数据,然后使用plot函数,画出散点图
如下图所示:
二、 使用以下规则,更新 theta,先对x多增加一列,实现x的维数和theta的维数可以实现乘法,在使用如下的公式来更新 theta
h
θ
(
x
)
=
θ
T
x
=
∑
i
=
0
n
θ
i
x
i
,
θ
j
=
θ
j
−
α
∗
1
m
∑
i
=
1
n
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
h_{\theta}(x)=\theta^Tx=\sum_{i=0}^{n}\theta_ix_i, \\ \theta_j=\theta_j-\alpha*\frac{1}{m}\sum_{i=1}^{n}(h_\theta(x^{(i)})-y^{(i)})x_{j}^{(i)}
hθ(x)=θTx=i=0∑nθixi,θj=θj−α∗m1i=1∑n(hθ(x(i))−y(i))xj(i)
一共更新1500轮,最后通过plot函数来画出函数图像
这就是我们拟合出来的函数图像,显示拟合效果还是不错的,而且loss函数也是一直在减小的
三、画出损失函数的图像,使用,以下数据:
J_vals=zeros(100,100);
theta0=linspace(-3,3,100);
theta1=linspace(-1,1,100);
#损失函数,定义为(y^-y)2 再求和,除以2*m,即为损失函数:
loss=@(theta,x,y) mean((h(x,theta)-y).^2)/2;
因为这是三维图像,使用surf函数进行画图,结果如下:
通过观察,我们会发现,损失函数,是从各个方向趋于一个最小值,而这个最小值,正是我们需要达到的目标。
附:完整源代码
x = load ( 'F:\\Machine Learning\\exp\\ex1Data\\ex1x.dat') ; %50维
y = load ( 'F:\\Machine Learning\\exp\\ex1Data\\ex1y.dat') ; %50维
figure % open a new f i g u r e window
plot (x , y , ' o ' ) ;
ylabel ( 'Height in meters ')
xlabel ( 'Age in years ' )
u=0;
m=length(y);
x=[ones(m,1),x]; % 50*2维度
h=@(x,theta) x*theta;
alpha=0.07;
theta=zeros(2,1); % 2*1维度
loss=@(theta,x,y) mean((h(x,theta)-y).^2)/2;
iteration=@(theta,alpha,y,x) theta-alpha*(x'*(h(x,theta)-y))/m;
for j=1:1500
theta=iteration(theta,alpha,y,x);
end
hold on
plot(x(:,2),x*theta,'-');
legend( ' Training data ' , ' Linear regression' );
J_vals=zeros(100,100);
theta0=linspace(-3,3,100);
theta1=linspace(-1,1,100);
for i=1:length(theta0)
for j=1:length(theta1)
t=[theta0(i);theta1(j)];
J_vals(i,j)=loss(t,x,y);
end
end
J_vals =J_vals';
figure ;
surf (theta0, theta1, J_vals);
xlabel ( 'ntheta0' ) ; ylabel ( 'ntheta1' );