關於java實現自定義曲線擬合的研究

項目須要擬合曲線,使用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。學習

【總結】優化

  1. java實現曲線擬合太麻煩,不建議使用,可是項目須要的話,用java調用其餘語言實現擬合併返回結果然心的慢(好比java調python獲得輸入流,很是慢)
  2. java搞梯度太繁瑣,遠不如其餘語言,真心的心累呀。
相關文章
相關標籤/搜索