以前在工作中遇到了一个数据错误的问题,顺便写下 用 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

[C#] 使用 Excel 和 Math.Net 进行曲线拟合和数据预测相关推荐

  1. 使用 Excel 和 Math.Net 进行曲线拟合和数据预测

    错误的数据# 上图是同一组探测器在同一天采集到的 19 次数据,总体来说重复性不错,但很明显最后 8 个探测器出了问题,导致采集到的数据在最后八个点一片混乱.即使把其中看起来最好的一组数据拿出来使用多 ...

  2. matlab 曲线拟合求导,基于matlab曲线拟合的数据预测分析

    龙源期刊网 http://www.doczj.com/doc/2f22f716cbaedd3383c4bb4cf7ec4afe05a1b148.html 基于matlab曲线拟合的数据预测分析 作者: ...

  3. EXCEL里的Trend函数如何做到数据预测?

    一.原函数 TREND(known_ y's,known_ x's,new_ x's,const) 二.参数说明 known_ y's:表示已知的y值.使用函数时,该函数可以是数组,也可以是指定单元格 ...

  4. matlab 预测曲线走势,基于matlab曲线拟合的数据预测分析

    [摘要]试验所得的数据一般为离散的,且不能直接用一般的方程去描述它们,这样给数据的分析和预测带来了极大的麻烦,本文针对股票数据的变化,使用matlab的多项式拟合,求导,以及预测功能,对股票的实时变化 ...

  5. matlab从excel中读取文件进行曲线拟合 并导出公式

    课题组需要做数据的处理,其中一项是做数据拟合,并导出公式.这是我第一次使用matlab,发现它并不难,而且利用好了就是很棒的工具,不应让它成为拦路虎.乘着现在暑假时期,空闲时间比较多,就多多了解一些. ...

  6. 配置导出MOSS2010列表数据到Excel并根据列表记录自动刷新数据

    第一章 简介 场景描述 根据最近客户的需求,他们需要自动维护MOSS2010列表数据导出到Excel的数据实时同步,就是列表添加记录后,导出的Excel列表自动同步数据过来. 第二章 配置方法 1. ...

  7. python pandas库读取excel/csv中指定行或列数据详解

    通过阅读表格,可以发现Pandas中提供了非常丰富的数据读写方法,下面这篇文章主要给大家介绍了关于python利用pandas库读取excel/csv中指定行或列数据的相关资料,需要的朋友可以参考下 ...

  8. oracle 统计一年中每个月数据总和_excel表格有每月数据 怎样统计全年的-用excel公式怎样计算每年每个月的数据总和?...

    excel表格中如何统计1月到12月的数据 我用的是Excel07版为你的表已经是存在的,并能力有限,所只能给你说下面这一种方法了,用着也单的!下边我做一个示范: 第一步 在Excel表格右侧空白任意 ...

  9. Python使用pandas读取两个或者多个excel文件(xlsx)并进行数据连接(join)合并两个或者多个excel的信息

    Python使用pandas读取两个或者多个excel文件(xlsx)并进行数据连接(join)合并两个或者多个excel的信息 目录

最新文章

  1. SPU表管理之删除SPU表数据
  2. java线程 打印_java多线程实现 5秒一次打印当前时间
  3. BigData之Hbase:Hbase数据管理的简介、下载、案例应用之详细攻略
  4. java构造器_Java构造器就是这么简单!
  5. kubectl apply -f_广州车展捷豹路虎参展阵容 全新F-PACE 路虎卫士90
  6. 【redis】redis基础命令,分布式锁,缓存问题学习大集合
  7. .net core精彩实例分享 -- 字符串处理
  8. 开源3问:95%的技术人都不知道的开源真相
  9. 英特尓祭出开挖数据价值的“六脉神剑”!
  10. 自定义“TB_定位访问”子类
  11. c# 字符串编码问题
  12. fckeditor for php 下载,PHP_FCKeditor的安装(PHP),1.下载新最版的FCKEditor,解压 2. - phpStudy...
  13. 设计类-Gliffy Diagram的安装使用
  14. 【python】《多媒体技术与应用》实验报告「数字图像基础」
  15. 青藏高原的气候类型及气候特征
  16. Java相关软件下载地址
  17. 采购杀毒软件 确保网络信息安全
  18. 阿里云mysql1227_Navicat连接阿里云Mysql遇到的的坑
  19. android 卸载预装软件,手机自带软件怎么卸载?安卓预装软件卸载方法
  20. c语言编程求百位和个位的差,对任意一个键盘输入的3位整数,求出它的个位、十位和百位。 一道c语言题目?...

热门文章

  1. 第11期 《大牛养成记》2017年1月刊
  2. 后缀xls和xlsx有什么区别,xls和xlsx怎么转换
  3. 大数据是什么?大数据的趋势?
  4. 计算机毕业设计 SSM网上宠物商店平台 网上宠物美容管理系统 网上宠物订购系统Java
  5. SOA(Service-Oriented Architecture)面向服务的分布式架构详解
  6. 浅谈Bootstrap
  7. Mysql+Navicat for Mysql安装步骤(超详细哦)
  8. 获取的文件大小转换成MB
  9. arcengine 开发经典帖(转)
  10. Python练习题 基本语法(1-18)一