java实现简单线性回归—判定系数

判定系数
  coefficient of determination 为估计的回归方程提供拟合优度的度量。
代码

1、demo

package com.math.demo;

import com.math.regression.RegressionEquation;
import com.math.regression.RegressionModel;
/***
 * 
 * @author miaoyibo
 *
 */
public class RegressionDemo {

	public static void main(String[] args) {
		double[] dependentValues= {58,105,88,118,117,137,157,169,149,202};
		double[] independentValues= {2,6,8,8,12,16,20,20,22,26};
		RegressionEquation re=new RegressionEquation(dependentValues, independentValues);
		RegressionModel regressionModel = re.getRegressionModel();
		System.out.println("b0=="+regressionModel.getB0());
		System.out.println("b0=="+regressionModel.getB1());
		System.out.println("coefficient of determination=="+regressionModel.getR());
	}

}

2、model

package com.math.regression;

public class RegressionModel {
	//y轴截距
	private double b0;
	//斜率
	private double b1;
	//判定系数
	private double r;
	public double getB0() {
		return b0;
	}
	public void setB0(double b0) {
		this.b0 = b0;
	}
	public double getB1() {
		return b1;
	}
	public void setB1(double b1) {
		this.b1 = b1;
	}
	public double getR() {
		return r;
	}
	public void setR(double r) {
		this.r = r;
	}
	
	

}

3、方法类

package com.math.regression;

import org.apache.commons.math3.stat.descriptive.moment.Mean;
/***
 * least squares method
 * @author miaoyibo
 *
 */
public class RegressionEquation {
	
	private double[] dependentValues;
	
	private double[] independentValues;

	public RegressionEquation(double[] dependentValues, double[] independentValues) {
		this.dependentValues = dependentValues;
		this.independentValues = independentValues;
	}
	
	public double getMean(double[] dd) {
		Mean meanUtil = new Mean();
		return meanUtil.evaluate(dd);
	}

	public double[] calRegression() {
		if(dependentValues.length!=independentValues.length) {
			return null;
		}
		Mean meanUtil = new Mean();
		double xmean=meanUtil.evaluate(independentValues);
		double ymean=meanUtil.evaluate(dependentValues);
		double numerator=0d;
		double denominator=0d;
		for(int i=0;i<dependentValues.length;i++) {
			double x=independentValues[i];
			double y=dependentValues[i];
			numerator=numerator+(x-xmean)*(y-ymean);
			denominator=denominator+(x-xmean)*(x-xmean);
		}
		double b1=numerator/denominator;
		double b0=ymean-b1*xmean;
		double[] model= {b0,b1};
		return model;
	}
	//判定系数
	public double getCoefficientOfDetermination() {
		double[] model = calRegression();
		double b0=model[0];
		double b1=model[1];
		//calculate SSE SST
		double sse=0;
		double sst=0;
		Mean meanUtil = new Mean();
		double mean=meanUtil.evaluate(dependentValues);
		for(int i=0;i<dependentValues.length;i++) {
			double yi=independentValues[i]*b1+b0;
			double y=dependentValues[i];
			sse=sse+(y-yi)*(y-yi);
			sst=sst+(y-mean)*(y-mean);
		}
		return (sst-sse)/sst;
	}
	public RegressionModel getRegressionModel() {
		RegressionModel model=new RegressionModel();
		double[] regression = calRegression();
		double coefficientOfDetermination = getCoefficientOfDetermination();
		model.setB0(regression[0]);
		model.setB0(regression[1]);
		model.setR(coefficientOfDetermination);
		return model;
		
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值