java求多项式回归_多项式回归(Polynomial Regression)(附代码)
多項式回歸有個很重要的因素就是指數(degree)。如果我們發現數據的分布大致是一條曲線,那么很可能符合多項式回歸,但是我們不知道degree是多少。所以我們只能一個個去試,直到找到最擬合分布的degree。這個過程我們可以交給數據科學軟件完成。需要注意的是,如果degree選擇過大的話可能會導致函數過于擬合, 意味著對數據或者函數未來的發展很難預測,也許指向不同的方向。
這個回歸的計算需要用到矩陣數據結構。有的編程語言可能需要導入外庫。
多項式回歸有個很重要的因素就是指數(degree)。如果我們發現數據的分布大致是一條曲線,那么很可能符合多項式回歸,但是我們不知道degree是多少。所以我們只能一個個去試,直到找到最擬合分布的degree。這個過程我們可以交給數據科學軟件完成。需要注意的是,如果degree選擇過大的話可能會導致函數過于擬合, 意味著對數據或者函數未來的發展很難預測,也許指向不同的方向。
這個回歸的計算需要用到矩陣數據結構。有的編程語言可能需要導入外庫。
我們對所有擬合這個公式的點,用矩陣表示他們的關系
如果用矩陣符號表示:
多項式回歸向量的系數(使用最小二乘法):
Java 和 Python 代碼如下:package regression;
import Jama.Matrix;
import Jama.QRDecomposition;
public class PR {
private final int N;
private final int degree;
private final Matrix beta;
private double SSE;
private double SST;
public PR(double[] x, double[] y, int degree) {
this.degree = degree;
N = x.length;
// build Vandermonde matrix
double[][] vandermonde = new double[N][degree+1];
for (int i = 0; i < N; i++) {
for (int j = 0; j <= degree; j++) {
vandermonde[i][j] = Math.pow(x[i], j);
}
}
Matrix X = new Matrix(vandermonde);
// 從向量中增加一個矩陣
Matrix Y = new Matrix(y, N);
// 找到最小的平方值
QRDecomposition qr = new QRDecomposition(X);
beta = qr.solve(Y);
// 得到y的平均值
double sum = 0.0;
for (int i = 0; i < N; i++)
sum += y[i];
double mean = sum / N;
// total variation to be accounted for
for (int i = 0; i < N; i++) {
double dev = y[i] - mean;
SST += dev*dev;
}
// variation not accounted for
Matrix residuals = X.times(beta).minus(Y);
SSE = residuals.norm2() * residuals.norm2();
}
public double beta(int j) {
return beta.get(j, 0);
}
public int degreee() {
return degree;
}
public double R2() {
return 1.0 - SSE/SST;
}
public double predict(double x) {
double y = 0.0;
for (int j = degree; j>=0; j--) {
y = beta(j) + (x*y);
}
return y;
}
public String toString() {
String s = "";
int j = degree;
// 忽略系數為0.
while (Math.abs(beta(j)) < 1E-5)
j--;
// create remaining terms
for (j = j; j >= 0; j--) {
if (j == 0) s += String.format("%.2f ", beta(j));
else if (j == 1) s += String.format("%.2f N + ", beta(j));
else s += String.format("%.2f N^%d + ", beta(j), j);
}
return s + " (R^2 = " + String.format("%.3f", R2()) + ")";
}
}
ref:
總結
以上是生活随笔為你收集整理的java求多项式回归_多项式回归(Polynomial Regression)(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 域名检测查询的方法是什么
- 下一篇: 拼多多拼小圈如何取消自动添加好友 拼多多