日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

最小二乘法多项式拟合的Java实现--转

發布時間:2025/4/5 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小二乘法多项式拟合的Java实现--转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址:http://blog.csdn.net/funnyrand/article/details/46742561

背景

由于項目中需要根據磁盤的歷史使用情況預測未來一段時間的使用情況,決定采用最小二乘法做多項式擬合,這里簡單描述下:

?

假設給定的數據點和其對應的函數值為 (x1, y1), (x2, y2), ... (xm, ym),需要做的就是得到一個多項式函數

f(x) = a0 * x + a1 * pow(x, 2) + .. + an * pow(x, n),使其對所有給定x所計算出的f(x)與實際對應的y值的差的平方和最小,

也就是計算多項式的各項系數 a0, a1, ... an.

?

根據最小二乘法的原理,該問題可轉換為求以下線性方程組的解:Ga =?B

所以從編程的角度來說需要做兩件事情,1,確定線性方程組的各個系數,2,解線性方程組

確定系數比較簡單,對給定的 (x1, y1), (x2, y2), ... (xm, ym) 做相應的計算即可,相關代碼:

private void compute() {

...

}

解線性方程組稍微復雜,這里用到了高斯消元法,基本思想是通過遞歸做矩陣轉換,逐漸減少求解的多項式系數的個數,相關代碼:

private double[] calcLinearEquation(double[][] a, double[] b) {

...

}

?

Java代碼

[java]?view plaincopy
  • package?com.my.study.algorithm.leastSquareMethod;??
  • ??
  • /**?
  • ?*?Least?square?method?class.?
  • ?*/??
  • public?class?LeastSquareMethod?{??
  • ??
  • ????private?double[]?x;??
  • ????private?double[]?y;??
  • ????private?double[]?weight;??
  • ????private?int?n;??
  • ????private?double[]?coefficient;??
  • ??
  • ????/**?
  • ?????*?Constructor?method.?
  • ?????*??
  • ?????*?@param?x?
  • ?????*????????????Array?of?x?
  • ?????*?@param?y?
  • ?????*????????????Array?of?y?
  • ?????*?@param?n?
  • ?????*????????????The?order?of?polynomial?
  • ?????*/??
  • ????public?LeastSquareMethod(double[]?x,?double[]?y,?int?n)?{??
  • ????????if?(x?==?null?||?y?==?null?||?x.length?<?2?||?x.length?!=?y.length??
  • ????????????????||?n?<?2)?{??
  • ????????????throw?new?IllegalArgumentException(??
  • ????????????????????"IllegalArgumentException?occurred.");??
  • ????????}??
  • ????????this.x?=?x;??
  • ????????this.y?=?y;??
  • ????????this.n?=?n;??
  • ????????weight?=?new?double[x.length];??
  • ????????for?(int?i?=?0;?i?<?x.length;?i++)?{??
  • ????????????weight[i]?=?1;??
  • ????????}??
  • ????????compute();??
  • ????}??
  • ??
  • ????/**?
  • ?????*?Constructor?method.?
  • ?????*??
  • ?????*?@param?x?
  • ?????*????????????Array?of?x?
  • ?????*?@param?y?
  • ?????*????????????Array?of?y?
  • ?????*?@param?weight?
  • ?????*????????????Array?of?weight?
  • ?????*?@param?n?
  • ?????*????????????The?order?of?polynomial?
  • ?????*/??
  • ????public?LeastSquareMethod(double[]?x,?double[]?y,?double[]?weight,?int?n)?{??
  • ????????if?(x?==?null?||?y?==?null?||?weight?==?null?||?x.length?<?2??
  • ????????????????||?x.length?!=?y.length?||?x.length?!=?weight.length?||?n?<?2)?{??
  • ????????????throw?new?IllegalArgumentException(??
  • ????????????????????"IllegalArgumentException?occurred.");??
  • ????????}??
  • ????????this.x?=?x;??
  • ????????this.y?=?y;??
  • ????????this.n?=?n;??
  • ????????this.weight?=?weight;??
  • ????????compute();??
  • ????}??
  • ??
  • ????/**?
  • ?????*?Get?coefficient?of?polynomial.?
  • ?????*??
  • ?????*?@return?coefficient?of?polynomial?
  • ?????*/??
  • ????public?double[]?getCoefficient()?{??
  • ????????return?coefficient;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?Used?to?calculate?value?by?given?x.?
  • ?????*??
  • ?????*?@param?x?
  • ?????*????????????x?
  • ?????*?@return?y?
  • ?????*/??
  • ????public?double?fit(double?x)?{??
  • ????????if?(coefficient?==?null)?{??
  • ????????????return?0;??
  • ????????}??
  • ????????double?sum?=?0;??
  • ????????for?(int?i?=?0;?i?<?coefficient.length;?i++)?{??
  • ????????????sum?+=?Math.pow(x,?i)?*?coefficient[i];??
  • ????????}??
  • ????????return?sum;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?Use?Newton's?method?to?solve?equation.?
  • ?????*??
  • ?????*?@param?y?
  • ?????*????????????y?
  • ?????*?@return?x?
  • ?????*/??
  • ????public?double?solve(double?y)?{??
  • ????????return?solve(y,?1.0d);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?Use?Newton's?method?to?solve?equation.?
  • ?????*??
  • ?????*?@param?y?
  • ?????*????????????y?
  • ?????*?@param?startX?
  • ?????*????????????The?start?point?of?x?
  • ?????*?@return?x?
  • ?????*/??
  • ????public?double?solve(double?y,?double?startX)?{??
  • ????????final?double?EPS?=?0.0000001d;??
  • ????????if?(coefficient?==?null)?{??
  • ????????????return?0;??
  • ????????}??
  • ????????double?x1?=?0.0d;??
  • ????????double?x2?=?startX;??
  • ????????do?{??
  • ????????????x1?=?x2;??
  • ????????????x2?=?x1?-?(fit(x1)?-?y)?/?calcReciprocal(x1);??
  • ????????}?while?(Math.abs((x1?-?x2))?>?EPS);??
  • ????????return?x2;??
  • ????}??
  • ??
  • ????/*?
  • ?????*?Calculate?the?reciprocal?of?x.?
  • ?????*??
  • ?????*?@param?x?x?
  • ?????*??
  • ?????*?@return?the?reciprocal?of?x?
  • ?????*/??
  • ????private?double?calcReciprocal(double?x)?{??
  • ????????if?(coefficient?==?null)?{??
  • ????????????return?0;??
  • ????????}??
  • ????????double?sum?=?0;??
  • ????????for?(int?i?=?1;?i?<?coefficient.length;?i++)?{??
  • ????????????sum?+=?i?*?Math.pow(x,?i?-?1)?*?coefficient[i];??
  • ????????}??
  • ????????return?sum;??
  • ????}??
  • ??
  • ????/*?
  • ?????*?This?method?is?used?to?calculate?each?elements?of?augmented?matrix.?
  • ?????*/??
  • ????private?void?compute()?{??
  • ????????if?(x?==?null?||?y?==?null?||?x.length?<=?1?||?x.length?!=?y.length??
  • ????????????????||?x.length?<?n?||?n?<?2)?{??
  • ????????????return;??
  • ????????}??
  • ????????double[]?s?=?new?double[(n?-?1)?*?2?+?1];??
  • ????????for?(int?i?=?0;?i?<?s.length;?i++)?{??
  • ????????????for?(int?j?=?0;?j?<?x.length;?j++)?{??
  • ????????????????s[i]?+=?Math.pow(x[j],?i)?*?weight[j];??
  • ????????????}??
  • ????????}??
  • ????????double[]?b?=?new?double[n];??
  • ????????for?(int?i?=?0;?i?<?b.length;?i++)?{??
  • ????????????for?(int?j?=?0;?j?<?x.length;?j++)?{??
  • ????????????????b[i]?+=?Math.pow(x[j],?i)?*?y[j]?*?weight[j];??
  • ????????????}??
  • ????????}??
  • ????????double[][]?a?=?new?double[n][n];??
  • ????????for?(int?i?=?0;?i?<?n;?i++)?{??
  • ????????????for?(int?j?=?0;?j?<?n;?j++)?{??
  • ????????????????a[i][j]?=?s[i?+?j];??
  • ????????????}??
  • ????????}??
  • ??
  • ????????//?Now?we?need?to?calculate?each?coefficients?of?augmented?matrix??
  • ????????coefficient?=?calcLinearEquation(a,?b);??
  • ????}??
  • ??
  • ????/*?
  • ?????*?Calculate?linear?equation.?
  • ?????*??
  • ?????*?The?matrix?equation?is?like?this:?Ax=B?
  • ?????*??
  • ?????*?@param?a?two-dimensional?array?
  • ?????*??
  • ?????*?@param?b?one-dimensional?array?
  • ?????*??
  • ?????*?@return?x,?one-dimensional?array?
  • ?????*/??
  • ????private?double[]?calcLinearEquation(double[][]?a,?double[]?b)?{??
  • ????????if?(a?==?null?||?b?==?null?||?a.length?==?0?||?a.length?!=?b.length)?{??
  • ????????????return?null;??
  • ????????}??
  • ????????for?(double[]?x?:?a)?{??
  • ????????????if?(x?==?null?||?x.length?!=?a.length)??
  • ????????????????return?null;??
  • ????????}??
  • ??
  • ????????int?len?=?a.length?-?1;??
  • ????????double[]?result?=?new?double[a.length];??
  • ??
  • ????????if?(len?==?0)?{??
  • ????????????result[0]?=?b[0]?/?a[0][0];??
  • ????????????return?result;??
  • ????????}??
  • ??
  • ????????double[][]?aa?=?new?double[len][len];??
  • ????????double[]?bb?=?new?double[len];??
  • ????????int?posx?=?-1,?posy?=?-1;??
  • ????????for?(int?i?=?0;?i?<=?len;?i++)?{??
  • ????????????for?(int?j?=?0;?j?<=?len;?j++)??
  • ????????????????if?(a[i][j]?!=?0.0d)?{??
  • ????????????????????posy?=?j;??
  • ????????????????????break;??
  • ????????????????}??
  • ????????????if?(posy?!=?-1)?{??
  • ????????????????posx?=?i;??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ????????if?(posx?==?-1)?{??
  • ????????????return?null;??
  • ????????}??
  • ??
  • ????????int?count?=?0;??
  • ????????for?(int?i?=?0;?i?<=?len;?i++)?{??
  • ????????????if?(i?==?posx)?{??
  • ????????????????continue;??
  • ????????????}??
  • ????????????bb[count]?=?b[i]?*?a[posx][posy]?-?b[posx]?*?a[i][posy];??
  • ????????????int?count2?=?0;??
  • ????????????for?(int?j?=?0;?j?<=?len;?j++)?{??
  • ????????????????if?(j?==?posy)?{??
  • ????????????????????continue;??
  • ????????????????}??
  • ????????????????aa[count][count2]?=?a[i][j]?*?a[posx][posy]?-?a[posx][j]??
  • ????????????????????????*?a[i][posy];??
  • ????????????????count2++;??
  • ????????????}??
  • ????????????count++;??
  • ????????}??
  • ??
  • ????????//?Calculate?sub?linear?equation??
  • ????????double[]?result2?=?calcLinearEquation(aa,?bb);??
  • ??
  • ????????//?After?sub?linear?calculation,?calculate?the?current?coefficient??
  • ????????double?sum?=?b[posx];??
  • ????????count?=?0;??
  • ????????for?(int?i?=?0;?i?<=?len;?i++)?{??
  • ????????????if?(i?==?posy)?{??
  • ????????????????continue;??
  • ????????????}??
  • ????????????sum?-=?a[posx][i]?*?result2[count];??
  • ????????????result[i]?=?result2[count];??
  • ????????????count++;??
  • ????????}??
  • ????????result[posy]?=?sum?/?a[posx][posy];??
  • ????????return?result;??
  • ????}??
  • ??
  • ????public?static?void?main(String[]?args)?{??
  • ????????LeastSquareMethod?eastSquareMethod?=?new?LeastSquareMethod(??
  • ????????????????new?double[]?{?0.5,?1.0,?1.5,?2.0,?2.5,?3.0?},?new?double[]?{??
  • ????????????????????????1.75,?2.45,?3.81,?4.8,?7.0,?8.6?},?3);??
  • ????????/*double[]?coefficients?=?eastSquareMethod.getCoefficient();?
  • ????????for?(double?c?:?coefficients)?{?
  • ????????????System.out.println(c);?
  • ????????}*/??
  • ??
  • ????????System.out.println(eastSquareMethod.fit(4));??
  • ??
  • ????????LeastSquareMethod?eastSquareMethod2?=?new?LeastSquareMethod(??
  • ????????????????new?double[]?{?0.5,?1.0,?1.5,?2.0,?2.5,?3.0?},?new?double[]?{??
  • ????????????????????????1.75,?2.45,?3.81,?4.8,?7.0,?8.6?},?2);??
  • ????????System.out.println(eastSquareMethod2.solve(100));??
  • ??
  • ????}??
  • }??


  • 使用開源庫

    也可使用Apache開源庫commons math,提供的功能更強大,

    http://commons.apache.org/proper/commons-math/userguide/fitting.html

    ?

    [html]?view plaincopy
  • <dependency>??
  • ????????????<groupId>org.apache.commons</groupId>??
  • ????????????<artifactId>commons-math3</artifactId>??
  • ????????????<version>3.5</version>??
  • ????????</dependency>??


  • ?

    ?

    [java]?view plaincopy
  • private?static?void?testLeastSquareMethodFromApache()?{??
  • ????????final?WeightedObservedPoints?obs?=?new?WeightedObservedPoints();??
  • ????????obs.add(-3,?4);??
  • ????????obs.add(-2,?2);??
  • ????????obs.add(-1,?3);??
  • ????????obs.add(0,?0);??
  • ????????obs.add(1,?-1);??
  • ????????obs.add(2,?-2);??
  • ????????obs.add(3,?-5);??
  • ??
  • ????????//?Instantiate?a?third-degree?polynomial?fitter.??
  • ????????final?PolynomialCurveFitter?fitter?=?PolynomialCurveFitter.create(3);??
  • ??
  • ????????//?Retrieve?fitted?parameters?(coefficients?of?the?polynomial?function).??
  • ????????final?double[]?coeff?=?fitter.fit(obs.toList());??
  • ????????for?(double?c?:?coeff)?{??
  • ????????????System.out.println(c);??
  • ????????}??
  • ????} ?
  • ?

    轉載于:https://www.cnblogs.com/davidwang456/articles/5582752.html

    總結

    以上是生活随笔為你收集整理的最小二乘法多项式拟合的Java实现--转的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 看一级黄色大片 | 捆绑japanhdxxxxvideos | 182tv午夜福利在线观看 | 国产日韩精品一区 | 国产婷婷色综合av蜜臀av | 天堂√8在线中文 | 少妇熟女视频一区二区三区 | 欧美一区二区三区国产 | 精品久久久久久无码中文野结衣 | 波多野吉衣久久 | 成人动漫在线观看 | 二区视频在线观看 | 黄色一级大片在线免费看国产一 | 免费看欧美大片 | 黄色在线资源 | 日韩国产欧美在线观看 | 中文字幕在线视频精品 | 欧美少妇一级片 | 日韩精品一区二区在线 | 亚洲无限看| 成人中文字幕+乱码+中文字幕 | 黄色福利在线观看 | 少妇高潮淫片免费观看 | 九九热精品视频在线观看 | 国产精品成av人在线视午夜片 | 爆乳2把你榨干哦ova在线观看 | 国产黄a三级 | 无码人妻av免费一区二区三区 | 亚洲精品视屏 | 亚洲人无码成www久久 | 国产精选久久 | 好色综合 | 免费久久久| 天天操夜夜摸 | 136fldh导航福利微拍 | 中文字幕国产一区二区 | 成人影片在线免费观看 | jzz在线观看 | 超碰老司机 | 久久草视频 | 国产原创一区 | 美女被娇喘视频 | 日韩av一二三区 | 好吊妞在线观看 | 久久天堂影院 | 亚洲无码乱码精品国产 | 含羞草一区二区三区 | 一区二区日韩国产 | 99综合在线 | 五月天堂色 | 日本一区二区三区四区视频 | 亚洲一 | 婷婷综合激情 | 嫩模被强到高潮呻吟不断 | 国产精成人品免费观看 | 7m精品福利视频导航 | 亚洲性在线 | 岛国精品在线播放 | 夫妻性生活黄色片 | 一区二区三区久久久久 | 爱的天堂 | 各处沟厕大尺度偷拍女厕嘘嘘 | 日本亚洲欧美 | 亚洲 欧美 中文字幕 | 精品无人国产偷自产在线 | 欧美一级生活片 | 中日韩精品一区二区三区 | 蜜桃视频免费网站 | 亚洲自拍网站 | av在线.com | 91精品人妻互换一区二区 | se94se欧美 | 一区二区在线视频免费观看 | 777午夜| 海量av | 香港三级网站 | 青草青草久热 | 欧美亚洲综合视频 | 天堂中文在线免费观看 | 69xx欧美 | 青春草av| 9i看片成人免费看片 | 一区二区福利视频 | 91在线| 午夜视频在线免费观看 | 夜夜爽影院| 在线看片日韩 | 一级片久久久 | 亚洲伦理网站 | 久久99精品久久久久久 | 久久无码精品丰满人妻 | 日本人的性生活视频 | 一级黄色美女视频 | 九色网站在线观看 | 成人在线a | 舌奴调教日记 | 麻豆国产网站 | 久久手机看片 | 亚洲成人av在线 |