一、实验学时
4学时(课内2学时,课外2学时)
二、实验类型
验证性实验
三、实验目的
1、熟悉matlab的开发环境
2、掌握线性回归分析的基本理论
3、线性回归公式推导
4、用matlab实现线性回归分析
四、所需设备及软件
1、安装了windows xp/win7/win8/win10的计算机
2、matlab开发工具
五、实验基本原理
1、回归分析基本概述
利用数理统计中的回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。分析按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。本实验主要针对线性回归。
在统计学中,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
线性回归是回归分析中第一种经过严格研究并在实际应用中广泛使用的类型。用作预测、识别冗余信息等。
2、线性回归模型
利用线性回归分析来解决实际问题,关键需要计算这个回归模型,根据模型进行预测。
例子:以一简单数据组来说明什么是线性回归。假设有一组数据型态为 y=y(x),其中x={0, 1, 2, 3, 4, 5}, y={5, 25, 50, 78, 88, 110},如果要以一个最简单的方程式来近似这组数据,则用一阶的线性方程式最为适合:y=bx+a,需要根据已知的数据,来计算出a和b的值。如果有新的x,即可根据这个模型预测其对应的y。见下图
问题是如何估计a、b的值,使得y=bx+a能比较精确的刻画已知的数据,使之成为理想的线性方程。针对多元线性回归,则有形如:h(x)=θ0+θ1x1+θ2x2+...+θnxn如何估计θi的值?
3、模型训练思路
可以要求误差平方的总和最小,作为确定理想的线性方程的训练目标,这样的方法称为最小平方误差(least squares error)或是线性回归。这也是机器学习方法中常采用的思路:设置训练目标,构建目标函数,然后根据已知数据对模型进行不断地修改,直到满足要求为止(固定的训练次数、数值变化很小等)。
对于h(x)=θ0+θ1x1+θ2x2+...+θnxn
目标函数:min J(θ)= 刻画真实值y与拟合值h(x)之间的距离
要计算最小值,则使用梯度下降法,调用上面的目标函数进行不断迭代,直到最大迭代次数达到给定标准或者目标函数返回值不再减小。
梯度下降包括两个方面:
1)梯度的计算:计算偏导
2)梯度下降法,更新公式θi=θi-
4、算法
1)初始化
2)指定训练次数
3)循环执行循环体“训练次数”
θi=θi-
4)绘制图形(用plot)
5)进行预测
六、实验内容
1、一元线性回归模型的建立
程序编写:有两组数据ex2x.dat和ex2y.dat,通过线性回归分析方法,求解回归分析方程。要求显示训练后的theta值,绘制实际数据和回归方程的图形。plot绘制图形。
附:plot的用法 简单格式plot(x,y,'*')
x=load('ex2x.dat');
y=load('ex2y.dat');
m=length(y);
x=[ones(m,1),x];
plot(x(:,2),y,'*');
theta=rand(2,1);
alpha=0.05;
iterations=1500;
for iter=1:iterations
grad=x'*(y-x*theta);
theta=theta+alpha*grad./m;
end
fprintf('theta found by gradient descent:');
fprintf('%f,%f\\n',theta(1),theta(2));
hold on;
plot(x(:,2),x*theta,'-');
legend('Training data','Linear regression');
hold off;
fprintf('Visualizing J(theta_0,theta_1)…\\n');
theta0_vals=linspace(-3,3,100);
theta1_vals=linspace(-1,1,100);
theta found by gradient descent:0.750078,0.0636
2、多元线性回归模型的建立和对模型测试
1)程序编写:有一个数据集housing.txt,要求将数据分成两个部分:训练数据和测试数据,用训练数据对回归模型进行创建,再用测试数据对建立的回归模型进行测试。要求显示训练后的theta值,显示训练数据集和测试数据集的root-mean-squared (RMS)。并用图形显示测试数据集的预测值和实际值。
求解思路:
a、将数据装载的工作区中。
b、数据分成训练数据集和测试数据集(可以分成400,105,同学们也可自己设置)
c、对数据进行归一化处理(简单的方式就是0均值,1方差,同学们用其他方式)
d、为了将偏置的更新在一起计算,可以在数据集中增加一维全1的数据
e、参数的初始化
f、梯度计算,并更新参数
g、显示训练后的theta参数
h、计算训练数据集和测试数据及的RMS
i、图形显示测试数据中的预测值和实际值。
均值:mean 方差:std
RMS的计算 :train_rms=sqrt(mean((predicted_prices - actual_prices).^2));
图形显示程序如下:
plot(predicted_prices,'bx');
legend('Actual Price', 'Predicted Price');
xlabel('House #');
ylabel('House price ($1000s)');
2)参数调整:设置不同参数(学习率,迭代次数等),观察其对结果的影响,并给出各组参数值对应的结果(theta的值和RMS值)和图形。
data=load('housing_data.txt');
data=data(randperm(size(data,1)),:);
train_x=data(1:400,1:end-1);
train.y=data(1:400,end);
test_x=data(401:end,1:end-1);
test.y=data(401:end,end);
fprintf('Normalizing Features …\\n');
train_mu=mean(train_x);
train_sigma=std(train_x);
train.X=(train_x-repmat(train_mu,size(train_x,1),1))./repmat(train_sigma,size(train_x,1),1);
test_mu=mean(test_x);
test_sigma=std(test_x);
test.X=(test_x-repmat(test_mu,size(test_x,1),1))./repmat(test_sigma,size(test_x,1),1);
train.X=[ones(size(train.X,1),1) train.X];
test.X=[ones(size(test.X,1),1) test.X]
fprintf('Running gradient desceng ….\\n');
alpha=0.05;
iterations=100;
theta=rand(size(train.X,2),1);
for iter=1:iterations
theta=theta-alpha/size(train.X,1)*train.X'*(train.X*theta-train.y);
end
fprintf('theta found by fradient desceng:\\n');
for i=1:size(train.X,2)
fprintf('%f\\n',theta(i));
end
fprintf('\\n');
actual_prices=train.y;
predicted_prices=train.X*theta;
train_rms=sqrt((mean(predicted_prices-actual_prices).^2));
fprintf('RMS training errors: %f\\n',train_rms);
actual_prices=test.y;
predicted_prices=test.X*theta;
test_rms=sqrt(mean((predicted_prices-actual_prices).^2));
fprintf('RMS training error: %f\\n',test_rms);
plot_prices=true;
if(plot_prices)
[actual_prices,I]=sort(actual_prices);
predicted_prices=predicted_prices(I);
plot(actual_prices,'rx');
hold on;
plot(predicted_prices,'bx');
legend('Actual Price','Predicted Price');
xlabel('House #');
ylabel('House price($1000s)');
end
Normalizing Features …
test =
y: [105x1 double]
X: [105x14 double]
Running gradient desceng ….
theta found by fradient desceng:
22.004457
-0.765476
0.676395
-0.113387
0.872230
-1.046303
2.460715
0.261008
-1.714184
0.928139
-0.517072
-1.749698
0.737440
-3.858885
RMS training errors: 0.125543
RMS training error: 5.081213
七、实验结果
1)将“六”中每个内容认真完成以后,运行结果和图形复制到对应部分。
2)将程序文件“.m”保存到文件夹“实验三+学号+姓名”中。
3)实验报告保存到文件夹中,压缩并命名“实验三+学号+姓名”下载本文