最小二乘法入门(Matlab直线和曲线拟合)

2023-10-30

参考博客:https://blog.csdn.net/wokaowokaowokao12345/article/details/72850143

多的就不多说了,持续脱发中!!!

最小二乘法历史起源之类的:https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/2522346?fr=aladdin

WiKi上说的:“"Least squares approximation" redirects here. It is not to be confused with Least-squares function approximation.”

最小二乘法做线性规划的理论好像高中就学了。最小二乘法做直线拟合,实际上就是现在给定了 n 个序列 xi ,而在 xi 下有对应的 yi ,这样也就组成了 n 个(x,y)这样的坐标点。最小二乘法就是要找到一条直线 L ,让这 n 个点与直线 L 的距离(残差,不是点到直线的垂线段距离)平方和最小。不知道叙述的准不准确,大概就是这样一个思想。

根据最小二乘原理(参考博客):

采用斜截式描述的直线方程:y=kx+b ,这种直线不适用于与y轴平行的直线。假设测得的数据对共 n>2 组,(x_{_{_{1}}},y_{1}),(x_{_{_{2}}},y_{2}),(x_{_{_{3}}},y_{3}),...(x_{_{_{n}}},y_{n}), n>2也就是说为了求解这个直线方程实际上只需要两个数据对,也就是两点确定一条直线,但是这样的直线对于实际的测量是不准确的,当 n>2 的时候,在理论上求解则因为条件数超出了方程未知数,因此是无解的,所以叫做超定方程。由于真值(理论值)是(y=kx_{i}+b),则将数据对代入,残差即为 y_{i}-y=y_{i}-kx_{i}-b ,由最小二乘方程:                                                                            

                                                                      minf=\sum_{i=1}^{n}(y_{i}-kx_{i}-b)^{2}

其实这里应该证明 f 是否存在最小值,根据方程可以看出,对于单变量,这是一个开口向上的抛物线,简单的证明就在这里说了。大家都知道为了求解方程的最小值,一种方法就是对方程求导,导数为 0 的地方就是极值,对于抛物线来说也是最值。这里变量有两个 k,b ,通过求偏导得出下述方程:

                                                      

真的不是我懒得打公式,CSDN公式编辑器抽风了,求和打不出来!!!!!这里的截图也是前面参考博客的。将上式展开得到:

                                                   

实际上,上述计算 k , b 的方程就是最小二乘线性拟合精华了。

依据上述模型,自己写了点Matlab代码供大家参考:

function [k,t] = user_define(ind,dp)
if length(ind)~= length(dp)
    disp('数组长度不等,请检查!');       % 要求 x,y 一一对应
end
% 最小二乘法的系数设置,参考数学模型
    a = ind*ind';
    b = sum(ind);
    c = ind*dp';
    d = sum(dp);
% 求解斜率k
k = (length(ind).*c-b*d)./(length(ind).*a-b*b);
% 求解截距t
t = (a.*d-c.*b)/(a*length(ind)-b.*b);
end

                                                              

这个函数实际上就是对模型写的,当然还可以调用 Matlab 内置的函数 polyfit :

% 设将要拟合的直线为 y = 2x+3,该直线为理想情况
% 现对直线上 x>0 随机取点20个,分别对应x[20] y[20]
clear
clc
%y = 2*x +3;
a = [1,5];  % 直线上的点(1,5)
b = [5,13];     % 直线上的点(5,13)
% 初始化参数,以提升计算效率
% 否则会提示警告:“变量似乎会随着迭代次数改变而变化,请预分配内存,以提高运行速度”
% t = zero(1,20);
% p = zero(1,20);
t(1) = 0;
p(1) = 0;
% 生成的t(i)和p(i)为直线上的随机点
for i = 1:20
    t(i) = rand(1,1)*5;
    p(i) = 2*t(i)+3;
end

% 对采集到的离散的t(i),p(i)加入wng(1,size(t),1)的高斯白噪声,生成的序列作为含误差的测量序列
t = sort(t);
p = sort(p);
% 采用带绝对值的高斯白噪声
% t_g = t + abs(wgn(1,20,0));
% p_g = p + abs(wgn(1,20,0));
% 使用(-1,1)的随机数来给测试序列添加噪声
% t_g = t + (rand(1,20)*2-1);
% p_g = p + (rand(1,20)*2-1);
% 高斯白噪声
t_g = t + wgn(1,20,0);
p_g = p + wgn(1,20,0);
% 最小二乘法对 t_g 和 p_g 拟合
% 这里才开始最小二乘法
% 首先使用Matlab内置的最小二乘函数 polyfit 进行多项式拟合,具体自己查help
% 注:type函数可帮助查看源代码
line1 = polyfit(t_g,p_g,1);
t_g2 = 1:0.1:5;
p_g2 = polyval(line1,t_g2);
plot(t_g,p_g,'o',t_g2,p_g2);
legend('拟合的曲线');
hold on
ideal_line = 2*t_g2+3;
plot(t_g2,ideal_line,'b');
legend('样本点','拟合的曲线','原直线');

                                                                 

以上仅供大家参考,转发请务必标明出处!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最小二乘法入门(Matlab直线和曲线拟合) 的相关文章

  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 同时重新排序和旋转图像的高效方法

    为了快速加载 jpeg 我为turbojpeg 实现了一个 mex wrapper 以有效地将 大 jpeg 读入 MATLAB 对于 4000x3000px 的图像 实际解码只需要大约 120 毫秒 而不是 5 毫秒 然而 像素顺序是 R
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 如何获取MATLAB句柄对象的ID?

    当我尝试使用时出现问题MATLAB 句柄对象 http www mathworks com help techdoc ref handle html作为关键值MATLAB 容器 Map http www mathworks com help
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 动态调整自定义刻度数

    Taking SO 的一个例子 https stackoverflow com a 7139485 97160 我想根据当前视图调整轴刻度 这是默认行为 除非设置自定义的刻度数 下图展示了由此产生的行为 左侧是默认行为 右侧是带有自定义刻度
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • Matlab 图像数据的 hist 函数

    我是 Matlab 新手 我想制作自己的函数 与 imhist 显示图像数据的直方图 完成相同的工作 但我对此完全是新手 我不知道如何做开发这样的功能 我开始做一些东西 但它非常不完整 function output args myhist
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • for 循环中的绘图没有可见点

    我正在努力解决我想使用 for 循环制作的情节 我知道当我在循环之后添加它时它会起作用 只是一个简单的图 但我想用另一种方式尝试一下 fib ones 1 10 for k 3 10 hold on fib k fib k 1 fib k
  • 获取向量幂的有效方法

    我编写了一个代码 在数值上使用勒让德多项式直至某个高 n 阶 例如 case 8 p 6435 x 8 12012 x 6 6930 x 4 1260 x 2 35 128 return case 9 如果向量x太长这会变得很慢 我发现说之
  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义
  • Matlab:3D 堆积条形图

    我正在尝试创建一个 3D 堆积条形图 如这个问题所示 Matlab 中的 3D 堆叠条形图 https stackoverflow com questions 13156133 3d stacked bars in matlab 5D 然而
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca
  • 将 kinect RGB 和深度值转换为 XYZ 坐标

    我正在寻找一种简单的方法将 kinect RGB 和深度值转换为 XYZ 坐标 使用 MATLAB 我的目标是一个输入为以下内容的函数 每个点的 RGB 和深度值Kinect相机 并输出 每个点的 x y 和 z 值 RGB 深度 RGB
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 将向量(或弧)绘制到玫瑰图上。 MATLAB

    我有两个数据集 其中详细列出了angles 我正在绘制玫瑰图 angles 0 8481065519 0 0367932161 2 6273740453 n 另一个 从这组角度详细说明方向统计 angle error 0 848106563

随机推荐

  • 【Vue2.0源码学习】生命周期篇-初始化阶段(initEvents)

    文章目录 1 前言 2 解析事件 3 initEvents函数分析 4 总结 1 前言 本篇文章介绍生命周期初始化阶段所调用的第二个初始化函数 initEvents 从函数名字上来看 这个初始化函数是初始化实例的事件系统 我们知道 在Vue
  • 关于setConnectTimeout和setReadTimeout的问题

    1 问题描述 这几天测试重构后的下载框架 发现在下载过程中如果网络中断或网络较差 个别应用的下载就会阻塞卡住 一直卡在 正在下载 xx 2 问题排查和定位 思考 网络差不应该报网络异常的错误或者直接抛timeout异常吗 所以马上去检查Ht
  • 我所不知道的TCP Socket编程(一)-简介+创建套接字

    Socket编程 套接字 Socket 连接起了数字世界 定义 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字 其用于标识客户端请求的服务器和服务 它是网络通信过程中端点的抽象表示 包含进行网络通信必需的五种信息 连接使用
  • MMU地址映射过程详细

    ARMv6 MMU简述 1 MMU由协处理器CP15控制 2 MMU功能 地址映射 VA gt PA 内存访问权限控制 3 虚拟地址到物理地址的转换过程 Micro TLB gt Main TLB gt Page Table Walk 址映
  • DVWA平台漏洞测试与源码分析(一)SQL注入

    DVWA平台是初学网络安全者了解十大漏洞的有效途径 此平台收集了当前威胁网络安全的最常见的十大漏洞 并且为各位初学者提供了靶场实验环境 我们可以利用此平台进行各种攻击实验 从而丰富自己对于Web安全的认识 这篇文章主要介绍了DVWA平台中的
  • 【Hello mysql】 mysql的内外连接 (重点)

    Mysql专栏 Mysql 本篇博客简介 介绍mysql的内外连接 mysql的内外连接 重点 内连接 显示SMITH的名字和部门名称 外连接 左外连接 右外连接 总结 表的内外连接是mysql中比较常用的内容 也是我们学习mysql的重点
  • Python str函数

    描述 str函数是Python的内置函数 它将参数转换成字符串类型 即人适合阅读的形式 语法 str object 名称 说明 备注 object 待被转换成字符串的参数 可省略的参数 返回值 返回object的字符串形式 使用示例 1 无
  • vue.js 输入框输入值自动过滤特殊字符替换中问标点

  • 搜寻吉祥数,在给定的范围内,例如1~99999,找出吉祥数字,满足的条件为:全部数字必须由6或者8构成,如66666,66668,668,…

    题目 在给定的范围内 例如1 99999 找出吉祥数字 满足的条件为 全部数字必须由6或者8构成 如66666 66668 668 1 一开始想的很杂 考虑了效率 把要查找的数转化成String再转化成char数组 逐个跟 6 8 比较 但
  • 随机变量列的四种收敛性

    极限定理是研究随机变量列的收敛性 在学习中遇到了随机变量列的四种收敛性 几乎处处收敛 a e 收敛 以概率收敛 P 收敛 依分布收敛 d 收敛 k阶矩收敛 下面是对它们的吐血整理 考虑一个随机变量列 n c为一个常数 由于随机性不能直接刻画
  • 基于stm32f103c8t6的定时器详解(持续更新)

    一 stm32f103系列定时器介绍 先声明 stm32f103c8t6中没有基本定时器 只有TIM1 TIM4 分别是高级定时器和通用定时器 对照下图请自行阅读stm32f103x的datasheet 1 定时器功能 定时 输出比较 输入
  • Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘commit‘)

    问题 使用vuex的时候 调用this store commit 方法名 参数 的时候 报了这个错 搜索到的解决方法都是在说什么store没在main js里vue实例中挂载 而我 已经挂得好好的了 给我气坏了 解决策略 我问题在于 没有把
  • Vue开发环境搭建和vue-cli脚手架

    vue本质是一个js脚本 提供了一个前端框架 在开发时 可以直接引入这个js脚本 也可以使用脚手架工具 在本地搭建一个项目 Vue js安装 方法一 在 Vue js 的官网上直接下载 vue min js 并用
  • 质量铁三角

    文章目录 质量铁三角 1 流程 2 技术 3 组织 质量铁三角 1 流程 从计划到策略的实现 流程就是按照这种思维方式指导软件开发的 并且流程来源于成功的经验 可以指导项目少走弯路 从而提高软件质量 不仅如此 流程还对项目的成本和进度控制有
  • 树的Hash方法?

    写这篇博文的主要还是因为自己菜得抠脚 弱校联盟的十一专场的第三天是JAG Practice Contest for ACM ICPC Asia Regional 2016 其中的E题大意是给一颗有根树 问有多少对子树每个深度的节点数都相同
  • 【C语言】顺序表的创建

    一 代码实现部分 1 顺序表是线性表的基础部分 至于顺序表 在本人看来无异于数组 至于线性表的概念 在此不再赘述 接下来尝试利用C语言对线性表中的顺序表进行代码实现 此程序中规定用户输入的数据类型为int类型 typedef struct
  • one大白陪你聊聊2021年总结

    我的2021 工作方面 感情方面 生理方面 心理方面 生活方面 重要的事情 工作方面 21年换了一份工作 薪资有了一点提升 技术方面提升有些缓慢 直到21年底才想起 察觉到自己对于技术方面今天没咋进步 开始每周的技术提升计划 一周学习8小时
  • 数据分析与挖掘(十八)------挖掘建模之时序模式

    一 引言 就餐饮企业而言 经常会碰到如下问题 由于餐饮行业是生产和销售同时进行 因此销售预测对于餐饮企业十分必要 如何基于菜品历史销售数据 做好餐饮销售预测 以便减少菜品脱销现象和避免因备料不足而造成的生产延误 从而减少菜品生产等待时间 提
  • 怎么彻底删除电脑上的软件_如何用一行代码彻底删除电脑捆绑的流氓软件!

    你是否有过这样的烦恼 只想下载软件A 一个不小心给我捆绑了B C D E F等等我不需要的流氓全家桶软件 那是相当的痛苦啊 删除又删除不干净 这可如何是好 今天我们一起来看如何一行代码就可以将这些流氓捆绑软件全部找出并彻底清理
  • 最小二乘法入门(Matlab直线和曲线拟合)

    参考博客 https blog csdn net wokaowokaowokao12345 article details 72850143 多的就不多说了 持续脱发中 最小二乘法历史起源之类的 https baike baidu com