最小二乗法
戻る
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 );
}
}
戻る