项目须要拟合曲线,使用java实现。采用了apache-commons-math3实现自定义的曲线。java
做为apache开源的搞数学计算的超强的库,一直不受市场重视。为啥呢?通过研究,使用java这个强制数据类型的语言搞数学计算真是很差玩,比起python的scipy或者matlab的nlinfit函数调用,java真是low爆了。这就是社会现实,数学虽然与编程语言无关,可是编程语言对数学的实现有难易之分。python
进入主题,经过java的math3实现自定义的曲线拟合。流程是:先搞清楚怎么自定义曲线,再按照math3的jar包规范编写函数,求解到最佳参数。apache
- 先分析jar包封装好的多项式拟合与高斯分布的拟合,看源码,知道都包含了两个函数
public double[] gradient(double x, double... parameters){}编程
public double value(double x, double... parameters){}数组
基于我学习的既有经验,value函数是搞预测的,输入x与超参数获得计算值;而gradient是求梯度的,经过多项式函数的源码初步肯定该函数对每一个超参数求偏导,经过高斯分布的gradient函数肯定高斯函数的gradient就是对每一个参数求偏导。其中高斯函数把参数由俩(均值、方差)变成了仨(系数norm、均值、方差),直接致使了求偏导的时候返回三个梯度。编程语言
- 自定义曲线函数 y = a*x.^2+b.*log(c*c.*x)+c./(1+exp(x))
编写java类,实现ParametricUnivariateFunction的接口,重写value与gradient方法,在value里实现公式,在gradient方法里实现公式在x处对abc的分别求导,返回长度为三的数组。此处不列代码了,自己用java搞这个的就很少,就不显摆了。函数
- 调用函数
建立优化器GaussNewtonOptimizer,曲线拟合对象CurveFitter;使用函数建立一组xy数组,并在y上加噪声;拟合函数,求解获得最优的abc。学习
【总结】优化
- java实现曲线拟合太麻烦,不建议使用,可是项目须要的话,用java调用其余语言实现拟合并返回结果然心的慢(好比java调python获得输入流,很是慢)
- java搞梯度太繁琐,远不如其余语言,真心的心累呀。