当前位置: 首页 > news >正文

线性回归与线性拟合的原理、推导与算法实现

关于回归和拟合,从它们的求解过程以及结果来看,两者似乎没有太大差别,事实也的确如此。从本质上说,回归属于数理统计问题,研究解释变量与响应变量之间的关系以及相关性等问题。而拟合是把平面的一系列点,用一条光滑曲线连接起来,并且让更多的点在曲线上或曲线附近。更确切的说,拟合是回归用到的一种数学方法,而拟合与回归的应用场合不同。

拟合常用的方法有最小二乘法梯度下降法高斯牛顿(即迭代最小二乘)列-马算法。其中最最常用的就是最小二乘法。并且拟合可以分为线性拟合与非线性拟合,非线性拟合比较常用的是多项式拟合。根据自变量的个数,拟合也可以分为曲线拟合与曲面拟合等。

回归大多数采用最小二乘法。回归可以分为一元线性回归、一元非线性回归、多元线性回归、多元非线性回归等。

1、最小二乘法


无论是在高等数学、线性代数,还是数理统计,我们都可以看到最小二乘法的身影。只不过每一部分侧重点不同,最终是殊途同归的。但是建议用矩阵的方法来做,这样很便于理解,计算起来也很方便。

最小二乘法的基本思路是:确定函数f(x),使得各个点x1,x2..xn处的函数值偏差f(x1)-y1、f(x2)-y2...f(xn)-yn的平方和或绝对值和最小。如果是一元线性拟合(回归),我们可以设方程为f(x)=kx+b。

这时我们求得函数值偏差平方和为f=\sum [y_i -(kx_i+b)]^2。为了求它的最小值,利用高数的方法,就可以使M分别对k和b的偏导为0,最终求解得方程组:

公式1\frac{\mathrm{d}f }{\mathrm{d} k} = -2\sum (y_i - kx_i-b)x_i = -2(\sum y_ix_i-k\sum x_{i}^{2}-b\sum x_i) = 0

公式2 :\frac{\mathrm{d}f }{\mathrm{d} b} = -2\sum (y_i - kx_i-b) = -2(\sum y_i-k\sum x_{i}-b\sum ) = -2(\sum y_i-k\sum x_{i}-Nb ) = 0

由式2括号内为0,则有b的表达式

公式3 b = \frac{\sum y_i}{N} - k \frac{\sum x_i}{N } = \overline{y} - k\overline{x}

将式(3)代入到式(2)中得到式(4)

公式4 \sum y_ix_i - k\sum x_{i}^{2} - (\overline{y} - k\overline{x})\sum x_i = 0

整理式(4)我们可以得到k的表达式

公式5 k = \frac{\sum y_ix_i - \overline{y}\sum x_i}{\sum x_{i}^{2}-\overline{x}\sum x_i} = \frac{\sum y_ix_i - N\overline{x}\overline{y}}{\sum x_{i}^{2}-N\overline{x}^2}

如果用线性代数的角度来看其实矩阵表达更加简洁,我们最终需要寻找最佳的k和b :

公式6 \left\{\begin{matrix} y_1 = kx_1+b & & & & \\ y_2 = kx_2+b & & & & \\ . & & & & \\ . & & & & \\ y_N = kx_N+b & & & & \end{matrix}\right.

写成矩阵的形式:

公式7 \begin{bmatrix} y_1\\ y_2\\ .\\ .\\ y_N\\ \end{bmatrix} = \begin{bmatrix} x_1 & 1 \\ x_2&1 \\ .&. \\ . &.\\ x_N & 1\\ \end{bmatrix}\begin{bmatrix} k\\ b\\ \end{bmatrix}

令 Y =\begin{bmatrix} y_1\\ y_2\\ .\\ .\\ y_N\\ \end{bmatrix}K=\begin{bmatrix} k\\ b\\ \end{bmatrix}X=\begin{bmatrix} x_1 & 1 \\ x_2&1 \\ .&. \\ . &.\\ x_N & 1\\ \end{bmatrix}

我们可以写成矩阵形式:

公式8 Y= KX

我们要解K,这时候X如果是方阵那么自然的就可以左右两边同时乘X的逆,但是如果X不是方阵(行数大于列数),我们可以左右同乘以X的转置,转换为方阵再取逆(当然能取逆的前提是行列式不能为0),具体如下,求得的逆叫做伪逆:

公式9 Y= KX  =>  X^TY = X^TXK=> (X^TX)^{-1}X^TY = (X^TX)^{-1}X^TXK 

所以解得K的值:

公式10 K = (X^TX)^{-1}X^TY

2、matlab实现

现在有这么一组数据 

xy
0.11.7805
0.32.2285
0.42.3941
0.753.2226
0.93.5697

我们利用matlab进行绘制散点图查看一下

x=[0.1;0.3;0.4;0.75;0.9]; 
y=[1.7805;2.2285;2.3941;3.2226;3.5697];
plot(x,y,'o')
xlim([0,1]);
ylim([1.6,3.7]);
hold on;

可以看出满足很好的线性关系,下面我们用上述最小二乘法的思想求一下拟合直线的k 和b :

方法1:代数方法计算

N=length(x);
k=(sum(y.*x)-N*mean(y)*mean(x))/(sum(x.^2)-N*mean(x)^2);
b=mean(y)-k*mean(x);
x_line=linspace(0,1,101);
y_line=k*x_line+b;
plot(x_line,y_line,'Color','r','LineWidth',1)

 

查看k和b的值:

k=2.2411
b=1.5409

 方法2:矩阵计算

N=length(x);
X=[x,ones(N,1)];
Y=y;
K=inv(X'*X)*X'*Y;
k=K(1);
b=K(2);
x_line=linspace(0,1,101);
y_line=k*x_line+b;
plot(x_line,y_line,'Color','r','LineWidth',1)

查看k和b的值:

k=2.2411
b=1.5409

至此,我们可以看到两种方法的结果是一样的。

http://www.lryc.cn/news/218444.html

相关文章:

  • 【C++】set和multiset
  • 二十、泛型(1)
  • 【Unity数据交互】游戏中常用到的Json序列化
  • TCP的滑动窗口和拥塞控制
  • 零信任网络:一种全新的网络安全架构
  • 基于单片机的智能拐杖软件设计
  • 小程序如何设置自动预约快递
  • STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)
  • 【数据结构】深入浅出讲解计数排序【图文详解,搞懂计数排序这一篇就够了】
  • Canvas制作喷泉效果示例
  • 什么是NPM(Node Package Manager)?它的作用是什么?
  • oracle如果不适用toad或者plsql工具如何获取索引建表语句
  • 某大厂伺服驱动器量产方案
  • 【计算机网络】网络层:数据平面
  • Path with “WEB-INF“ or “META-INF“: [webapp/WEB-INF/NewFile.html]
  • 百度OCR 接口调用 提示 216101:param image not exist 问题解决
  • 1-10 HTML中input属性
  • 共焦显微镜使用
  • windows + Mingw32-make 编译 PoDoFo库,openssl, libjpeg, Msys2工具的使用
  • C++中图的存储
  • 西瓜书读书笔记整理(七)—— 第七章 贝叶斯分类器
  • C#WPF嵌套布局实例
  • Spring和SpringMVC总结
  • C++标准模板(STL)- 类型支持 (类型属性,is_abstract,is_signed,is_unsigned)
  • 前端复制带上版权信息
  • 【ArcGIS微课1000例】0077:ArcGIS生成经纬网(shp格式)
  • 读程序员的制胜技笔记04_有用的反模式(下)
  • linux驱动开发环境搭建
  • Qt利用VCPKG和CMake和OpenCV和Tesseract实现中英文OCR
  • Day20力扣打卡