线性回归算法Matlab实现

栏目: 编程工具 · 发布时间: 6年前

内容简介:一,单变量线性回归:1. 数据分布,x轴是属性城市人口,y轴是标签值盈利:
编辑推荐:

本文来自于csdn,本文将通过以OCR(光学字符识别)的场景来介绍深度学习在计算机视觉中的应用。

一,单变量线性回归:

1. 数据分布,x轴是属性城市人口,y轴是标签值盈利:

线性回归算法Matlab实现

2. 目的:使用一个线性函数去拟合上面这些数据;

该线性函数如下只有两个参数,利用梯度下降找出使损失值最小时,对应的两个参数值,即得到了线性函数。

算法三要素:

1)设置线性函数,即假设函数(Hypothesis);

2)选定损失函数 J,

3)梯度下降,找到使得J值最小时,对应的theta_0, theta_1。

J值最小,预测的h_theta(x)值就会越接近标签纸y

线性回归算法Matlab实现

3. 梯度下降:

找损失函数J的最小值,高数知识可知对函数求导等于零,对应的点即为极值点,但有些函数不能直接求出倒数值,所以需要梯度下降逐渐的趋向最小值。

线性回归算法Matlab实现

梯度下降过程如下所示,便于分析,这里假设线性函数为 theta_1 * x, 没有 theta_0,theta = theta - alpha * K, K即为斜率,迭代变化\theta_1值,使得J值为0

线性回归算法Matlab实现

其中,迭代过程:

线性回归算法Matlab实现

4. Matlab实现:

clc;

clear;

data = load('D:/Code/Data/ex1data1.txt');

X = data(:,1);

y = data(:,2);

figure,plot(X, y, 'r*', 'MarkerSize', 5); % 5控制*的大小

% x加了一列,变成 (97,2)

m = length(y);

X = [ones(m, 1), data(:,1)];

% 初始化参数

theta = zeros(2, 1);

% Some gradient descent settings

iterations = 1500;

alpha = 0.01;% 梯度下降,找到最佳参数

theta = gradientDescent(X, y, theta, alpha, iterations);

hold on;

% keep previous plot visible

plot(X(:,2), X*theta, '-')

legend('Training data', 'Linear regression')

hold off

function theta = gradientDescent(X, y, theta, alpha, num_iters)

m = length(y);

% 样本数量

for iter = 1:num_iters

H = X * theta;

%(97,2)*(2*1)=(97,1)

Sum = [0 ; 0]; %(2,1),记录偏导,求和

% theta_0更新

for i = 1 : m

Sum(1,1) = Sum(1,1) + (H(i) - y(i));

end

% theta_1更新

for i = 1 : m

Sum(2,1) = Sum(2,1) + (H(i) - y(i)) * X(i,2)';

end

theta = theta - (alpha * Sum) / m;

end

end

关键代码:

Sum = [0 ; 0]; %(2,1),记录偏导,求和

% theta_0更新

for i = 1 : m

Sum(1,1) = Sum(1,1) + (H(i) - y(i));

end

% theta_1更新

for i = 1 : m Sum(2,1) = Sum(2,1) + (H(i) - y(i)) * X(i,2)';

end

theta = theta - (alpha * Sum) / m;

5. 效果如下:

线性回归算法Matlab实现

二,多变量的线性回归

1. 多变量的例子,如下

线性回归算法Matlab实现

2. 数据集下载点击打开链接,密码:ibtb:

画出数据分布:

线性回归算法Matlab实现

3. 多变量的假设函数定义:

线性回归算法Matlab实现

4. 多变量的损失函数:

线性回归算法Matlab实现

5. 迭代过程如下:

线性回归算法Matlab实现

手推一把:

线性回归算法Matlab实现

6. 多变量的线性回归,Matlab实现:

clear;

clc;

% 1,读取数据

x = load('D:\Code\Data\ex3Data\ex3x.dat'); % 两个变量房子面积,和卧室数目,一行一个样本

y = load('D:\Code\Data\ex3Data\ex3y.dat'); % 房子价格

% plot3(x(:,1), x(:,2), y, 'r*');% grid on % 画上网格

% hold on; % 后面将画上拟合的线

% 2, 处理数据

m = length(x(:,1)); % 样本数

x = [ones(m,1), x]; % x0 为1

x(:,2) = (x(:,2) - mean(x(:,2))) ./ std(x(:,2));

x(:,3) = (x(:,3) - mean(x(:,3))) ./ std(x(:,3));

plot3(x(:,1), x(:,2), y, 'r*');

grid on % 画上网格

hold off;

% 3,参数设置

iter = 1500; % 迭代次数

theta = zeros(1,3); % 线性函数的参数,为行向量

alpha = 0.01;

J = zeros(m,1);

for i = 1:iter % 以迭代次数为终止条件

% 求以当前theta为线性函数的参数时,其损失值

h = x * theta';

% 假设函数 J(i) = 1/2*m * sum((h - y).^2); % 记录每次迭代后损失值情况,但对迭代终止没有影响

theta(1,1) = theta(1,1) - alpha*(1/m)* sum((h - y) .* x(:,1)); % x(:,1)即为x_0

theta(1,2) = theta(1,2) - alpha*(1/m)* sum((h - y) .* x(:,2));

theta(1,2) = theta(1,3) - alpha*(1/m)* sum((h - y) .* x(:,3));

% theta = theta - alpha*(1/m)* sum(x'*(h - y)); % 一次性处理所有theta

end figure, % 画出损失函数随迭代次数的变化情况

plot(1:iter, J);

损失函数变化情况:

线性回归算法Matlab实现

关键代码解释:

theta(1,1) = theta(1,1) - alpha*(1/m)* sum((h - y) .* x(:,1)); % x(:,1)即为x_0

线性回归算法Matlab实现

三,正规方程(normal equation)

1. 求最佳的参数theta,除了使用梯度下降法,也可以使用正规方程,具体方式,所有样本组成一个矩阵X,矩阵的每一行为一个样本, 参数theta直接使用下面的正规公式即可得到:

线性回归算法Matlab实现

2. 梯度下降法和正规方程对比:NG推荐特征数小于一万时,采用正规方程

线性回归算法Matlab实现

3. 正规方程的推导过程:如果 y = X * theta,则损失函数值为0,即找到最佳theta。即已知y = X * theta,求theta?

线性回归算法Matlab实现


以上所述就是小编给大家介绍的《线性回归算法Matlab实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Essential C++中文版

Essential C++中文版

[美] Stanley B. Lippman / 侯捷 / 华中科技大学出版社 / 2001-8 / 39.80元

书中以4个面向来表现C++的本质:procedural(程序性的)、generic(泛型的)、object-based(个别对象的)、object-oriented(面向对象的),全书围绕着一系列逐渐繁复的程序问题,以及用以解决这些问题的语言特性。循此方式,读者不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理。一起来看看 《Essential C++中文版》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具