public class LinearRegression { //求出来的b值 public static double getB(double[] x,double[] y,int j){ //首先先保证xy是数量相同的 double b=0; //先对x求平均 double xp=0; double yp=0; for(int i=0;i<j;i++){ xp+=x[i]; yp+=y[i]; } xp=xp/(double)j; yp=yp/(double)j; //第二步 // 计算一系列的差值 x-xp,y-yp double xpp=0; double ypp=0; double zpp=0; double xxp=0; for(int k=0;k<j;k++){ xpp =(x[k]-xp); ypp =(y[k]-yp); zpp+=(xpp*ypp); xxp+=(xpp*xpp); } b=zpp/xxp; return b; } //最小二乘法求时间序列 数据线性回归公式 public static double[] getLinearAB(double[] x,double[] y){ double[] ab=new double[2]; if(x.length!=y.length) return ab; //第一步 求x y 平均 double avg_x=0,avg_y=0; for(int i=0;i<x.length;i++){ avg_x+=x[i]; avg_y+=y[i]; } avg_x=avg_x/x.length; avg_y=avg_y/x.length; //第二步 所有点的横坐标求和结果,以及所有点的纵坐标求和结果 double sum_x=0,sum_y=0; for(int i=0;i<x.length;i++){ sum_x+=x[i]; sum_y+=y[i]; } //第三步 计算每个数据点横坐标的平方,然后求和,以及计算每个点横坐标乘以纵坐标的乘积,然后求和 double sum_x2=0,sum_xy=0; for(int i=0;i<x.length;i++){ sum_x2+=x[i]*x[i]; sum_xy+=x[i]*y[i]; } //第四步 求 b int n=x.length; ab[1]=(n*sum_xy-sum_x*sum_y)/(n*sum_x2-sum_x*sum_x); //第五步 求 a ab[0]=avg_y-ab[1]*avg_x; return ab; } }