项目需要拟合曲线,使用java实现。采用了apache-commons-math3实现自定义的曲线。
作为apache开源的搞数学计算的超强的库,一直不受市场重视。为啥呢?经过研究,使用java这个强制数据类型的语言搞数学计算真是不好玩,比起python的scipy或者matlab的nlinfit函数调用,java真是low爆了。这就是社会现实,数学虽然与编程语言无关,但是编程语言对数学的实现有难易之分。
进入主题,通过java的math3实现自定义的曲线拟合。流程是:先搞清楚怎么自定义曲线,再按照math3的jar包规范编写函数,求解到最佳参数。
先分析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方法