最小二乘法原理十分简单,这里不再赘述。对于预测公式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. js正则表达式:学习网址和部分正则验证

    https://www.cnblogs.com/chenmeng0818/p/6370819.html ① 不以0开头的多个数字,但可以是单个0,必须为数字,位数不允许超过10个. var reg=/ ...

  2. 20190122 loop

    declare a number; v_begin date := to_date('201901013','yyyymmdd'); v_end date := to_date('20190119', ...

  3. Python3学习之路~5.3 random模块

    random模块常用方法: import random # 随机数 print(random.random()) # 生成一个0到1的随机浮点数,0 <= n < 1.0 print(ra ...

  4. 算法 -- 四种方法获取的最长“回文串”,并对时间复杂进行分析对比&PHP

    https://blog.csdn.net/hongyuancao/article/details/82962382 “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就 ...

  5. Scala对class/object反射

    近期有需求,要根据解析字符串,根据字符串的内容去调用方法.想到的基本就是使用反射.但是基本上能找到的资料,全没有讲scala的反射.只有零星点点的讲解.大部分都是用scala的语法写java反射最后翻 ...

  6. 【UML】-NO.43.EBook.5.UML.1.003-【UML 大战需求分析】- 状态机图(State Machine Diagram)

    1.0.0 Summary Tittle:[UML]-NO.43.EBook.1.UML.1.003-[UML 大战需求分析]- 状态机图(State Machine Diagram) Style:D ...

  7. AD使用ntdsutil工具 恢复主域控制器 清理孤立域控制器

    需求: 主域控制器出现灾难故障,辅助域控制器正常 在辅助域控制器使用ntdsutil工具清理主域控制器并夺取PDC角色 首先清理孤立的域控制器 ntdsutil ntdsutil: metadata ...

  8. vue proxyTable 跨域问题。

  9. wue父子通信和动态路由 还有点击事件直接赋值传参数

    这种直接在后面赋值 传值

  10. bat脚本简单命令

    1.if 判断 (1.1)判断字符串是否为空: if "%var1%" == " " ( echo null) else(echo not null ) (1. ...