最小二乘法的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 即可查看 ...
随机推荐
- oracle创建表空间 授权
--创建表空间 临时表空间 create temporary tablespace xiaodai_temp tempfile '/main/app/oracle/oradata/devdb/xiao ...
- C#-1-1-.net
1..Net (1).Net平台 (2). FrameWork框架 2..Net应用 (1).桌面应用程序(Win form(.Net开发的桌面应用程序叫做Win form应用程序)). (2).In ...
- 【托业】【新托业TOEIC新题型真题】学习笔记13-题库四-P7
>counterpart 对应的人 >Master of Business Administration 工商管理学硕士 >superb 极好的 >executive 执行总监 ...
- 前端 HTML标签属性
HTML标签可以设置属性,如下: <div id="i1">这是一个div标签</div> <p class='p1 p2 p3'>这是一个段落 ...
- 前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
input标签用于接收用户输入.可以利用input 可以做登录页面 input标签是行内块标签 <input> 元素会根据不同的 type 属性,变化为多种形态. name属性:表单点击提 ...
- 怎么修改TOMCAT的默认主页为你自己项目的主页
如果webapp下有一个abc的文件来下有一个index.html,想设置为首页怎么操作 方法: 修改tomcat/conf/web.xml文件.在web.xml文件中,有一段如下:<welco ...
- poi 生成图片到excel
try { InputStream iss = new FileInputStream("D:\\test.xlsx"); XSSFWorkbook wb = new XSSFWo ...
- 指向list的指针
#include<list> #include<string> #include<iostream> using namespace std; int main() ...
- sap 提供服务
1: https://blog.csdn.net/stone0823/article/details/81661261?utm_source=blogxgwz1 https://blog.csdn.n ...
- abap对象的创建和调用。方法调用
1: abap中创建类和创建对象,调用方法. *&---------------------------------------------------------------------* ...