请教一个多组数据点拟合的问题,需要用 Python 实现。

2017-05-18 11:45:28 +08:00
 iVeego

大约有 2000 个数据点,plot 出来基本是这样的。

需要写一个脚本,实现的功能是:输入所有点的横纵坐标,然后进行分段一次线性拟合(需要分成 9 段,也就是需要确定 10 个点的坐标),使得最终整体的残差值最小,想用 Python 实现。

最终的结果示意如图。

我之前使用 MATLAB 实现了,但是由于这个功能是整个项目的一部分,项目的整体是在用 Python,因此希望用 Python 实现。

之前的使用 MATLAB 实现的办法是:

  1. 使用 cftool 中的高斯拟合将 2000 个点拟合成 8 阶高斯曲线;
  2. 对拟合的曲线求二阶导数,然后找极值,极值绝对值较大的地方就是“弯曲”厉害的地方。从大到小排序,然后取包括前后端点在内的极值点的前十个,将十个点放在这些极值点的地方。 当然,实际写起来有些边界条件需要处理,这里就不详述了。

这个方法不是很优雅,而且效果不是很好。问题来了,Python 有没有更好的解决类似问题的办法?

提前感谢各位。

7367 次点击
所在节点    Python
19 条回复
staticor
2017-05-18 14:07:34 +08:00
试试 numpy.piecewise()


或者 google 一下 piecewise liearn fitting
staticor
2017-05-18 14:07:50 +08:00
@staticor linear fitting, typo.
omengye
2017-05-18 14:18:59 +08:00
为什么要分成 9 段呢,感觉 log 或者二次方程也能拟合地很好
iVeego
2017-05-18 14:48:29 +08:00
@omengye #3 因为拟合的结果需要应用在 FPGA 中,FPGA 计算资源有限,只能进行简单的线性拟合(转述 FPGA 工程师的话)
iVeego
2017-05-18 14:48:39 +08:00
@staticor #1 感谢,我去看看。
wildcat007
2017-05-18 15:11:12 +08:00
虽然不太懂,不知道这个里面有没有合适的
http://echarts.baidu.com/examples.html
am241
2017-05-18 15:15:20 +08:00
用一个浅层的使用 relu 激活函数的神经网络来过拟合

方法有点蛋疼
omengye
2017-05-18 15:15:58 +08:00
@iVeego 明白 感觉用普通的最小二乘也不太费资源…
EmdeBoas
2017-05-18 15:30:36 +08:00
额 神经网络+1
iVeego
2017-05-18 15:31:48 +08:00
@omengye #8 就是想用普通的最小二乘法,但是点太多而且非常乱,为了保证拟合效果需要分段。分段的话临界点的确认就是难点,目前就是要写(找)个算法解决这个问题。
hastelloy
2017-05-18 17:59:53 +08:00
对 numpy 不熟悉,以我朴素的数学知识瞎 bibi 下,
先锁定第一点 A 和最后一点 B,

然后假定加入中间的 i 点,变成 2 条线了,计算对应的方差 Di,确定第 3 个点 C=i, where Di= min D

再继续加入第 4 个点。。。。直到需要的点数,



2000 个数据点算起来应该也还好,最大问题可能是如果不巧的话,前面的点不好,后面的未必是最优的
ruoyu0088
2017-05-18 18:59:42 +08:00
ruoyu0088
2017-05-18 19:10:41 +08:00
我最近正好在入门 FPGA,你能说说拟合结果如何放到 FPGA 中运行吗? FPGA 的程序该怎么写?
iVeego
2017-05-18 19:46:42 +08:00
iVeego
2017-05-18 19:48:42 +08:00
@ruoyu0088 #12 感谢,我先看看。
@ruoyu0088 #13 FPGA 我是门外汉,这个帮不上忙了,抱歉。有其他的同学负责 FPGA。
iVeego
2017-05-18 19:50:09 +08:00
@hastelloy #11 链接乱了,可能是 MD 语法少了空格。再贴一次 [这个]( https://zh.wikipedia.org/zh-hans/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95)
hastelloy
2017-05-18 20:37:19 +08:00
@iVeego 这个是多元函数求极值的基本算法,具体到你这个问题好像不是很适用
sun19
2018-08-27 16:21:23 +08:00
请问您这里用的算法是什么呀,链接好像失效了,能再甩个链接吗,感谢
@ruoyu0088
@iVeego
iVeego
2018-08-28 11:19:27 +08:00
@sun19 #18 链接可用的,你再试试。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/362178

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX