最小二乘法原理十分简单,这里不再赘述。对于预测公式y' = a * x + b,最优解如下

double a = Sxy / Sxx;

double b = yAvg - a * xAvg;

double r = Sxy / Math.sqrt(Sxx * Syy);

其中,r为相关系数,绝对值越大,线性相关性越大。对f(a, b) = (y - y')^2求极值,即可得到上述解。

package coshaho.learn;

import java.util.HashMap;
import java.util.Map;
import java.util.Random; /**
* 最小二乘法
* @author coshaho
*
*/
public class MyLineRegression
{
/**
* 最小二乘法
* @param X
* @param Y
* @return y = ax + b, r
*/
public Map<String, Double> lineRegression(double[] X, double[] Y)
{
if(null == X || null == Y || 0 == X.length
|| 0 == Y.length || X.length != Y.length)
{
throw new RuntimeException();
} // x平方差和
double Sxx = varianceSum(X);
// y平方差和
double Syy = varianceSum(Y);
// xy协方差和
double Sxy = covarianceSum(X, Y); double xAvg = arraySum(X) / X.length;
double yAvg = arraySum(Y) / Y.length; double a = Sxy / Sxx;
double b = yAvg - a * xAvg; // 相关系数
double r = Sxy / Math.sqrt(Sxx * Syy);
Map<String, Double> result = new HashMap<String, Double>();
result.put("a", a);
result.put("b", b);
result.put("r", r); return result;
} /**
* 计算方差和
* @param X
* @return
*/
private double varianceSum(double[] X)
{
double xAvg = arraySum(X) / X.length;
return arraySqSum(arrayMinus(X, xAvg));
} /**
* 计算协方差和
* @param X
* @param Y
* @return
*/
private double covarianceSum(double[] X, double[] Y)
{
double xAvg = arraySum(X) / X.length;
double yAvg = arraySum(Y) / Y.length;
return arrayMulSum(arrayMinus(X, xAvg), arrayMinus(Y, yAvg));
} /**
* 数组减常数
* @param X
* @param x
* @return
*/
private double[] arrayMinus(double[] X, double x)
{
int n = X.length;
double[] result = new double[n];
for(int i = 0; i < n; i++)
{
result[i] = X[i] - x;
} return result;
} /**
* 数组求和
* @param X
* @return
*/
private double arraySum(double[] X)
{
double s = 0 ;
for( double x : X )
{
s = s + x ;
}
return s ;
} /**
* 数组平方求和
* @param X
* @return
*/
private double arraySqSum(double[] X)
{
double s = 0 ;
for( double x : X )
{
s = s + Math.pow(x, 2) ; ;
}
return s ;
} /**
* 数组对应元素相乘求和
* @param X
* @return
*/
private double arrayMulSum(double[] X, double[] Y)
{
double s = 0 ;
for( int i = 0 ; i < X.length ; i++ )
{
s = s + X[i] * Y[i] ;
}
return s ;
} public static void main(String[] args)
{
Random random = new Random();
double[] X = new double[20];
double[] Y = new double[20]; for(int i = 0; i < 20; i++)
{
X[i] = Double.valueOf(Math.floor(random.nextDouble() * 97));
Y[i] = Double.valueOf(Math.floor(random.nextDouble() * 997));
} System.out.println(new MyLineRegression().lineRegression(X, Y));
}
}

最小二乘法的Java实现的更多相关文章

  1. 最小二乘法拟合java实现源程序(转)

    因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @ ...

  2. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  3. 最小二乘法 java

    import java.util.ArrayList; import java.util.Collection; import org.apache.commons.math3.optim.Point ...

  4. 最小二乘法多项式拟合的Java实现

    背景 由项目中需要根据一些已有数据学习出一个y=ax+b的一元二项式,给定了x,y的一些样本数据,通过梯度下降或最小二乘法做多项式拟合得到a.b,解决该问题时,首先想到的是通过spark mllib去 ...

  5. 一元线性回归分析及java实现

    http://blog.csdn.net/hwwn2009/article/details/38414911 一元线性回归分析及java实现 2014-08-07 11:02 1072人阅读 评论(0 ...

  6. 逻辑回归的相关问题及java实现

    本讲主要说下逻辑回归的相关问题和详细的实现方法 1. 什么是逻辑回归 逻辑回归是线性回归的一种,那么什么是回归,什么是线性回归 回归指的是公式已知,对公式中的未知參数进行预计,注意公式必须是已知的,否 ...

  7. Java练习 SDUT-2728_最佳拟合直线

    最佳拟合直线 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在很多情况下,天文观测得到的数据是一组包含很大数量的序列点 ...

  8. [Java] 数据分析 -- 回归分析

    线性回归 需求:从文件读取数据对,计算回归函数及系数 实现1:commons.math的SimpleRegression,定义函数getData从文件读取数据返回SimpleRegression类 1 ...

  9. Java 使用 Apache commons-math3 线性拟合、非线性拟合实例(带效果图)

    Java 使用 CommonsMath3 的线性和非线性拟合实例,带效果图 例子查看 GitHub Gitee 运行src/main/java/org/wfw/chart/Main.java 即可查看 ...

随机推荐

  1. 实现简单的 u-boot

    根据u-boot-1.1.6启动流程来划分,u-boot功能主要划分为四个部分 1,硬件初始化                        -->start.S  init.c 2,从 fla ...

  2. Spring 注解 @Scheduled(cron = "0 0/10 * * * ? ") 动态改变时间

    import java.util.Date; import java.util.concurrent.Executor; import java.util.concurrent.Executors; ...

  3. 自然语言处理nlp工具

    1.结巴 适合语言:python 应用场景:中文分词较好 不适用于命名实体识别.信息抽取 2.nltk 适合语言:python 应用场景:不适用于中文分词,效果较差 提供了一些用于方便的方法

  4. insert select带来的问题

    当使用 insert...select...进行记录的插入时,如果select的表是innodb类型的,不论insert的表是什么类型的表,都会对select的表的纪录进行锁定.对于那些从oracle ...

  5. lsof 命令

    [root@localhost ~]# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init root cwd DIR , / in ...

  6. 如何为DigitalOcean上的服务器配置SSH密钥

    本指南适用于mac OS和Linux,windows用户请绕道. 通常,当你启动DigitalOcean droplets时,只要过程完成,你会收到一封电子邮件,让你知道droplets的IP地址和密 ...

  7. 008-Centos 7.x安装 Ambari 2.2.2 + HDP 2.4.2 搭建Hadoop集群

    1.安装环境说明 安装前先安装好 Centos 7.2, jdk-8u91, mysql5.7.13 一共有3台机器,一个是主节点192.168.111.10,两个是从:192.168.111.11, ...

  8. 呼叫转接ECT

    ECT(Explicit Call Transfer,呼叫转接)是一种较为特殊的补充业务.签约ECT业务的用户A先呼叫用户B,在与用户B建立通话后,用户A通过终端发起保持用户B呼叫的请求,此时用户B会 ...

  9. throws和throw的区别

    throws是声明在方法上,告诉调用者这个方法可能会出现的问题.格式  :   方法()   throws  自定义异常类(异常类)    就是在这个方法里面会出问题时,new  throw时,    ...

  10. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...