最小二乘法的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 即可查看 ...
随机推荐
- java多线程和.net多线程区别与联系
在网上搜了好多,没有搜到这方面的内容,自己浅薄写点吧. 1..net和java的主线程和子线程,原理是类似的 (1).当子线程是前台线程时,主线程结束,子线程并未结束(还将继续运行,即进程未结束) ( ...
- mv 命令
[root@localhost soft]# .txt [root@localhost soft]# [root@localhost soft]# ls .txt [root@localhost so ...
- docker+jenkins的构建历史记录(Build History)时间不正确
1.分别查看宿主机时间和容器时间 宿主机时间 root@fcaad17f146a:/# date Fri Jan :: CST 容器时间 [root@ ~]# docker exec -ti 8798 ...
- 20170725 Python 必须使用的Url编码
-- 1 原因:在进行API 调用传参时,如果出现了和区分参数标识一样的特殊字符,那么就需要编码来作用 或者,传递的参数有敏感数据. 我的目的: Python开发的接口,C#调用传递参数 先用C# 进 ...
- sqlserver2008出现数据库主体在该数据库中拥有架构,无法删除的解决方案
当要删除数据库中的某个用户名的时候会报错 出现数据库主体在该数据库中拥有架构,无法删除的解决方案(MicrosoftSQLServer,错误:15138) 和sql server2000不同 第一:这 ...
- 【Java】-NO.16.EBook.4.Java.1.010-【疯狂Java讲义第3版 李刚】- 异常
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.010-[疯狂Java讲义第3版 李刚]- 异常 Style:EBook Series:Java Si ...
- [ Linux运维学习 ] 路径及实战项目合集
我们知道运维工程师(Operations)最基本的职责就是负责服务的稳定性并确保整个服务的高可用性,同时不断优化系统架构.提升部署效率.优化资源利用率,确保服务可以7*24H不间断地为用户提供服务. ...
- PHP处理大文件下载
<?php /** * Created by PhpStorm. * User: Kung * Date: 15-10-21 * Time: 下午8:00 */ set_time_limit(0 ...
- Hybrid设计--Hybrid中Native能力的设计
稍微成熟的团队,header一定是不利于业务的UI组件,这个组件会封装在view层,方便前端使用.对业务前端开发来说,不用关注header是如何实现的,只用框架层释放的API.(一个前端有一个自己的U ...
- 服务器--apache启用多个端口的方法
apache启用多个端口的方法 使用本地ip:端口号,或者修改hosts文件+域名的方法来进行本地多站点web调试. 注意这里是用apache 不是iis 1.安装好AppServ2.5.9软件 官网 ...