恭喜bestfitting成为Kaggle排名第一的人

比较简洁的最小拟合java代码 public class BestFitting { double t[]={0.0,1.0,2.0,3.0,4.0,5.0}; double y[]={1.0,2.7,5.8,6.6,7.5,9.9}; double a[][]; double at[][]; double ata[][]; double atb[][]; double ans[]; int ti=0; BestFitting(int n){ if(n<0||n>6){ System.out.println("wrong input,you must input a 0<=number<=5"); System.exit(0); } ti=n; ans=new double[n]; a=new double[6][n]; at=new double[n][6]; ata=new double[at.length][a[0].length]; atb=new double[at.length][1]; for(int i=0;i<6;i++){ for(int j=0;j<n;j++){ if(j==0) a[i][j]=1; else{ a[i][j]=Math.pow(t[i], j); //System.out.print(a[i][j]); } } } } public double[][] mut(double a[][],double b[][] ){ double c[][]=new double[a.length][b[0].length]; for(int i=0;i<a.length;i++){ for(int j=0;j<b[0].length;j++){ for(int k=0;k<a[0].length;k++){ c[i][j]+=a[i][k]*b[k][j]; } } } return c; } public double[][] trans(double tem[][]){ double t1[][]=new double[tem[0].length][tem.length]; for(int i=0;i<tem.length;i++){ for(int j=0;j<tem[0].length;j++){ t1[j][i]=tem[i][j]; } } return t1; } public void gauss(){ at=this.trans(a); this.output(a); ata=this.mut(at, a); this.output(ata); double y1[][]=new double[y.length][1]; for(int i=0;i<y.length;i++){ y1[i][0]=y[i]; } atb=this.mut(at, y1); this.output(atb); //以下使用高斯消元 形成下三角阵 for(int i=ata.length-1;i>0;i--){ for(int j=i-1;j>=0;j--){ double temp=ata[j][i]/ata[i][i]; for(int k=0;k<ata.length;k++){ ata[j][k]-=temp*ata[i][k]; //atb[k][0]-=temp*atb[i][0]; } /*for(int k=0;k<=j;k++){ atb[k][0]-=temp*atb[i][0]; }*/ atb[j][0]-=temp*atb[i][0]; } } this.output(ata); this.output(atb); for(int i=0;i<ata.length;i++){ ans[i]=atb[i][0]/ata[i][i]; for(int j=0;j<ata.length;j++){ atb[j][0]-=ans[i]*ata[j][i]; } } for(int i=0;i<ata.length;i++){ System.out.println("x["+i+"] is :"+ans[i]); } } public void output(double a[][]){ for(int i=0;i<a.length;i++){ for(int j=0;j<a[0].length;j++){ System.out.print(a[i][j]+"\t"); } System.out.println(" "); } } public static void main(String[] args) { BestFitting da=new BestFitting(6); da.gauss(); } } /* 0.230769231 0.789871215620869 3.1550095077718354 -0.6290208360133488 0.07125234549040926 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值