热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java一元线性回归_Java实现一元线性回归

最近在写一个荧光图像分析软件,需要自己拟合方程。一元回归线公式的算法参考了《Java数值方法》,拟合度R^2(绝对系数)是自己写的,欢迎讨

最近在写一个荧光图像分析软件,需要自己拟合方程。一元回归线公式的算法参考了《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

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 &#43; a1*x;

}

public float at(float x)

{

if (pn <2) return Float.NaN;

validateCoefficients();

return a0 &#43; a1*x;

}

/**

* Reset.

*/

public void reset()

{

pn &#61; 0;

sumX &#61; sumY &#61; sumXX &#61; sumXY &#61; 0;

coefsValid &#61; false;

}

/**

* Validate the coefficients.

* 计算方程系数 y&#61;ax&#43;b 中的a

*/

private void validateCoefficients()

{

if (coefsValid) return;

if (pn >&#61; 2) {

float xBar &#61; (float) sumX/pn;

float yBar &#61; (float) sumY/pn;

a1 &#61; (float) ((pn*sumXY - sumX*sumY)

/(pn*sumXX - sumX*sumX));

a0 &#61; (float) (yBar - a1*xBar);

}

else {

a0 &#61; a1 &#61; Float.NaN;

}

coefsValid &#61; true;

}

/**

* 返回误差

*/

public double getR(){

//遍历这个list并计算分母

for(int i &#61; 0; i

float Yi&#61; (float)Integer.parseInt(listY.get(i).toString());

float Y &#61; at(Integer.parseInt(listX.get(i).toString()));

float deltaY &#61; Yi - Y;

float deltaY2 &#61; deltaY*deltaY;

/*

System.out.println("Yi:" &#43; Yi);

System.out.println("Y:" &#43; Y);

System.out.println("deltaY:" &#43; deltaY);

System.out.println("deltaY2:" &#43; deltaY2);

*/

sumDeltaY2 &#43;&#61; deltaY2;

//System.out.println("sumDeltaY2:" &#43; sumDeltaY2);

}

sst &#61; sumYY - (sumY*sumY)/pn;

//System.out.println("sst:" &#43; sst);

E &#61;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 &#61; new BigDecimal(Double.toString(v));

BigDecimal one &#61; 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 &#61; new BigDecimal(Double.toString(v));

BigDecimal one &#61; new BigDecimal("1");

return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).floatValue();

}

}

演示程序&#xff1a;

LinearRegression.java

/**

*

Linear Regression

*

* Demonstrate linear regression by constructing the regression line for a set

* of data points.

*

*

require DataPoint.java,RegressionLine.java

*

*

为了计算对于给定数据点的最小方差回线&#xff0c;需要计算SumX,SumY,SumXX,SumXY; (注&#xff1a;SumXX &#61; Sum (X^2))

*

回归直线方程如下&#xff1a; f(x)&#61;a1x&#43;a0  

*

斜率和截距的计算公式如下&#xff1a;

*
n: 数据点个数

*

a1&#61;(n(SumXY)-SumX*SumY)/(n*SumXX-(SumX)^2)

*
a0&#61;(SumY - SumY * a1)/n

*
(也可表达为a0&#61;averageY-a1*averageX)

*

*

画线的原理&#xff1a;两点成一直线&#xff0c;只要能确定两个点即可

*  第一点&#xff1a;(0,a0) 再随意取一个x1值代入方程&#xff0c;取得y1&#xff0c;连结(0,a0)和(x1,y1)两点即可。

* 为了让线穿过整个图,x1可以取横坐标的最大值Xmax&#xff0c;即两点为(0,a0),(Xmax,Y)。如果y&#61;a1*Xmax&#43;a0,y大于

* 纵坐标最大值Ymax&#xff0c;则不用这个点。改用y取最大值Ymax&#xff0c;算得此时x的值&#xff0c;使用(X,Ymax)&#xff0c; 即两点为(0,a0),(X,Ymax)

*

*

拟合度计算&#xff1a;(即Excel中的R^2)

*

*R2 &#61; 1 - E

*

误差E的计算&#xff1a;E &#61; SSE/SST

*

SSE&#61;sum((Yi-Y)^2) SST&#61;sumYY - (sumY*sumY)/n;

*

*/

public class LinearRegression

{

private static final int MAX_POINTS &#61; 10;

private double E;

/**

* Main program.

*

* &#64;param args

*            the array of runtime arguments

*/

public static void main(String args[])

{

RegressionLine line &#61; 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.

*

* &#64;param line

*            the regression line

*/

private static void printSums(RegressionLine line)

{

System.out.println("\n数据点个数 n &#61; " &#43; line.getDataPointCount());

System.out.println("\nSum x  &#61; " &#43; line.getSumX());

System.out.println("Sum y  &#61; " &#43; line.getSumY());

System.out.println("Sum xx &#61; " &#43; line.getSumXX());

System.out.println("Sum xy &#61; " &#43; line.getSumXY());

System.out.println("Sum yy &#61; " &#43; line.getSumYY());

}

/**

* Print the regression line function.

*

* &#64;param line

*            the regression line

*/

private static void printLine(RegressionLine line)

{

System.out.println("\n回归线公式:  y &#61; " &#43;

line.getA1() &#43;

"x &#43; " &#43; line.getA0());

System.out.println("拟合度&#xff1a;     R^2 &#61; " &#43; line.getR());

}

}

down_info.asp?id&#61;49667



推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
author-avatar
May蕊心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有