已知一组(二维)数据,即平面上的 nn 个点 $(x\_i,y\_i),\\quad \\forall i = 1,2,\\cdots,n$ , xix_i 互不相同,寻求一个函数(曲线) f(x)f(x) ,使得 f(x)f(x) 在某种意义(准则)下与所有的数据点最为接近,这个过程就是数据拟合
一般情况下,我们指的“准则”就是线性最小二乘法,线性最小二乘法是解决曲线拟合最常用的方法
本文的符号中,字母上加 ^ 符号表示拟合值
我们假设通过拟合得到的线性函数是:yi^=k^xi+b^\widehat{y_i} = \widehat{k}x_i+\widehat{b}
那么经过最小二乘法确定参数的方法就是:k^,b^=argk,bmin(∑i=1n|yi−yi^|)\widehat{k},\widehat{b}=arg_{k,b}min(\sum_{i=1}^n|y_i-\widehat{y_i}|)
经过数学推导,可以得到线性最小二乘法拟合的参数求解公式:
Image
Image
事实上,拟合的方法远不止线性拟合,这里先以线性拟合作为引子
这里直接粘贴写在另一篇笔记中的内容:
拟合不要求过已知的数据点(插值则要求),而是按某种意义下(一般是最小二乘意义下)得到和所有点的分布最“接近”的函数
插值和拟合在使用时需要进行区分,根据不同的使用情景来确定不同的方法
我们一般依据下面三个指标来确定拟合的好坏:
误差平方和:SSE=∑i=1n(yi−yi^)2SSE = \sum_{i=1}^n(y_i-\widehat{y_i})^2
根据误差平方和还能给出均方差的计算公式
MSE=SSEn=1n∑i=1n(yi−yi^)2MSE = \frac{SSE}{n} = \frac{1}{n}\sum_{i=1}^n(y_i-\widehat{y_i})^2
回归平方和:SSR=∑i=1n(yi^−y¯)2SSR = \sum_{i=1}^n(\widehat{y_i}-\overline{y})^2
总体平方和:SST=∑i=1n(yi−y¯)2SST = \sum_{i=1}^n(y_i-\overline{y})^2
不难看出会有:SST=SSE+SSRSST=SSE+SSR
我们可以用可以用拟合优度(可决系数)作为拟合好坏的评价指标:
0≤R2=SSRSST=SST−SSESST≤10 \leq R^2 = \frac{SSR}{SST} = \frac{SST-SSE}{SST} \leq 1
那么, SSRSST\frac{SSR}{SST} 越大,即 R2R^2 越接近 11 ,就有误差越小,拟合效果越好
ATTENTION:使用这种评价标准要求参数是一次的,在设计拟合函数时应该注意
polyfit
coeff = polyfit(x_sample, y_sample, degree)
coeff
是多项式的系数数组y_output = polyval(ceoff, x_input)
y_output
是多项式的因变量值数组以下代码保存在 polyfit_test.m
中,可前往 GitHub 仓库下载
x_sample = [1 2 3 4 5 6 7 8 9];
y_sample = [9 7 6 3 -1 2 5 7 20];
plot(x_sample, y_sample, 'bo');
hold on;
coeff = polyfit(x_sample, y_sample, 3); %三阶多项式拟合
x_input = 0:.2:10;
y_output = polyval(coeff, x_input); %求对应y值
plot(x_input, y_output, 'r-');
输出结果如下,蓝色散点图表示输入样本点,红色实线表示拟合函数
fit
注意:在MATLAB
中还有一个叫做ninfit
的函数,两个函数有一定的区别,这里只介绍fit
fit
函数也是在曲线拟合工具箱Curve Fitting Toolbox
中采用的函数
[fitresult, gof] = fit( xData, yData, fit_type, options );
不一定是 xx 轴坐标,也可以是 x,yx,y 两轴坐标合并为一个数组作为自变量,如下[fitresult, gof] = fit( [xData, yData], zData, ft, 'Normalize', 'on' );
fittype
函数处理,如下fit
函数已经内置的类型,直接使用 ft = fittype( 'gaussl' ); % 高斯拟合
fit
函数已经内置的类型,而是我们自己新定义的类型,那么可以如下操作 % 下面采用匿名函数的方法进行定义,但你并不需要精通掌握匿名函数的规则,只需要知道下面的格式和规则
% 命名格式是:fittype(@(参数列表) 拟合函数形式)
% 注意自变量必须是 x
% 注意参数要放在自变量前面,在下面的代码中,匿名函数参数的形式为(a, b, c, x),便遵循了这一规则
ft = fittype(@(a, b, c, x) a*x^3 + b* x^2 + c*x );
如何使用这两个返回值会在(五)中介绍,它们等价于(五)中的fittedmodel
和goodness
以下代码保存在 fit_test1.m
中,可前往 GitHub 仓库下载
function [fitresult, gof] = fit_test2(x_sample, y_sample, z_sample)
%CREATEFIT(X_SAMPLE,Y_SAMPLE,Z_SAMPLE)
% 创建一个拟合。
%
% 要进行 '傅里叶拟合2' 拟合的数据:
% X 输入: x_sample
% Y 输入: y_sample
% Z 输出: z_sample
% 输出:
% fitresult: 表示拟合的拟合对象
% gof: 带有拟合优度信息的结构体
%% 拟合: '傅里叶拟合2'。
[xData, yData, zData] = prepareSurfaceData( x_sample, y_sample, z_sample );
% 设置 fittype 和选项。
ft = 'linearinterp';
% 对数据进行模型拟合。
[fitresult, gof] = fit( [xData, yData], zData, ft, 'Normalize', 'on' );
用图窗显示结果如下
没有安装该应用需要提前安装:Curve Fitting Toolbox
这个工具箱事实上是调用了MATLAB
的内置函数,并且提供了方便可视化界面和绘图操作
利用工具箱进行函数的操作非常容易,简要步骤如下:
>> x_sample = [1 2 3 4 5 6 7 8 9];
>> y_sample = [9 7 6 3 -1 2 5 7 20];
>> x_input = 0:.2:10;
该工具箱能够自动导出拟合优度,如下:
下图为拟合图窗
拟合模型可以导出到工作区,然后直接作为函数调用
fittedmodel
,就能够直接在命令行中输入 >> fittedmodel(x_input)
进行预测,其中 x_input
指的是待预测数组,这个函数将输出预测得到的值 y_output
,直接在命令行中输入 >> fittedmodel
也可以直接查看拟合的函数模型goodness
,可以直接在命令行中输入 >> goodness
查看拟合优度结构体字段本文使用 Zhihu On VSCode 创作并发布
原网址: 访问
创建于: 2023-08-16 16:05:18
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论