最小二乘法的Java实现
最小二乘法原理十分简单,这里不再赘述。对于预测公式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实现的更多相关文章
- 最小二乘法拟合java实现源程序(转)
因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用./** * <p>函数功能:最小二乘法曲线拟合</p> * @ ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 最小二乘法 java
import java.util.ArrayList; import java.util.Collection; import org.apache.commons.math3.optim.Point ...
- 最小二乘法多项式拟合的Java实现
背景 由项目中需要根据一些已有数据学习出一个y=ax+b的一元二项式,给定了x,y的一些样本数据,通过梯度下降或最小二乘法做多项式拟合得到a.b,解决该问题时,首先想到的是通过spark mllib去 ...
- 一元线性回归分析及java实现
http://blog.csdn.net/hwwn2009/article/details/38414911 一元线性回归分析及java实现 2014-08-07 11:02 1072人阅读 评论(0 ...
- 逻辑回归的相关问题及java实现
本讲主要说下逻辑回归的相关问题和详细的实现方法 1. 什么是逻辑回归 逻辑回归是线性回归的一种,那么什么是回归,什么是线性回归 回归指的是公式已知,对公式中的未知參数进行预计,注意公式必须是已知的,否 ...
- Java练习 SDUT-2728_最佳拟合直线
最佳拟合直线 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在很多情况下,天文观测得到的数据是一组包含很大数量的序列点 ...
- [Java] 数据分析 -- 回归分析
线性回归 需求:从文件读取数据对,计算回归函数及系数 实现1:commons.math的SimpleRegression,定义函数getData从文件读取数据返回SimpleRegression类 1 ...
- Java 使用 Apache commons-math3 线性拟合、非线性拟合实例(带效果图)
Java 使用 CommonsMath3 的线性和非线性拟合实例,带效果图 例子查看 GitHub Gitee 运行src/main/java/org/wfw/chart/Main.java 即可查看 ...
随机推荐
- Vue的双向数据绑定原理是什么?
vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调. ...
- 【托业】【新托业TOEIC新题型真题】学习笔记8-题库五->P7
———————————————————单词———————————————————— minister 部长 construction contractor 施工方 commence 开始:着手 bac ...
- (4.2)mysql备份还原——备份概述
1.什么情况下会用到备份呢? [1.1]灾难恢复 [1.2]单位审计:数据库在过去某一个点是什么样的 [1.3]跨机房灾备:异地备份 [1.4]认为的DDL或者DML语句,导致主从库的数据消失 [1. ...
- Centos7 下 yum -y install ntp 出现/var/run/yum.pid 已被锁定
[root@localhost ~ ]# yum -y install ntp已加载插件:fastestmirror, langpacksRepodata is over 2 weeks old. I ...
- Centos7下安装syslog-ng
1. syslog-ng的安装地址 https://github.com/balabit/syslog-ng/releases 下载最新版本. 2. 安装gnomeui开发包,因为syslog-ng依 ...
- 【LeetCode每天一题】Reverse Linked List(链表反转)
Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL ...
- 《Java程序设计》第一周学习记录(2)
目录 使用JDB调试程序 系统文件被覆盖的挽救 参考资料 使用JDB调试程序 JDB是JDK自带的基于命令行的调试程序.我们先来man一下吧(说到这里,我之前在翻娄老师的博客的时候看到一篇文章:做中学 ...
- 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。
将项目部署到服务器后发现有如下问题,查了网上好多说是需要被序列化的类没有写上[Serializable]标志,所以把全部需要序列化的列都写上了标志发现还是不是,最后查到了发现网上说的并不太准确,而是需 ...
- js函数中写默认值的几种方式(常见的)
<script> <!--第一种写法,我更喜欢第一种写法直观一些--> function Person(name){ this.name = name || '默认名字乔丹'; ...
- AsssetBunlder打包
unity3d,资源过多的话.可以压缩成一个资源包.加载出来后.可以解压.找到自己需要的资源 就想.net网站.很多图标都是放一个大图片上.而不是一个图标就是一个图片 因为是在项目编辑时候给资源打包. ...