最小二乗法

戻る

import java.util.*;

/**
* 最小二乗法を使い、直線の勾配および切片を求める
* $Id: LeastSquaresLine.html,v 1.1 2009/06/22 16:11:49 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
public class LeastSquaresLine {

    private List pointList;
    /** 直線の勾配 */
    private double gradient;
    /** 直線の切片 */
    private double intercept;

    public LeastSquaresLine() {
        pointList = new LinkedList();
    }

    public void addPoint( double x, double y ) {
        double[] point = new double[ 2 ];
        point[ 0 ] = x;
        point[ 1 ] = y;

        pointList.add( point );
    }

    public void clear() {
        if ( pointList != null ) {
            pointList.clear();
        }
    }

    /** 勾配を求める
    @return 勾配の値
    */
    public double getGradient() {

        // 分子の計算
        double numerator = 0.0;
        numerator = pointList.size() * getSigmaOfXY() - getSigmaOfX() * getSigmaOfY();

        // 分母の計算
        double denominator = 0.0;
        denominator = pointList.size() * getSigmaOfXX() - getSigmaOfX() * getSigmaOfX();

        gradient = numerator / denominator;

        return gradient;
    }

    /** 切片を求める
    @return 切片の値
    */
    public double getIntercept() {

        // 分子の計算
        double numerator = 0.0;
        numerator = getSigmaOfXX() * getSigmaOfY() - getSigmaOfXY() * getSigmaOfX();

        // 分母の計算
        double denominator = 0.0;
        denominator = pointList.size() * getSigmaOfXX() - getSigmaOfX() * getSigmaOfX();

        intercept = numerator / denominator;

        return intercept;
    }

    private double getSigmaOfXY() {
        double value = 0.0;

        int n = pointList.size();
        for ( int i = 0;i < n;i++ ) {
            double[] point = ( double[] ) pointList.get( i );
            double x = point[ 0 ];
            double y = point[ 1 ];

            value += x * y;
        }

        return value;
    }

    private double getSigmaOfX() {
        double value = 0.0;

        int n = pointList.size();
        for ( int i = 0;i < n;i++ ) {
            double[] point = ( double[] ) pointList.get( i );
            double x = point[ 0 ];

            value += x;
        }

        return value;
    }

    private double getSigmaOfY() {
        double value = 0.0;

        int n = pointList.size();
        for ( int i = 0;i < n;i++ ) {
            double[] point = ( double[] ) pointList.get( i );
            double y = point[ 1 ];

            value += y;
        }

        return value;
    }

    private double getSigmaOfXX() {
        double value = 0.0;

        int n = pointList.size();
        for ( int i = 0;i < n;i++ ) {
            double[] point = ( double[] ) pointList.get( i );
            double x = point[ 0 ];

            value += x * x;
        }

        return value;
    }


    static public void main( String[] args ) {

        LeastSquaresLine lsl = new LeastSquaresLine();
        lsl.addPoint( 1.0, 1.0 );
        lsl.addPoint( 4.0, 8.0 );

        double gradient = lsl.getGradient();
        double intercept = lsl.getIntercept();
        System.out.println( "直線の勾配は、" + gradient );
        System.out.println( "直線の切片は、" + intercept );

    }
}

戻る inserted by FC2 system