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