昆明理工大学信息工程与自动化学院学生实验报告
(2012 —2013 学年第 1 学期)
课程名称:人工智能开课实验室:信自楼445 2012 年12月 26日年级、专业、班学号姓名成绩实验项目名称线性回归指导教师王剑教
师评语该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□
该同学的实验能力: A.强□ B.中等□ C.差□
该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□
实验报告是否规范: A.规范□ B.基本规范□ C.不规范□
实验过程是否详细记录: A.详细□ B.一般□ C.没有□
教师签名:
年月日
一、上机目的及内容
1.上机内容:
用于预测房价的线性回归(一元或二元的例子)
2.上机目的
(1)掌握线性回归的实质
(2)能够用MATLAB实现线性回归
二、实验原理及基本技术路线图(方框原理图或程序流程图)
(1)建立两个数据包:ex2x.da和ex2y.dat,分别存放住房面积和价格
(2)下载数据,分别付给x和y
(3)定义最大迭代次数,以及学习率,通过梯度下降法,进行迭代grad = (1/m).* x' * ((x * theta) - y)
theta = theta - alpha .* grad
(4)如果没有得到预期目的,返回(3)
(5)如果得到回归曲线则停止,输出图形,否则返回(3)
三、所用仪器、材料(设备名称、型号、规格等或使用软件),
1台PC及MA TLAB软件
四、实验方法、步骤(或:程序代码或操作过程)
% Exercise 2 Linear Regression
% for house
%
% x refers to a house's area
% y is a house's price
%
clear all; close all; clc %清空所有记录和关闭之前打开的所有窗口
x = load('ex2x.dat'); %从ex2x.da这个数据包中下载数据到x
y = load('ex2y.dat'); %从ex2y.dat这个数据包中下载数据在y
m = length(y); % number of training examples
%定义训练的样本(y)的长度或大小
% Plot the training data(开始训练函数)
figure; % open a new figure window(打开一个新的窗口)
plot(x, y, 'o'); %定义输出样本用O表示
ylabel('price of x*100万元') %定义y轴的值为住房的房价
xlabel('area of x*60 square meter ') %定义x轴的值为住房的面积,单位为平方米
% Gradient descent
x = [ones(m, 1) x] % Add a column of ones to x(添加到x 的那些列:就是将m设为1的那些列)
theta = zeros(size(x(1,:)))'% initialize fitting parameters(对theta进行初始化)
%将x中第一行和所有列初始化
MAX_ITR = 5000; %训练或者是迭代的最大次数为5000次
alpha = 0.07; %定义学习率为0.07
for num_iterations = 1:MAX_ITR %梯度下降发开始,对回归函数开始迭代,从1到1500
% This is a vectorized version of the
% gradient descent update formula
% It's also fine to use the summation formula from the videos
% Here is the gradient
grad = (1/m).* x' * ((x * theta) - y); %梯度下降发函数实现语句
% Here is the actual update
theta = theta - alpha .* grad; %计算theta的值
% Sequential update: The wrong way to do gradient descent
% grad1 = (1/m).* x(:,1)' * ((x * theta) - y);
% theta(1) = theta(1) + alpha*grad1;
% grad2 = (1/m).* x(:,2)' * ((x * theta) - y);
% theta(2) = theta(2) + alpha*grad2;
end
% print theta to screen
theta
% Plot the linear fit
hold on; % keep previous plot visible
plot(x(:,2), x*theta, '-') %寻找一个最低点,并将其输出来legend('Training data', 'Linear regression')%对数据进行训练
hold off % don't overlay any more plots on this figure
% Closed form solution for reference
% You will learn about this method in future videos
exact_theta = (x' * x)\x' * y %确定theta值
% Predict values for area 120 and 150
predict1 = [80, 120] *theta %预测距离工作地80万,120平米的住房是否符合训练样本的规律
predict2 = [110, 150] * theta %预测距离工作地110万,150平米的住房是否符合训练样本的规律
% Calculate J matrix
% Grid over which we will calculate J
theta0_vals = linspace(-3, 3, 100); %theta0的值为-3到3,并分割为100等分,并将其用等高线输出
theta1_vals = linspace(-1, 1, 100); %theta1的值为-1到1,并分割为100等分
% initialize J_vals to a matrix of 0's
J_vals = zeros(length(theta0_vals), length(theta1_vals))
for i = 1:length(theta0_vals) %开始迭代,i从1到1500 for j = 1:length(theta1_vals) %开始迭代,j从1到1500
t = [theta0_vals(i); theta1_vals(j)];
J_vals(i,j) = (0.5/m) .* (x * t - y)' * (x * t - y);
end
end
% Because of the way house in the surf command, we need to
% transpose J_vals before calling surf, or else the axes will be flipped
J_vals = J_vals'; %将J_vals'矩阵付给J_vals
% Surface plot
figure;
surf(theta0_vals, theta1_vals, J_vals) %利用surf函数求theta0_vals、theta1_vals、J_vals的值
xlabel('\theta_0'); ylabel('\theta_1'); %x轴表示theta_0,y轴表示theta_1
% Contour plot
figure;
% Plot J_vals as 15 contours spaced logarithmically between 0.01 and 100 contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 2, 15))%输出梯度下降中的最低点,用等高线表示
xlabel('\theta_0'); ylabel('\theta_1'); %x轴表示theta_0,y轴表示theta_1
五、运行截图
图1
图2
图3
六、实验总结
通过实现掌握和了解了线性回归的基本特性,通过实验编程实现了住房价格和面积之间关系的线性分析。
在实验中遇到了很多的问题:一开始的时候对软件不是很熟悉,不知道如何将数据写到数据包中,后来在老师的帮助下,解决了这个问题。
数据写到数据包有两种方式:一是在matlab软件中手工输入或随机生成数据,然后用命令程序写到数据包(保存为数据包的形式);而是利用存储技术,也就是利用数据库语言生成数据包;其次遇到的问题是,迭代中出现了了问题,后来发现自己没有初始化学习率;最后的问题是,画不出图像,经过老师的帮助和自己的努力,最后实现了。
总之,在这次实验中不但对MATLAB有了进一步的了解和认识,同时也获得了很多宝贵的经验和知识。