最小二乘法的Java实现

摘要:
最小二乘法的原理非常简单,这里不再赘述。对于预测公式y’=a*x+b,最优解如下:双a=Sxy/Sxx;doubleb=yAvg-a*xAvg;doubler=Sxy/数学。sqrt;式中,r为相关系数。绝对值越大,线性相关性越大。通过计算f(a,b)=^2的极值,可以获得上述解。

最小二乘法原理十分简单,这里不再赘述。对于预测公式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实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Xshell 6 提示 “要继续使用此程序,您必须应用最新的更新或使用新版本”Vue中使用openlayer做风场图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

matlab读取cvs文件的几种方法

matlab读取CVS文件的几种方法:1,实用csvread()函数csvread()函数有三种使用方法:1、M=csvread2、M=csvread3、M=csvread第一种方法中,直接输入文件名,将数据读到矩阵M中。textscan函数读取的结果会存在cell数组中。...

Java读取图片和EXIF信息

后台需要读取客户端上传的图像//上传图像的宽度intoriginalheight=originalImg。获取高度();无论是在Windows中直接查看上述代码还是图像,都会获得宽度大于高度的信息。使用上述代码,可以直接读取宽度和高度。该值不考虑图像翻转方向,而是读取图像的EXIF信息。...

CorelDRAW 编写和运行宏指令

在开发和运行CorelDRAW宏之前,必须安装VBA组件。在CoerlDRAW11和12中安装CorelDRAWVBAVBA是典型安装的一部分。2如果安装开始,请单击安装CorelDRAW12 Graphics Suite。CorelDRAWVBA工具栏CorelDRaw工具栏提供了几个快速的VBA函数和对VB编辑器的访问。但是,您可以通过在CorelDRA...

如何更改SQL Server2008默认数据库的存储路径

1.在安装SQlServer时,修改路径:当然,也可以修改共享函数目录和实例根目录。但是,我不知道共享函数目录和实例根目录是什么。...

【解决方法】ModuleNotFoundError: No module named 'flask._compat'

起源最近发下很多人在我的python课程下面提问,关于安装完扩展运行程序的时候出现如下的莫名其妙的错误Traceback(mostrecentcalllast):File"manage_web.py",line2,infromapplicationimportapp,managerFile"/data/www/private_deploy/python3_y...

C# winform开发嵌套Chrome内核浏览器(WebKit.net)开发(一)

//Www.cnblogs.com/Maxq/p/6566558.htmlWebKit.net是WebKit的一个net包。使用它,。net程序可以非常方便地集成和使用webkit作为加载网页的容器。EventArgse){WebKit.WebKitBrowser=newWebKitBrowser();this.Controls.Add(浏览器);...