线性回归算法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实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

The Little MLer

The Little MLer

Matthias Felleisen、Daniel P. Friedman、Duane Bibby、Robin Milner / The MIT Press / 1998-2-19 / USD 34.00

The book, written in the style of The Little Schemer, introduces instructors, students, and practicioners to type-directed functional programming. It covers basic types, quickly moves into datatypes, ......一起来看看 《The Little MLer》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具