001package org.opengion.penguin.math.statistics; 002 003import java.util.Arrays; 004import org.apache.commons.math3.stat.regression.SimpleRegression; 005 006/** 007 * apache.commons.mathを利用した線形単回帰計算のクラスです。 008 * f(x)=ax+bの形で線形回帰を行います。 009 */ 010public class HybsSimpleRegression implements HybsRegression { 011 private final double[] cnst = new double[3] ; // 係数(0次、1次、2次は常に0) 012 013 private double rsquare; // 決定係数 014 015 /** 016 * コンストラクタ。 017 * 与えた二次元データを元に回帰直線を計算します。 018 * {x,y}の配列でデータを与えます。 019 * 020 * @param data xとyの組み合わせの配列 021 */ 022 public HybsSimpleRegression( final double[][] data ) { 023 // ここで単回帰計算 024 train( data ); 025 } 026 027 /** 028 * dataを与えて回帰直線を求める。 029 * 030 * @param data {x,y}の配列 031 */ 032 private void train( final double[][] data ) { 033 final SimpleRegression regression = new SimpleRegression(); 034 regression.addData( data ); 035 036 cnst[2] = 0 ; // 2次係数は、常に0 037 cnst[1] = regression.getSlope(); 038 cnst[0] = regression.getIntercept(); 039 040 rsquare = regression.getRSquare(); 041 } 042 043 /** 044 * 決定係数の取得。 045 * 046 * @return 決定係数 047 */ 048 @Override 049 public double getRSquare() { 050 return rsquare; 051 } 052 053 /** 054 * 係数(0次、1次、2次は常に0)の順にセットした配列を返します。 055 * 056 * @return 係数の配列 057 */ 058 @Override 059 public double[] getCoefficient() { 060 return Arrays.copyOf( cnst,cnst.length ); 061 } 062 063 /** 064 * a + bxを計算。 065 * 066 * @param in_x 必要な大きさの変数配列 067 * @return 計算結果 068 */ 069 @Override 070 public double predict( final double... in_x ) { 071 return cnst[1] * in_x[0] + cnst[0]; 072 } 073 074 //************** ここまでが本体 ************** 075 /** 076 * ここからテスト用mainメソッド 。 077 * 078 * @param args 引数 079 */ 080 public static void main( final String[] args ) { 081 final double[][] data = {{1, 2.3}, {2, 3.4}, {3, 6.1}, {4, 8.2}}; 082 083 final HybsSimpleRegression sr = new HybsSimpleRegression(data); 084 085 final double[] cnst = sr.getCoefficient(); 086 087 System.out.println(cnst[2]); 088 System.out.println(cnst[1]); 089 System.out.println(cnst[0]); 090 091 System.out.println(sr.predict( 5 )); 092 } 093} 094