请教一个多组数据点拟合的问题,需要用 Python 实现。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
iVeego
V2EX    Python

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

  •  
  •   iVeego 2017-05-18 11:45:28 +08:00 7907 次点击
    这是一个创建于 3069 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    原始数据

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

    最终的结果示意如图。

    拟实现效果

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

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

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

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

    提前感谢各位。

    第 1 条附言    2017-07-02 20:03:32 +08:00
    感谢 @ruoyu0088 提供的连接,那个算法完美的解决了我遇到的问题。再次致谢。
    19 条回复    2018-08-28 11:19:27 +08:00
    staticor
        1
    staticor  
       2017-05-18 14:07:34 +08:00   1
    试试 numpy.piecewise()


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

    方法有点蛋疼
    omengye
        8
    omengye  
       2017-05-18 15:15:58 +08:00 via Android
    @iVeego 明白 感觉用普通的最小二乘也不太费资源…
    EmdeBoas
        9
    EmdeBoas  
       2017-05-18 15:30:36 +08:00
    额 神经网络+1
    iVeego
        10
    iVeego  
    OP
       2017-05-18 15:31:48 +08:00
    @omengye #8 就是想用普通的最小二乘法,但是点太多而且非常乱,为了保证拟合效果需要分段。分段的话临界点的确认就是难点,目前就是要写(找)个算法解决这个问题。
    hastelloy
        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 个数据点算起来应该也还好,最大问题可能是如果不巧的话,前面的点不好,后面的未必是最优的
    ruoyu0088
        12
    ruoyu0088  
       2017-05-18 18:59:42 +08:00   1
    ruoyu0088
        13
    ruoyu0088  
       2017-05-18 19:10:41 +08:00
    我最近正好在入门 FPGA,你能说说拟合结果如何放到 FPGA 中运行吗? FPGA 的程序该怎么写?
    iVeego
        14
    iVeego  
    OP
       2017-05-18 19:46:42 +08:00
    iVeego
        15
    iVeego  
    OP
       2017-05-18 19:48:42 +08:00
    @ruoyu0088 #12 感谢,我先看看。
    @ruoyu0088 #13 FPGA 我是门外汉,这个帮不上忙了,抱歉。有其他的同学负责 FPGA。
    iVeego
        16
    iVeego  
    OP
       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
        17
    hastelloy  
       2017-05-18 20:37:19 +08:00/span>
    @iVeego 这个是多元函数求极值的基本算法,具体到你这个问题好像不是很适用
    sun19
        18
    sun19  
       2018-08-27 16:21:23 +08:00
    请问您这里用的算法是什么呀,链接好像失效了,能再甩个链接吗,感谢
    @ruoyu0088
    @iVeego
    iVeego
        19
    iVeego  
    OP
       2018-08-28 11:19:27 +08:00
    @sun19 #18 链接可用的,你再试试。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5833 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 03:28 PVG 11:28 LAX 20:28 JFK 23:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86