IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> MATLAB | 最小二乘法的两种解读 -> 正文阅读

[数据结构与算法]MATLAB | 最小二乘法的两种解读

最小二乘法

大部分的最小二乘法公式推导,都是使用的 代价函数偏导 的方式来求得的,在这里首先展示如何通过代价函数求偏导的方式得到最小二乘公式,再展示李扬老师讲解的如何由向量到子空间的距离得来最小二乘法公式。

代价函数与最小二乘法

假设我们的拟合结果为:

h θ ( x ) = ∑ i = 0 n θ i x i = θ 0 + θ 1 x 1 + ? + θ n x n h_{\theta}(x)=\sum_{i=0}^{n} \theta_{i} x_{i}=\theta_{0}+\theta_{1} x_{1}+\cdots+\theta_{n} x_{n} hθ?(x)=i=0n?θi?xi?=θ0?+θ1?x1?+?+θn?xn?

则平方损失函数为:

J ( θ ) = ∑ j = 1 m ( h θ ( x ( j ) ) ? y ( j ) ) 2 = ∑ j = 1 m ( ∑ i = 0 n θ i x i ( j ) ? y ( j ) ) 2 J(\theta)=\sum_{j=1}^{m}\left(h_{\theta}\left(x^{(j)}\right)-y^{(j)}\right)^{2}=\sum_{j=1}^{m}\left(\sum_{i=0}^{n} \theta_{i} x_{i}^{(j)}-y^{(j)}\right)^{2} J(θ)=j=1m?(hθ?(x(j))?y(j))2=j=1m?(i=0n?θi?xi(j)??y(j))2

其中 x ( j ) , y ( j ) x^{(j)},y^{(j)} x(j),y(j)为一组数据点, x ( j ) x^{(j)} x(j)是长度为 n + 1 n+1 n+1的向量, y ( j ) y^{(j)} y(j)是数值,而 x i → \overrightarrow{x_i} xi? ?我们定义为长为 m m m的向量,这在之后会被用到,注意这里为了追求整齐性,我们直接定义 x 0 x_0 x0?衡为常数1:
x ( j ) = ( 1 , x 1 ( j ) , … , x n ( j ) ) x i → = ( x i ( 1 ) , x i ( 2 ) , … , x i ( m ) ) \begin{aligned} &x^{(j)}=\left(1, x_{1}^{(j)}, \ldots, x_{n}^{(j)} \right)\\ &\overrightarrow{x_{i}}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \ldots, x_{i}^{(m)}\right) \end{aligned} ?x(j)=(1,x1(j)?,,xn(j)?)xi? ?=(xi(1)?,xi(2)?,,xi(m)?)?

平方损失函数的形式只有极小值,没有极大值,我们要使代价函数最小,我们要找到其极值点,即偏导均为0的点,代价函数对于各参数偏导如下:

? J ( θ ) θ i = 2 ∑ j = 1 m ( h θ ( x ( j ) ) ? y ( j ) ) x i ( j ) , i = 0 , 1 , 2 , . . . n \frac{\partial J(\theta)}{\theta_{i}}=2 \sum_{j=1}^{m}\left(h_{\theta}\left(x^{(j)}\right)-y^{(j)}\right) x_i^{(j)},i=0,1,2,...n θi??J(θ)?=2j=1m?(hθ?(x(j))?y(j))xi(j)?,i=0,1,2,...n
令偏导为0得:
∑ j = 1 m ( h θ ( x ( j ) ) ? y ( j ) ) x i ( j ) = 0 , i = 0 , 1 , 2 , . . . , n ? ∑ j = 1 m ( h θ ( x ( j ) ) x i ( j ) ) = ∑ j = 1 m ( y ( j ) x i ( j ) ) , i = 0 , 1 , 2 , . . . , n \begin{aligned} &\sum_{j=1}^{m}\left(h_{\theta}\left(x^{(j)}\right)-y^{(j)}\right) x_i^{(j)}=0,i=0,1,2,...,n \\ \Rightarrow &\sum_{j=1}^{m}\left(h_{\theta}\left(x^{(j)}\right)x_i^{(j)}\right)=\sum_{j=1}^{m}\left(y^{(j)}x_i^{(j)}\right),i=0,1,2,...,n \end{aligned} ??j=1m?(hθ?(x(j))?y(j))xi(j)?=0,i=0,1,2,...,nj=1m?(hθ?(x(j))xi(j)?)=j=1m?(y(j)xi(j)?),i=0,1,2,...,n?

实际上若是令:

X = [ ? ( x ( 1 ) ) ? ? ( x ( 2 ) ) ? ? ? ( x ( m ) ) ? ] Y = [ y ( 1 ) y ( 2 ) ? y ( m ) ] θ = [ θ 0 θ 1 ? θ n ] X=\left[\begin{array}{c} -\left(x^{(1)}\right)- \\ -\left(x^{(2)}\right)- \\ \vdots \\ -\left(x^{(m)}\right)- \end{array}\right] \quad Y=\left[\begin{array}{c} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(m)} \end{array}\right] \quad \theta=\left[\begin{array}{c} \theta_0 \\ \theta_1\\ \vdots \\ \theta_n \end{array}\right] X=???????(x(1))??(x(2))???(x(m))????????Y=??????y(1)y(2)?y(m)???????θ=??????θ0?θ1??θn????????
为了尽量写的清晰明了,在这里对比一下 X X X X ′ X^{\prime} X
X = [ ? ( x ( 1 ) ) ? ? ( x ( 2 ) ) ? ? ? ( x ( m ) ) ? ] X ′ = [ ? ( x 0 → ) ? ? ( x 1 → ) ? ? ? ( x n → ) ? ] X=\left[\begin{array}{c} -\left(x^{(1)}\right)- \\ -\left(x^{(2)}\right)- \\ \vdots \\ -\left(x^{(m)}\right)- \end{array}\right] \quad X^{\prime}=\left[\begin{array}{c} -\left(\overrightarrow{x_0}\right)- \\ -\left(\overrightarrow{x_1}\right)- \\ \vdots \\ -\left(\overrightarrow{x_n}\right)- \end{array}\right] X=???????(x(1))??(x(2))???(x(m))????????X=??????????(x0? ?)??(x1? ?)???(xn? ?)???????????
则有:
∑ j = 1 m ( h θ ( x ( j ) ) x i ( j ) ) = ∑ j = 1 m ( y ( j ) x i ( j ) ) , i = 0 , 1 , 2 , . . . , n ? x i → X θ = x i → Y , i = 0 , 1 , 2 , . . . , n ? X ′ X θ = X ′ Y ? θ = ( X ′ X ) ? 1 X ′ Y \begin{aligned} \sum_{j=1}^{m}\left(h_{\theta}\left(x^{(j)}\right)x_i^{(j)}\right)&=\sum_{j=1}^{m}\left(y^{(j)}x_i^{(j)}\right),i=0,1,2,...,n \\ \Rightarrow \overrightarrow{x_i}X\theta&=\overrightarrow{x_i}Y,i=0,1,2,...,n \\ \Rightarrow X^{\prime}X\theta&=X^{\prime}Y \\ \Rightarrow \theta&=(X^{\prime}X)^{-1}X^{\prime}Y \end{aligned} j=1m?(hθ?(x(j))xi(j)?)?xi? ?Xθ?XXθ?θ?=j=1m?(y(j)xi(j)?),i=0,1,2,...,n=xi? ?Y,i=0,1,2,...,n=XY=(XX)?1XY?

向量到子空间的距离与最小二乘法

注意,为了迎合(线代/高代)的习惯,以下内容推导过程依旧使用常用的 A X = b AX=b AX=b符号,但在最后使用时,为了对多项式函数或多元函数各变量进行对应,将其修改为 X θ = Y X\theta=Y Xθ=Y的符号体系,请大家注意对应。

实数域上的线性方程组 A s × n X n × 1 = b s × 1 A_{s \times n}X_{n\times1}=b_{s\times1} As×n?Xn×1?=bs×1?大部分情况下 s > n s>n s>n无解,现在想找一个 X 0 X_0 X0?使得 ∣ A X 0 ? b ∣ \left|A X_{0}-b\right| AX0??b最小,这就是所谓的最小二乘法。

∣ A X 0 ? b ∣ ?最小? ? ?对于任意的? X ?都有? ∣ A X 0 ? b ∣ ≤ ∣ A X ? b ∣ ? A X 0 + b ⊥ U ?其中? U = { A X ∣ X ∈ R n } = L ( α 1 , ? ? , α n ) ? A X 0 ? b ⊥ α i ( i = 1 , 2 , ? ? , n ) ? ( α 1 ′ ? α n ′ ) ( A X 0 ? b ) = 0 ( i = 1 , 2 , ? ? , n ) ? A ′ ( A X 0 ? b ) = 0 ? A ′ A X 0 = A ′ b . \begin{aligned} \left|A X_{0}-b\right| \text { 最小 } & \Longleftrightarrow \text { 对于任意的 } X \text { 都有 }\left|A X_{0}-b\right| \leq|A X-b| \\ & \Longleftrightarrow A X_{0}+b \perp U \text { 其中 } U=\left\{A X \mid X \in \mathbb{R}^{n}\right\}=L\left(\alpha_{1}, \cdots, \alpha_{n}\right) \\ & \Longleftrightarrow A X_{0}-b \perp \alpha_{i}(i=1,2, \cdots, n) \\ & \Longleftrightarrow\left(\begin{array}{c} \alpha_{1}^{\prime} \\ \vdots \\ \alpha_{n}^{\prime} \end{array}\right)\left(A X_{0}-b\right)=0(i=1,2, \cdots, n) \\ & \Longleftrightarrow A^{\prime}\left(A X_{0}-b\right)=0 \\ & \Longleftrightarrow A^{\prime} A X_{0}=A^{\prime} b . \end{aligned} AX0??b?最小????对于任意的?X?都有?AX0??bAX?b?AX0?+bU?其中?U={AXXRn}=L(α1?,?,αn?)?AX0??bαi?(i=1,2,?,n)?????α1??αn??????(AX0??b)=0(i=1,2,?,n)?A(AX0??b)=0?AAX0?=Ab.?

若最小的 X 0 X_0 X0?存在,则一定满足 A ′ A X 0 = A ′ b A^{\prime} A X_{0}=A^{\prime} b AAX0?=Ab形式,现证明该方程组一定有解,原因是:

r ( A ′ A , A ′ b ) = r ( A ′ ( A , b ) ) ≤ r ( A ′ ) = r ( A ) . r\left(A^{\prime} A, A^{\prime} b\right)=r\left(A^{\prime}(A, b)\right) \leq r\left(A^{\prime}\right)=r(A) . r(AA,Ab)=r(A(A,b))r(A)=r(A).

同时 r ( A ′ A , A ′ b ) ≥ r ( A ′ A ) = r ( A ) r\left(A^{\prime} A, A^{\prime} b\right) \geq r\left(A^{\prime} A\right)=r(A) r(AA,Ab)r(AA)=r(A),这就说明:

r ( A ′ A , A ′ b ) = r ( A ) = r ( A ′ A ) . r\left(A^{\prime} A, A^{\prime} b\right)=r(A)=r\left(A^{\prime} A\right) . r(AA,Ab)=r(A)=r(AA).

因此要求解让 ∣ X θ ? Y ∣ \left|X \theta-Y\right| Xθ?Y取最小值的 θ \theta θ 只需求解 ( X ′ X ) ? 1 X ′ Y (X^{\prime}X)^{-1}X^{\prime}Y (XX)?1XY

最小二乘法与多项式拟合

以下展示自己编写最小二乘法拟合多项式与MATLAB自带函数 polyfit 拟合多项式的参数对比,注意,为了和MATLAB自带函数保持一致, θ \theta θ 向量变为第一个参数为 θ n \theta_n θn? ,最后一个参数为 θ 0 \theta_0 θ0? , X X X 矩阵也做了相应的调整:

% 最小二乘法多项式拟合

% 原三次函数+随机噪声
f=@(x)x.^3+6.*x.^2-2.*x+4+(rand(size(x))-.5).*20;

% 构造原始数据
x=-5:.1:5;
y=f(x);

% 自己写一个最小二乘
n=3;% 最高次数为三次
X=(x').^(n:-1:0);
theta1=((X'*X)\X'*y')';

% MATLAB自带多项式拟合
theta2=polyfit(x,y,n);

% 输出对比
disp(theta1)
disp(theta2)

% 一个小技巧,下面的写法能够快速将
% 参数向量变成有关x的多项式匿名函数
func=matlabFunction(poly2sym(theta1));

theta1=
0.9686 6.0178 -1.8845 4.3362
theta2=
0.9686 6.0178 -1.8845 4.3362

多项式拟合结果绘图:

% 绘图部分

% 保持坐标区域不刷新并添加网格
ax=gca;hold(ax,'on');grid(ax,'on');

% 绘制原数据点和拟合结果
plot(x,y,'o','MarkerFaceColor',[94,142,179]./255);
plot(x,func(x),'Color',[0,64,115]./255,'LineWidth',2);

% 修饰一下
ax.FontName='cambria';
ax.LineWidth=1.5;
ax.GridLineStyle='--';
ax.XColor=[1,1,1].*.3;
ax.YColor=[1,1,1].*.3;
ax.ZColor=[1,1,1].*.3;

在这里插入图片描述

最小二乘法与多元线性回归

以下展示自己编写最小二乘法进行多元线性回归与MATLAB自带函数 regress 进行多元线性回归的参数对比:

% 最小二乘法多元线性回归

% 原二元函数+随机噪声
f=@(x1,x2) 3.*x1+4.*x2+5+(rand(size(x1))-.5).*10;

% 构造原始数据
[x1,x2]=meshgrid(-5:.5:5,-5:.5:5);
y=f(x1,x2);

% 自己写一个最小二乘
X=[x1(:),x2(:),ones(size(x1(:)))];
theta1=((X'*X)\X'*y(:));

% MATLAB多元线性回归
theta2=regress(y(:),X);

% 输出对比
disp(theta1)
disp(theta2)

% 构造拟合结果的二元匿名函数
func=matlabFunction([sym('x1'),sym('x2'),1]*theta1);

theta1=
2.9285 4.0688 4.7520
theta2=
2.9285 4.0688 4.7520

多元线性回归结果绘图:

% 绘图部分

% 保持坐标区域不刷新并添加网格
ax=gca;hold(ax,'on');grid(ax,'on');

% 绘制原数据点和拟合结果
mesh(x1,x2,func(x1,x2),'FaceColor','flat','FaceAlpha',.8)
scatter3(x1(:),x2(:),y(:),20,'filled')

% 修饰一下
ax.FontName='cambria';
ax.LineWidth=1.5;
ax.GridLineStyle='--';
ax.XColor=[1,1,1].*.3;
ax.YColor=[1,1,1].*.3;
ax.ZColor=[1,1,1].*.3;
view(30,20)

在这里插入图片描述
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:16:53  更:2022-01-08 14:17:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 18:53:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码