若是一個方程,自變量的指數大於1,那麼全部擬合這個方程的點就符合多項式迴歸。html
多項式迴歸有個很重要的因素就是指數(degree)。若是咱們發現數據的分佈大體是一條曲線,那麼極可能符合多項式迴歸,可是咱們不知道degree是多少。因此咱們只能一個個去試,直到找到最擬合分佈的degree。這個過程咱們能夠交給數據科學軟件完成。須要注意的是,若是degree選擇過大的話可能會致使函數過於擬合, 意味着對數據或者函數將來的發展很難預測,也許指向不一樣的方向。java
這個迴歸的計算須要用到矩陣數據結構。有的編程語言可能須要導入外庫。算法
咱們對全部擬合這個公式的點,用矩陣表示他們的關係編程
若是用矩陣符號表示:數據結構
多項式迴歸向量的係數(使用最小二乘法):編程語言
Java 和 Python 代碼以下:函數
//須要安裝jama包,這裏是下載地址: http://math.nist.gov/javanumerics/jama/ 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 Regressionui