java 一元线性回归_Java实现一元线性回归
最近在写一个荧光图像分析软件,需要自己拟合方程。一元回归线公式的算法参考了《Java数值方法》,拟合度R^2(绝对系数)是自己写的,欢迎讨论。计算结果和Excel完全一致。
总共三个文件:
DataPoint.java
/**
* A data point for interpolation and regression.
*/
public class DataPoint
{
/** the x value */ public float x;
/** the y value */ public float y;
/**
* Constructor.
* @param x the x value
* @param y the y value
*/
public DataPoint(float x, float y)
{
this.x = x;
this.y = y;
}
}
/**
* A least-squares regression line function.
*/
import java.util.*;
import java.math.BigDecimal;
public class RegressionLine
//implements Evaluatable
{
/** sum of x */ private double sumX;
/** sum of y */ private double sumY;
/** sum of x*x */ private double sumXX;
/** sum of x*y */ private double sumXY;
/** sum of y*y */ private double sumYY;
/** sum of yi-y */ private double sumDeltaY;
/** sum of sumDeltaY^2 */ private double sumDeltaY2;
/**误差 */
private double sse;
private double sst;
private double E;
private String[] xy ;
private ArrayList listX ;
private ArrayList listY ;
private int XMin,XMax,YMin,YMax;
/** line coefficient a0 */ private float a0;
/** line coefficient a1 */ private float a1;
/** number of data points */ private int pn ;
/** true if coefficients valid */ private boolean coefsValid;
/**
* Constructor.
*/
public RegressionLine() {
XMax = 0;
YMax = 0;
pn = 0;
xy =new String[2];
listX = new ArrayList();
listY = new ArrayList();
}
/**
* Constructor.
* @param data the array of data points
*/
public RegressionLine(DataPoint data[])
{
pn = 0;
xy =new String[2];
listX = new ArrayList();
listY = new ArrayList();
for (int i = 0; i < data.length; ++i) {
addDataPoint(data[i]);
}
}
/**
* Return the current number of data points.
* @return the count
*/
public int getDataPointCount() { return pn; }
/**
* Return the coefficient a0.
* @return the value of a0
*/
public float getA0()
{
validateCoefficients();
return a0;
}
/**
* Return the coefficient a1.
* @return the value of a1
*/
public float getA1()
{
validateCoefficients();
return a1;
}
/**
* Return the sum of the x values.
* @return the sum
*/
public double getSumX() { return sumX; }
/**
* Return the sum of the y values.
* @return the sum
*/
public double getSumY() { return sumY; }
/**
* Return the sum of the x*x values.
* @return the sum
*/
public double getSumXX() { return sumXX; }
/**
* Return the sum of the x*y values.
* @return the sum
*/
public double getSumXY() { return sumXY; }
public double getSumYY() { return sumYY; }
public int getXMin() {
return XMin;
}
public int getXMax() {
return XMax;
}
public int getYMin() {
return YMin;
}
public int getYMax() {
return YMax;
}
/**
* Add a new data point: Update the sums.
* @param dataPoint the new data point
*/
public void addDataPoint(DataPoint dataPoint)
{
sumX += dataPoint.x;
sumY += dataPoint.y;
sumXX += dataPoint.x*dataPoint.x;
sumXY += dataPoint.x*dataPoint.y;
sumYY += dataPoint.y*dataPoint.y;
if(dataPoint.x > XMax){
XMax = (int)dataPoint.x;
}
if(dataPoint.y > YMax){
YMax = (int)dataPoint.y;
}
//把每个点的具体坐标存入ArrayList中,备用
xy[0] = (int)dataPoint.x+ "";
xy[1] = (int)dataPoint.y+ "";
if(dataPoint.x!=0 && dataPoint.y != 0){
System.out.print(xy[0]+",");
System.out.println(xy[1]);
try{
//System.out.println("n:"+n);
listX.add(pn,xy[0]);
listY.add(pn,xy[1]);
}
catch(Exception e){
e.printStackTrace();
}
/*
System.out.println("N:" + n);
System.out.println("ArrayList listX:"+ listX.get(n));
System.out.println("ArrayList listY:"+ listY.get(n));
*/
}
++pn;
coefsValid = false;
}
/**
* Return the value of the regression line function at x.
* (Implementation of Evaluatable.)
* @param x the value of x
* @return the value of the function at x
*/
public float at(int x)
{
if (pn < 2) return Float.NaN;
validateCoefficients();
return a0 + a1*x;
}
public float at(float x)
{
if (pn < 2) return Float.NaN;
validateCoefficients();
return a0 + a1*x;
}
/**
* Reset.
*/
public void reset()
{
pn = 0;
sumX = sumY = sumXX = sumXY = 0;
coefsValid = false;
}
/**
* Validate the coefficients.
* 计算方程系数 y=ax+b 中的a
*/
private void validateCoefficients()
{
if (coefsValid) return;
if (pn >= 2) {
float xBar = (float) sumX/pn;
float yBar = (float) sumY/pn;
a1 = (float) ((pn*sumXY - sumX*sumY)
/(pn*sumXX - sumX*sumX));
a0 = (float) (yBar - a1*xBar);
}
else {
a0 = a1 = Float.NaN;
}
coefsValid = true;
}
/**
* 返回误差
*/
public double getR(){
//遍历这个list并计算分母
for(int i = 0; i < pn -1; i++) {
float Yi= (float)Integer.parseInt(listY.get(i).toString());
float Y = at(Integer.parseInt(listX.get(i).toString()));
float deltaY = Yi - Y;
float deltaY2 = deltaY*deltaY;
/*
System.out.println("Yi:" + Yi);
System.out.println("Y:" + Y);
System.out.println("deltaY:" + deltaY);
System.out.println("deltaY2:" + deltaY2);
*/
sumDeltaY2 += deltaY2;
//System.out.println("sumDeltaY2:" + sumDeltaY2);
}
sst = sumYY - (sumY*sumY)/pn;
//System.out.println("sst:" + sst);
E =1- sumDeltaY2/sst;
return round(E,4) ;
}
//用于实现精确的四舍五入
public double round(double v,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public float round(float v,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).floatValue();
}
}
演示程序:
LinearRegression.java
/**
*
Linear Regression
*
* Demonstrate linear regression by constructing the regression line for a set
* of data points.
*
*
require DataPoint.java,RegressionLine.java
*
*
为了计算对于给定数据点的最小方差回线,需要计算SumX,SumY,SumXX,SumXY; (注:SumXX = Sum (X^2))
*
回归直线方程如下: f(x)=a1x+a0
*
斜率和截距的计算公式如下:
*
n: 数据点个数
*
a1=(n(SumXY)-SumX*SumY)/(n*SumXX-(SumX)^2)
*
a0=(SumY - SumY * a1)/n
*
(也可表达为a0=averageY-a1*averageX)
*
*
画线的原理:两点成一直线,只要能确定两个点即可
* 第一点:(0,a0) 再随意取一个x1值代入方程,取得y1,连结(0,a0)和(x1,y1)两点即可。
* 为了让线穿过整个图,x1可以取横坐标的最大值Xmax,即两点为(0,a0),(Xmax,Y)。如果y=a1*Xmax+a0,y大于
* 纵坐标最大值Ymax,则不用这个点。改用y取最大值Ymax,算得此时x的值,使用(X,Ymax), 即两点为(0,a0),(X,Ymax)
*
*
拟合度计算:(即Excel中的R^2)
*
*R2 = 1 - E
*
误差E的计算:E = SSE/SST
*
SSE=sum((Yi-Y)^2) SST=sumYY - (sumY*sumY)/n;
*
*/
public class LinearRegression
{
private static final int MAX_POINTS = 10;
private double E;
/**
* Main program.
*
* @param args
* the array of runtime arguments
*/
public static void main(String args[])
{
RegressionLine line = new RegressionLine();
line.addDataPoint(new DataPoint(20, 136));
line.addDataPoint(new DataPoint(40, 143));
line.addDataPoint(new DataPoint(60, 152));
line.addDataPoint(new DataPoint(80, 162));
line.addDataPoint(new DataPoint(100, 167));
printSums(line);
printLine(line);
}
/**
* Print the computed sums.
*
* @param line
* the regression line
*/
private static void printSums(RegressionLine line)
{
System.out.println("\n数据点个数 n = " + line.getDataPointCount());
System.out.println("\nSum x = " + line.getSumX());
System.out.println("Sum y = " + line.getSumY());
System.out.println("Sum xx = " + line.getSumXX());
System.out.println("Sum xy = " + line.getSumXY());
System.out.println("Sum yy = " + line.getSumYY());
}
/**
* Print the regression line function.
*
* @param line
* the regression line
*/
private static void printLine(RegressionLine line)
{
System.out.println("\n回归线公式: y = " +
line.getA1() +
"x + " + line.getA0());
System.out.println("拟合度: R^2 = " + line.getR());
}
}
java 一元线性回归_Java实现一元线性回归相关推荐
- java 线性回归_Java实现一元线性回归
最近在写一个荧光图像分析软件,需要自己拟合方程.一元回归线公式的算法参考了<Java数值方法>,拟合度R^2(绝对系数)是自己写的,欢迎讨论.计算结果和Excel完全一致. 总共三个文件: ...
- java 线性回归_java实现简单线性回归
术语及定义 1.因变量 dependent variable 需要预测的变量 2.自变量 independent variable 用来预测因变量值的一个或多个变量 3.回归分析 利用统计学方法建立一 ...
- 【一元线性回归】理论一镜到底!线性回归大总结——一元线性回归(1)
考完研了,感觉考不上了,不想把总结资料浪费了,更一下线性回归.方差分析和时间序列的文章,也算是让笔记发了最后一份光和热,再接下来就是更新项目代码了,不会再写理论方面的文章了. 至少在我的目标院校来说, ...
- java 一元三次方程_Java实现 蓝桥杯VIP 算法训练 一元三次方程
问题描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
- java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...
题目: 用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a.b及c从命令行做参数输入 java 答案参考: 以下程序在jdk5.0测试通过 import java.util.Sca ...
- 回归分析之线性回归(N元线性回归)
标签(空格分隔): 回归分析 二元线性回归 多元线性回归 打开微信扫一扫,关注微信公众号[数据与算法联盟] 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:ht ...
- 线性回归 假设_违反线性回归假设的后果
线性回归 假设 动机 (Motivation) Recently, a friend learning linear regression asked me what happens when ass ...
- 用java的io做一个代码计数器,如何制作Java页面计数器_java
大庆采油六厂采油工艺研究所 王兵 王波 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想 ...
- 多重线性回归 多元线性回归_了解多元线性回归
多重线性回归 多元线性回归 Video Link 影片连结 We have taken a look at Simple Linear Regression in Episode 4.1 where ...
- R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用attributes函数查看线性回归模型的属性信息、获取模型拟合对应的残差值residuals
R语言使用lm函数构建简单线性回归模型(建立线性回归模型).拟合回归直线.使用attributes函数查看线性回归模型的属性信息.获取模型拟合对应的残差值residuals 目录
最新文章
- cocos2dx-CCScrollView的制作
- Oracle在Linux平台“静默”安装(二)
- 5、删除用户(DROP/DELETE USER)
- CLR Via CSharp读书笔记(14):字符、字符串和文本处理
- Web前端技术分享:img标签下方出现空隙的问题解决方案
- VS2017 下载离线MSDN文档
- CTFHUB 《基础认证》:burp使用,basic请求了解
- 关于垂直切分Vertical Sharding的粒度
- 华为发布The New P30 Pro新机:全新配色+EMUI10系统
- Android使用谷歌插件,IT之家学院:教你如何在安卓手机上使用Chrome插件
- 移动开发平台收入对比
- oracle 以1开头以9结尾_小学生记叙文写作技巧六——如何把握好文章的开头和结尾呢?...
- Android开发之内容提供者ContentProvider
- 华为培训视频-AAA培训
- TextWatcher接口
- Pyinstaller 打包exe运行时找不到源码,函数 错误 OSError: could not get source code
- windows start 命令启动 GUI 程序
- 如何搭建自己的内测分发平台?有可以直接用的内测分发平台吗?
- 赚钱,一定要对自己狠
- 织梦网站如何设置404错误页面?
热门文章
- 江西省吉安市永丰县市政花园(市政服务大楼[厅]) 工程质量及违法违规建筑容积率问题2011年11月简述报告
- dedecms采集织梦免写规则登陆模块软件
- linux weblogic部署项目路径,Weblogic部署web项目获取项目根目录为null
- 自己写段代码批量修改照片的Exif数据
- 单元测试自动生成测试用例
- opencv打开Lena图像,并且将Lena改成单通道的图片
- 【19】蓝桥杯之奇妙的数字(填空题)
- ctfmon是什么启动项_Windows7系统启动项里没有ctfmon.exe怎么办?
- 修正读取ISO中文命名的FatmsMod补丁第二版下载发布
- 苹果Macbook快捷键使用大全