[C#] 使用 Excel 和 Math.Net 进行曲线拟合和数据预测
from :https://www.cnblogs.com/dino623/p/curve_fitting_and_data_prediction_using_math_net.html
以前在工作中遇到了一个数据错误的问题,顺便写下 用 Math.Net 解决的思路。
1. 错误的数据
上图是同一组探测器在同一天采集到的 19 次数据,总体来说重复性不错,但很明显最后 8 个探测器出了问题,导致采集到的数据在最后八个点一片混乱。即使把其中看起来最好的一组数据拿出来使用多项式拟合,也可以看出最后几个点没有落在拟合曲线上(只拟合最后 14 个点):
虽然我知道这是硬件问题,但是遇到事情不能坐以待毙,软件方面也许可以做些什么。既然我从上图中得知出了最后几个点之外,其它数据都在拟合曲线上,那我可以使用前面几个点的拟合结果预测后面几个点并替换掉出错的数据,从而得到一组看起来正常的数据。
2. 曲线拟合与数据预测
曲线拟合(curve fitting)是指选择适当的曲线类型来拟合观测数据,以便观察两组数据之间的内在联系,了解数据之间的变化趋势。
在数据分析时,我们有时需要通过已有数据来预测未来数据。在一些复杂的数据模型中,数据维度很多,数据之间的关系很复杂,我们可能会用到深度学习的算法。但是在一些简单的数据模型中,数据之间有很明显的相关性,那我们就可以使用简单的曲线拟合来预测未来的数据。
这些工作都可以使用 Excel 完成,先来尝试一下。把某组数据最后14个点(只选取峰值右边的14个点是因为容易计算)放进Excel中,插入一个散点图,右键点击其中的蓝色散点,选择添加趋势线
:
然后在右侧出现的设置趋势线格式
中选择多项式
,阶数为 3,勾选显示公式
:
可以看到,曲线图中出现了一条虚线的曲线,并显示了对应的公式为 y = 6E-07x3 + 0.0002x2 - 0.0072x + 0.0637
:
如果需要预测数据,可以修改前推
数字以得到后面几个周期的数据。
3. 使用 Math.Net 进行曲线拟合
当然我不可能对每一条数据都扔进 Excel 里进行拟合。在 C# 中我们可以使用 Math.Net 进行非线性拟合。
Math.Net 是一个开源项目,旨在构建和维护涵盖基础数学的工具箱,以满足 .Net 开发人员的高级需求和日常需求。其中 Math.NET Numerics 旨在为科学、工程和日常使用中的数值计算提供方法和算法。涵盖的主题包括特殊函数,线性代数,概率模型,随机数,插值,积分变换等等。
要使用 Math.NET Numerics,首先安装它的 Nuget 包:
Copy
Install-Package MathNet.Numerics
Math.NET Numerics 提供了 Fit.Polynomial
函数用作多项式拟合,如以下代码所示,其中 X
是 X 轴的数组, Y
是 Y 轴的数组, 函数的第三个参数是多项式的阶数,这里用 2 作为阶数。
Copy
double[] X = Enumerable.Range(1, 6).Select(r => (double)r).ToArray();
double[] Y = values.ToArray();
double[] parameters = Fit.Polynomial(X, Y, 2);
返回的结果是最佳拟合参数的数组 [p0,p1,p2,…,pk]
,将其带入公式 p0 + p1×x + p2×x2 + ... + pk×xk
即可算出对应的拟合数据。完整的代码如下,在这个示例里,我只需要用倒数第9到14个数据,通过 Fit.Polynomial
获得一个多项式的方程 ( f(x) = p0 + p1×x + p2×x2
),然后用这个方程计算出后面 8 个点的数据替换原本出错的数据:
Copy
double[] X = Enumerable.Range(1, 6).Select(r => (double)r).ToArray();
double[] Y = values.ToArray();
double[] parameters = Fit.Polynomial(X, Y, 2);
List<double> result = new List<double>();
for (int i = 1; i < 15; i++)
{
result.Add(parameters[0] + parameters[1] * i + parameters[2] * i * i );
}
for (int i = 0; i < 8; i++)
{
data[data.Count - 1 - i] = result[result.Count - 1 - i];
}
替换后的结果如上所示,整体符合前面数据的趋势,使用这组数据进行运算也能得到很好的结果。
4. 最后
Math.Net 是一个强大的项目,这篇文章只介绍了它所有功能的冰山一角。想了解更多可以参考官方文档,或参考博客园上的文章,例如:
【目录】开源Math.NET基础数学类库使用总目录 - 数据之巅 - 博客园
5. 参考
Math.NET Numerics
Curve Fitting Linear Regression
【目录】开源Math.NET基础数学类库使用总目录 - 数据之巅 - 博客园
数据预测与曲线拟合 - 知乎
6. 源码#
https://github.com/DinoChan/SimpleDataPrediction
相关文章
- excel的C#操作教程
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
- 如何使用T-SQL备份还原数据库及c#如何调用执行? C#中索引器的作用和实现。 jquery控制元素的隐藏和显示的几种方法。 localStorage、sessionStorage用法总结 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一) span<T>之高性能字符串操作实测
- .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
- 百度地图和高德地图坐标系的互相转换 四种Sandcastle方法生成c#.net帮助类帮助文档 文档API生成神器SandCastle使用心得 ASP.NET Core
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- 装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接成字符串 快递查询 C# 通过smtp直接发送邮件 C# 带参访问接口,WebClient方式 C# 发送手机短信 文件 日志 写入 与读取
- 使用C#或javascript将Table里的数据导出到Excel
- C# 插件热插拔 .NET:何时应该 “包装异常”? log4.net 自定义日志文件名称
- 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)
- C# IL DASM 使用-破解c#软件方法
- C#使用oledb连接excel运行Insert Into语句出现“操作必须使用一个可更新的查询”的解决的方法
- [C#] 使用 Excel 和 Math.Net 进行曲线拟合和数据预测
- C#-利用NOPI处理Excel的代码
- Excel VLOOKUP实用教程之 05 vlookup如何从列表中获取最后一个值?(教程含数据excel)
- Excel VLOOKUP实用教程之 04 vlookup如何实现三变量查找,三个条件字段查询数据?(教程含数据excel)
- Excel VLOOKUP实用教程之 02 vlookup如何双向查找,两个字段查询数据?(教程含数据excel)
- Excel VLOOKUP实用教程之 07 vlookup如何解决肉眼看完全匹配,但是就是返回N/A错误(教程含数据excel)
- 基于C#语言利用Microsoft.office.introp.excel操作Excel总结
- Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
- C# NPOI 导入与导出Excel文档 兼容xlsx, xls
- 《C#零基础入门之百识百例》(九十六)本地数据交互 -- 读写Excel表格文件