    001package org.opengion.penguin.math.statistics;
    002
    003import org.apache.commons.math3.stat.regression.SimpleRegression;
    004
    005/**
    006 * apache.commons.mathを利用した線形単回帰計算のクラスです。
    007 * f(x)=ax+bの形で線形回帰を行います。
    008 */
    009public class HybsSimpleRegression implements HybsSingleRegression {
    010        private double slope;           // 傾き
    011        private double intercept;       // 切片
    012        private double rsquare;         // 決定係数
    013
    014        /**
    015         * コンストラクタ。
    016         * 与えた二次元データを元に回帰直線を計算します。
    017         * {x,y}の配列でデータを与えます。
    018         * @param data xとyの組み合わせの配列
    019         */
    020        public HybsSimpleRegression(final double[][] data){
    021                // ここで単回帰計算
    022                train(data);
    023        }
    024
    025        /**
    026         * コンストラクタ。
    027         * 計算後の傾き、切片を与えられるようにしておきます。
    028         * （以前に計算したものを利用）
    029         * @param slope
    030         * @param intercept
    031         *
    032         */
    033        public HybsSimpleRegression( final double slope, final double intercept ){
    034                this.slope = slope;
    035                this.intercept = intercept;
    036        }
    037
    038        /**
    039         * コンストラクタ
    040         * このコンストラクタを利用した場合はtrainを実施して学習するか、setCoefficientで係数をセットする。
    041         */
    042        public HybsSimpleRegression(){
    043                //何もしない
    044        }
    045
    046        /**
    047         * dataを与えて回帰直線を求める。
    048         *
    049         * @param data x,yの配列
    050         */
    051        public void train(final double[][] data){
    052                SimpleRegression regression = new SimpleRegression();
    053                regression.addData(data);
    054                slope = regression.getSlope();
    055                intercept = regression.getIntercept();
    056                rsquare = regression.getRSquare();
    057        }
    058
    059        /**
    060         * このクラスでは未使用。
    061         *
    062         * @param opt オプション
    063         */
    064        public void setOption(final double[] opt){
    065                // 特にオプションなし
    066        }
    067
    068        /**
    069         * 傾きの取得。
    070         * @return 傾き
    071         */
    072        public double getSlope(){
    073                return slope;
    074        }
    075
    076        /**
    077         * 切片の取得。
    078         * @return 切片
    079         */
    080        public double getIntercept(){
    081                return intercept;
    082        }
    083
    084        /**
    085         * 決定係数の取得。
    086         * @return 決定係数
    087         */
    088        public double getRSquare(){
    089                return rsquare;
    090        }
    091
    092        /**
    093         * 傾き、切片、決定係数の順にセットした配列を返します。
    094         * @return 係数の配列
    095         */
    096        public double[] getCoefficient(){
    097                double[] rtn = {slope,intercept,rsquare};
    098                return rtn;
    099        }
    100
    101        /**
    102         * 傾き、切片の順に配列の内容をセットします。
    103         * 3番目に決定係数が入っていても無視します。
    104         *
    105         * @param c 係数配列
    106         */
    107        public void setCoefficient(final double[] c){
    108                slope = c[0];
    109                intercept = c[1];
    110        }
    111
    112        /**
    113         * a + bxを計算。
    114         * @param x 変数X
    115         * @return 計算結果
    116         */
    117        public double predict(final double x){
    118                return intercept + slope * x;
    119        }
    120
    121        /*** ここまでが本体 ***/
    122        /*** ここからテスト用mainメソッド ***/
    123        /**
    124         * @param args *****************************************/
    125        public static void main(final String [] args) {
    126                double[][] data = {{1, 2.3}, {2, 3.4}, {3, 6.1}, {4, 8.2}};
    127
    128
    129                HybsSimpleRegression sr = new HybsSimpleRegression(data);
    130                System.out.println(sr.getIntercept());
    131                System.out.println(sr.getSlope());
    132                System.out.println(sr.getRSquare());
    133
    134                System.out.println(sr.predict( 5 ));
    135        }
    136}
    137