A guide to perform 2D Gauss Fitting ~

    无论是做科研或是工程,当你得到大量的数据后都会自然的想到去分析这么一大堆数据都有着何种微妙的联系。

数据拟合可以快速的得到一种数学模型,来描述现有的数据。最近的一些工作也牵扯到一些拟合的问题,记录一下,主要是

二维高斯拟合为例

    如果单是应用,我想Igor是个很不错的选择。它可以很方便的进行数据的可视化,给出数据的统计学参数以及进行数据

拟合。发paper的话,用它作图也很不错。

    如果对于开发而言,经过这些天的调研实践,我也给出一些建议吧~~ :)

    MATLAB当然是我的首选,平日里用的最多。自带的cftool涵盖了大部分常见的函数模型,而且支持用户自定义函数,

非常实用。当然如果是开发模块嵌入自己的程序中,也不是很难,推荐一段网上很流行的matlab代码

    如果你使用python scipy库肯定是你的首选,它也依赖Numpy~~如果你熟悉python的话,可以很快的利用scipy做出

非常漂亮的图出来。顺便推荐一下matplotlib,是一个很不错的绘图库,应该scipy就是用的它吧。针对本人做二维高斯拟合,也

给出一个参考链接

    采用MATLABPython是可以很快的得到结果,单是对于大规模的数据而言速度就成了限制性因素了。简单介绍一下JAVA以及

c、c++以及Fortran下一些著名的数值计算的库,以及自己的2D Gauss Fitting的实现。

    首先使用后面这些开发语言,就不像MATLAB, Python那样便捷,这就要求你或多或少对数据拟合的算法有些了解,我采用的是

Levenberg-Marquardt非线性最小二乘法~(我的理解,拟合就是一个最优化问题,自己构造一个函数,求解该函数在何种情况下

达到最小值)。LM算法网上也有很多介绍,可以google了解一下。

     JAVA: java中数值运算库比较有名的例如JScience, jHelpWork,JMathLib,小一点的库比如JAMA(java matrix pakage), AIDA

等等。jHelpWork数据拟合的例程中有二维高斯拟合的jython实现,可以参考。我主要介绍另外一个更便捷的,轻量级的实现方法。

算法雏形 在此,我用的是Janne Holopainen的方法。只需要两个文件,按照提示根据自己的函数实现(implement)其中的接口

(interface)即可--主要是写出自己要实现的函数以及对应的一阶偏导数。不过我自己也是从11点到凌晨四点,花了五个小时才搞定的高斯拟合的实现。

      Fortran语言现在恐怕用的不多了,单是LAPACK(基于fortran90开发)无疑还是最快的数值计算的库,大概比c\c++实现

快20%左右?包括MATLAB,CUDA(GPU)中的数值计算部分都来自于LAPACK。好在现在都有了LAPACK的c实现CLAPACK ,

以及c++实现LAPACK++ ,以及JAVA实现jLAPACK 。另外Blitz++也是一个不错的面向对象的科学计算库。

      同样针对我的高斯拟合的问题,我选择levmar来实现LM算法。这是一个专门实现LM算法的免费的c/c++库,同时还给出了

如何在python,matlab,perl,haskell中调用lermar的方法。

      另外ALGLIB也是一个跨平台的数值计算和数据处理的库,它支持c++,c#,pascal,VBA~其中还包含专门的LM算法。

      数值计算确实是一个令人头疼的问题,期间牵扯着众多的数学理论,数学公式,而使很多人望而却步~包括自己。希望站在前人的

肩膀上,我们一起走的更远。

posted @ 2011-01-04 13:08  bei  阅读(1339)  评论(0编辑  收藏  举报