    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] ;           // 係数(０次、１次、２次は常に０)
    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 ;                                                   // ２次係数は、常に０
    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         * 係数(０次、１次、２次は常に０)の順にセットした配列を返します。
    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