大约有 2000 个数据点,plot 出来基本是这样的。
需要写一个脚本,实现的功能是:输入所有点的横纵坐标,然后进行分段一次线性拟合(需要分成 9 段,也就是需要确定 10 个点的坐标),使得最终整体的残差值最小,想用 Python 实现。
最终的结果示意如图。
我之前使用 MATLAB 实现了,但是由于这个功能是整个项目的一部分,项目的整体是在用 Python,因此希望用 Python 实现。
之前的使用 MATLAB 实现的办法是:
这个方法不是很优雅,而且效果不是很好。问题来了,Python 有没有更好的解决类似问题的办法?
提前感谢各位。
1
staticor 2017-05-18 14:07:34 +08:00 1
试试 numpy.piecewise()
或者 google 一下 piecewise liearn fitting |
3
omengye 2017-05-18 14:18:59 +08:00 via Android
为什么要分成 9 段呢,感觉 log 或者二次方程也能拟合地很好
|
4
iVeego OP @omengye #3 因为拟合的结果需要应用在 FPGA 中,FPGA 计算资源有限,只能进行简单的线性拟合(转述 FPGA 工程师的话)
|
6
wildcat007 2017-05-18 15:11:12 +08:00
虽然不太懂,不知道这个里面有没有合适的
http://echarts.baidu.com/examples.html |
7
am241 2017-05-18 15:15:20 +08:00 via Android
用一个浅层的使用 relu 激活函数的神经网络来过拟合
方法有点蛋疼 |
9
EmdeBoas 2017-05-18 15:30:36 +08:00
额 神经网络+1
|
10
iVeego OP @omengye #8 就是想用普通的最小二乘法,但是点太多而且非常乱,为了保证拟合效果需要分段。分段的话临界点的确认就是难点,目前就是要写(找)个算法解决这个问题。
|
11
hastelloy 2017-05-18 17:59:53 +08:00 via Android
对 numpy 不熟悉,以我朴素的数学知识瞎 bibi 下,
先锁定第一点 A 和最后一点 B, 然后假定加入中间的 i 点,变成 2 条线了,计算对应的方差 Di,确定第 3 个点 C=i, where Di= min D 再继续加入第 4 个点。。。。直到需要的点数, 2000 个数据点算起来应该也还好,最大问题可能是如果不巧的话,前面的点不好,后面的未必是最优的 |
12
ruoyu0088 2017-05-18 18:59:42 +08:00 1
|
13
ruoyu0088 2017-05-18 19:10:41 +08:00
我最近正好在入门 FPGA,你能说说拟合结果如何放到 FPGA 中运行吗? FPGA 的程序该怎么写?
|
14
iVeego OP @hastelloy #11 这的确是个好思路,我找到了[这个]( https://zh.wikipedia.org/zh-hans/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95)算法,还需要进一步想想。
|
15
iVeego OP |
16
iVeego OP @hastelloy #11 链接乱了,可能是 MD 语法少了空格。再贴一次 [这个]( https://zh.wikipedia.org/zh-hans/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95)
|