package com.smart.test; public class Algorithm { /** * 一元线性回归分析 * * @param x[n] 存放自变量x的n个取值 * @param y[n] 存放与自变量x的n个取值相对应的随机变量y的观察值 * @param n 观察点数 * @param a[2] a(0) 返回回归系数b ,a(1)返回回归系数a */ public static void lineareEquation(double[] x, double[] y, int n, double[] a) { int i; double xx, yy, e, f, q, s; xx = 0.0; yy = 0.0; for (i = 0; i <= n - 1; i++) { xx = xx + x[i] / n; yy = yy + y[i] / n; } e = 0.0; f = 0.0; for (i = 0; i <= n - 1; i++) { q = x[i] - xx; e = e + q * q; f = f + q * (y[i] - yy); } a[1] = f / e; a[0] = yy - a[1] * xx; q = 0.0; for (i = 0; i <= n - 1; i++) { s = a[1] * x[i] + a[0]; q = q + (y[i] - s) * (y[i] - s); e = Math.abs(y[i] - s); } } /** * 多元一次方程求解 * * @param a 系数数组 * @param b 结果数组 * @return 解答 */ public static double[] multiLinearEquationGroup(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++; } double[] result2 = multiLinearEquationGroup(aa, bb); 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; } /** * @param args */ public static void main(String[] args) { /** * 一元回归 */ double[] a = new double[2]; double[] x = { 0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}; double[] y = { 2.75,2.84,2.965,3.01,3.20,3.25,3.38,3.43,3.55,3.66,3.74}; Algorithm.lineareEquation(x,y,11,a); System.out.println("a="+a[1]+" b="+a[0]); /** * 多元回归 */ // double[] r = multiLinearEquationGroup(new double[][] { { 1, 2, 3, 1 }, { 2, 0, 1, 0 }, { 5, 2, 0, 0 }, { 7, 1, 1, 0 } }, new double[] { 18, 5, 9, 12 }); // for (int i = 0; i < r.length; i++) // { // System.out.println(r[i]); // } } }