2016年1月29日金曜日

総組み合わせ計算環境の構築

大量な計算をするための環境を作ってみます。 研究としてはあまり意味はないのですが、どの程度の計算をどの規模でできるかは今後のために限界を知っておく必要があります。 今回は総組み合わせ計算をして結果をデータベースに格納するまでやってみます。

[今回の環境]:
OS : CentOS6.7 64bit
仮想化ソフト : VMWare Fusion Mac版

1.CentOSの初期設定
CentOSのインストール
簡易インストールでやると何故か起動できない。通常インストールで実施。
途中のネットワーク設定で、eth0を自動起動にしておき、今回の場合は学内なので固定IPアドレス設定をする。VMWareの方もブリッジ接続にしておく。
インストール後
# yum update
# vi /etc/sysconfig/selinux
SELINUX=disabled
# service iptables stop
# chkconfig iptables off
# cgkconfig ip6tables off
# reboot
今後はsshでログインして作業をする(VMWare内だとロックが面倒)

2.各種サーバインストール
[Javaのインストール]
# yum install java-devel
# javac -version で確認

[LAMP環境]
# yum install httpd
# service httpd start
# chkconfig httpd on
# yum install php php-mbstring php-mysql
# service httpd restart
# yum install vsftpd
# service vsftpd start
# chkconfig vsftpd on
# yum install mysql-server
# service mysqld start
# chkconfig mysqld on
# yum install epel-release
# yum --enablerepo=epel  install phpMyAdmin
# vi /etc/httpd/conf.d/phpMyAdmin.conf
# vi /etc/phpMyAdmin/config.inc.php
# service httpd restart

3.アプリケーション設定
これにjavaプログラムをのせて動くように設定する。
得られたデータをダンプ取り、アップロード時に注意すること

2016年1月26日火曜日

LocalSolver(2) : データベースの連携

LocalSolverとデータベースの連携をします。
LocalSolverではKnapsack問題を

8 : 拠点数
10 60 30 40 30 20 20 2 : weights
1 10 15 40 60 90 100 15 : values
102 : 制約条件

のようにファイルを取り込んでやっていますが、これを外部のデータベースに接続して持ってきます。
Exampleにあるknapsack.javaをknapsack01.javaとしてコピーし、コードを改良します。
$ /opt/localsolver_5_5/examples/knapsack
$ vi Knapsack01.java
$ sudo javac Knapsack01.java -cp /opt/localsolver_5_5/bin/localsolver.jar
sudo java -cp /Users/mizuno/Desktop/work/mysql-connector-java-5.1.21-bin.jar:/opt/localsolver_5_5/bin/localsolver.jar:. -Djava.library.path=/opt/localsolver_5_5/bin/ Knapsack01
[出力結果]
90 100 120 80 100 150 100 60 100 30 100 120 100 200 120 100 120 100 80 100 50 100 90 100 130 100 140 100 90 100 100 70 100 170 100 20 100 50 100 80 100 140
10 6 8 2 8 4 10 7 5 10 9 4 8 7 7 9 10 10 5 6 8 7 1 3 7 2 10 9 4 2 10 8 5 2 10 7 6 3 4 8 2 10
nbItems=42
knapsackBound=2000
Preprocess model 100% ...
Close model 100% ...
Initialize threads 100% ...
Push initial solutions 100% ...

Model:
  expressions = 154, operands = 254
  decisions = 42 (bool = 42, int = 0, float = 0),
  constraints = 1, objectives = 1, constants  = 25
  Preprocessing transformed 44 expressions

Param:
  time limit = 10 sec, no iteration limit
  seed = 0, nb threads = 2, annealing level = 1

Objectives:
  Obj 0: maximize, bound = 273

Phases:
  Phase 0: time limit = 10 sec, no iteration limit, optimized objective = 0


Phase 0:
[  0 sec,       0 itr] : obj =          191
[  1 sec,   82847 itr] : obj =          191
[  2 sec,  262753 itr] : obj =          191
[  3 sec,  444421 itr] : obj =          191
[  4 sec,  623025 itr] : obj =          191
[  5 sec,  741841 itr] : obj =          191
[  6 sec,  921965 itr] : obj =          191
[  7 sec, 1102912 itr] : obj =          191
[  8 sec, 1284998 itr] : obj =          191
[  9 sec, 1466748 itr] : obj =          191
[ 10 sec, 1587356 itr] : obj =          191
[ 10 sec, 1587356 itr] : obj =          191

1587356 iterations, 3174586 moves performed in 10 seconds
Feasible solution: obj =          191

[出力ファイル:result]
$ cat result
0 2 4 6 7 9 10 12 15 16 17 18 20 21 26 27 30 31 34 35 39 41 (拠点の配列インデックス)

[knapsack01.java]



/********** Knapsack01.java **********/
import java.sql.*;
import java.util.*;
import java.io.*;
import localsolver.*;

public class Knapsack01 {
    /* Number of items. */
    int nbItems;

    /* Items properties. */
    int[] weights;
    int[] values;

    public int[] getValues(){ return this.values;}
    public int[] getWeights(){ return this.weights;}

    /* Knapsack bound */
    int knapsackBound;

    /* Solver. */
    LocalSolver localsolver;

    /* LS Program variables. */
    LSExpression[] x;

    /* Solutions (classes at each position). */
    List solutions;

    public Knapsack01(int nbItems, int knapsackBound){
        MySQL mysql = new MySQL();
        ResultSet rs = mysql.selectFacilities();
        this.nbItems = nbItems;
        weights = new int[nbItems];
        values = new int[nbItems];
        this.knapsackBound = knapsackBound;
        int index = 0;
        try {
                while(rs.next()){
                        values[index] = rs.getInt("popularity");
                        weights[index] = rs.getInt("cost");
                        index++;
                }
        }catch (SQLException e) {
                        e.printStackTrace();
        }


    }


    /* Reads instance data. */
    void readInstance(String fileName) {
        try {
            Scanner input = new Scanner(new File(fileName));

            nbItems = input.nextInt();

            weights = new int[nbItems];
            for (int i = 0; i < nbItems; i++) {
                weights[i] = input.nextInt();
            }

            values = new int[nbItems];
            for (int i = 0; i < nbItems; i++) {
                values[i] = input.nextInt();
            }

            knapsackBound = input.nextInt();

            input.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    void solve(int limit) {
        try {
            /* Declares the optimization model. */
            localsolver = new LocalSolver();
            LSModel model = localsolver.getModel();
            x = new LSExpression[nbItems];

            System.out.println("nbItems="+nbItems);
            System.out.println("knapsackBound="+knapsackBound);

            // boolean variables x[i]
            for (int i = 0; i < nbItems; i++) {
                x[i] = model.boolVar();
                x[i].setName("x[" + i + "]");
            }

            // weight constraint
            LSExpression weightSum = model.sum();
            for (int i = 0; i < nbItems; i++) {
                LSExpression itemWeight = model.prod(x[i],weights[i]);
                weightSum.addOperand(itemWeight);
            }
            model.constraint(model.leq(weightSum,knapsackBound));

            // maximize value
            LSExpression valueSum = model.sum();
            for (int i = 0; i < nbItems; i++) {
                LSExpression itemValue = model.prod(x[i],values[i]);
                valueSum.addOperand(itemValue);
            }

            model.maximize(valueSum);
            model.close();

            /* Parameterizes the solver. */
            LSPhase phase = localsolver.createPhase();
            phase.setTimeLimit(limit);

            localsolver.solve();

            solutions = new ArrayList();
            for (int i = 0; i < nbItems; i++)
                if (x[i].getValue() == 1)
            solutions.add(i);

        } catch (LSException e) {
            System.out.println("LSException:" + e.getMessage());
            System.exit(1);
        }
    }

    /* Writes the solution in a file */
    void writeSolution(String fileName) {
        try {
            BufferedWriter output = new BufferedWriter(new FileWriter(fileName));

            for (int i = 0; i < solutions.size(); ++i)
                output.write(solutions.get(i) + " ");

            output.write("\n");

            output.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

     public static void main(String[] args) {

        String outputFile = "result";

        Knapsack01 model = new Knapsack01(42, 2000);
        //model.readInstance(instanceFile);
        String strTimeLimit = "10";
        int values[] = model.getValues();
        int weights[] = model.getWeights();
        for(int i = 0; i < 42; i++) System.out.print(weights[i]+" ");
        System.out.println("");
        for(int i = 0; i < 42; i++) System.out.print(values[i]+" ");
        System.out.println("");

        model.solve(Integer.parseInt(strTimeLimit));
        if(outputFile != null) {
            model.writeSolution(outputFile);
        }
    }
}

class MySQL {

        String driver;
        String server, dbname, url, user, password;
        Connection con;
        Statement stmt;
        ResultSet rs;

        public MySQL() {
                this.driver = "org.gjt.mm.mysql.Driver";
                this.server = "gardenkana.naisyo.com";
                this.dbname = "gardenkamo";
                this.url = "jdbc:mysql://" + server + "/" + dbname + "?useUnicode=true&characterEncoding=UTF-8";
                this.user = "garden?";
                this.password = "oshienaiyo";
                try {
                        this.con = DriverManager.getConnection(url, user, password);
                        this.stmt = con.createStatement ();
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                try {
                        Class.forName (driver);
                } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
        public void close(){
                try {
                        rs.close();
                        stmt.close();
                        con.close();
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

        public ResultSet selectFacilities(){

                String sql = "SELECT * FROM facilities";
                ResultSet rs = null;
                try {
                        rs = stmt.executeQuery (sql);
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return rs;
        }

}


rJava : プログラミング(11) Steel-Dwass法(non-parametoric, 等分散性制限無し)

まずBatlettで等分散性を検定、今回は帰無仮説が棄却され等分散性が成立しないので、Steel-Dwass法(non-parametoric, 等分散性制限無し)を利用した。

Rでやってみると
$ R
> source("http://aoki2.si.gunma-u.ac.jp/R/src/Steel-Dwass.R")
> data <- br="" c="">+ 0.1875, 1.3333333333333, 1.5384615384615, 1.9763313609467, 0.76748582230624, 1.6859504132231, 1.1142659279778, 1.1358024691358, 0.80555555555556, 3.2448979591837, 3.1675338189386, 3.1466836734694, 2.8512110726644, 2.0, 2.0826446280992,
+ 0.484375, 0.13888888888889, 2.2366863905325, 1.905325443787, 0.69187145557656, 1.6528925619835, 0.92243767313019, 1.1111111111111, 1.2222222222222, 3.1683673469388, 4.1727367325702, 5.0956632653061, 2.4636678200692, 1.7777777777778, 2.7272727272727,
+ 0.234375, 0.13888888888889, 1.6213017751479, 0.071005917159763, 0.5179584120983, 1.6461776859504, 0.82271468144044, 1.1358024691358, 1.3333333333333, 3.6734693877551, 4.1727367325702, 5.6772959183673, 3.4048442906574, 2.9876543209877, 2.9752066115702,
+ 0.0, 0.0, 1.5621301775148, 10.236686390533, 0.80151228733459, 1.5599173553719, 1.1004155124654, 1.7777777777778, 2.4722222222222, 4.9183673469388, 5.6357960457856, 6.6058673469388, 2.8512110726644, 3.1358024691358, 1.8842975206612)
> group <- 15="" br="" c="" rep="">> Steel.Dwass(data, group)
             t         p
1:2 0.02073903 0.9999968
1:3 0.02074365 0.9999968
1:4 0.70528407 0.8950434
2:3 0.18669284 0.9976931
2:4 0.66379678 0.9106851
3:4 0.64298158 0.9180231

となった。有意性は確認できない。rjavaでやると
$ vi JRITest13.java
$ javac JRITest13.java
$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest13

[VECTOR ([REAL* (16.294575129341144)], [REAL* (3.0)], [REAL* (9.866990036363195E-4)], [STRING "score by group"], [STRING "Bartlett test of homogeneity of variances"])]
[REAL* (0.020739033894608506, 0.020743649235467825, 0.7052840740059061, 0.18669284311921042, 0.6637967755349704, 0.6429815765773006, 0.9999967966772032, 0.9999967945383197, 0.8950433896624197, 0.9976931476869926, 0.9106851171476555, 0.9180230907044584)]
となる。


import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
import java.sql.*;
import java.util.Arrays;

public class JRITest13 {

        public static void main(String[] args)
        {
                MySQL mysql = new MySQL();
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
                ResultSet rs = mysql.selectOperators();

                int N = 15;
                double awareness [] = new double[N];
                double decision [] = new double[N];
                double communication [] = new double[N];
                double leadership [] = new double[N];
                int index = 0;
                try {
                        while(rs.next()){
                                awareness[index] = rs.getDouble("s_awareness");
                                decision[index] = rs.getDouble("s_decision");
                                communication[index] = rs.getDouble("s_communication");
                                leadership[index] = rs.getDouble("s_leadership");
                                index ++;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                //System.out.println(Arrays.toString(result));
                double score[] = new double[awareness.length*4];
                int index2 = 0;
                for(int i = 0 ; i< awareness.length; i++) score[index2++] = awareness[i];
                for(int i = 0 ; i< decision.length; i++) score[index2++] = decision[i];
                for(int i = 0 ; i< communication.length; i++) score[index2++] = communication[i];
                for(int i = 0 ; i< leadership.length; i++) score[index2++] = leadership[i];

                System.out.println(Arrays.toString(score));

                StringBuffer buf = new StringBuffer();
                buf.append("score<-c(");
                for(int i = 0; i < score.length; i++){
                        if(i == score.length -1)
                                buf.append(score[i]+")");
                        else
                                buf.append(score[i]+",");
                }
                String c_value = buf.toString();
                re.eval(c_value);

                REXP x = re.eval("summary(score)");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }

                //Bartlett Test
                re.eval("group=factor(rep(c('awareness', 'decision', 'communication', 'leadership'), c(15, 15, 15, 15)))");
                REXP x1 = re.eval("bartlett.test(score ~ group)");
                System.out.println(x1);

                //Steel.Dwass Test
                re.eval("source('http://aoki2.si.gunma-u.ac.jp/R/src/Steel-Dwass.R')");
                re.eval("group <- rep(1:4, c(15, 15, 15, 15))");
                REXP x2 = re.eval("Steel.Dwass(score,group)");
                System.out.println(x2);

                re.end();
        }
}


参考
http://www.shiga-med.ac.jp/~koyama/stat/com-ph.html
http://aoki2.si.gunma-u.ac.jp/R/Steel-Dwass.html

2016年1月24日日曜日

rJava : プログラミング(10) F Test(2群における等分散検定)

一人の手術者の評価の前半、後半で得点の差があるか検定するために、2群の得点が等分散かどうかF検定をやってみます。

F検定:対象37件
帰無仮説:2群間の分散に差がない(等分散である)
 今回の2つの群は
[39.0, 40.0, 39.0, 38.0, 38.0, 43.0, 48.0, 43.0, 41.0, 44.0, 35.0, 36.0, 37.0, 30.0, 46.0, 40.0, 44.0, 40.0]
[45.0, 36.0, 45.0, 38.0, 39.0, 45.0, 40.0, 44.0, 48.0, 45.0, 45.0, 46.0, 40.0, 44.0, 37.0, 45.0, 48.0, 44.0, 43.0]
となり、
一つ目のsummaryは、意味は(Min    最小値, 1st Qu    第一四分位数, Median    中央値, Mean    平均値, 3rd Qu    第三四分位数, Max    最大値)
(30.0, 38.0, 40.0, 40.06, 43.0, 48.0)
 2つ目は
(36.0, 40.0, 44.0, 43.0, 45.0, 48.0)
最小値も平均も高いので、後半の方が良さそうだけど、t検定をする予定。そのために等分散を検定しておく。

$ vi JRITest14.java
$ javac JRITest14.java
$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest14

[VECTOR ([REAL* (1.4314578005115088)], [INT* (17, 18)], [REAL* (0.45734976337721367)], [REAL* (0.547029015180649, 3.7965176255066506)], [REAL* (1.4314578005115088)], [REAL* (1.0)], [STRING "two.sided"], [STRING "F test to compare two variances"], [STRING "c_group1 and c_group2"])]

p-value = 0.45734976337721367
なので帰無仮説が採択。よって等分散が言える。

[JRITest14.java]
今回のSQL文
String sql = "SELECT * FROM operations WHERE category = 0 AND evaluator <=15 and operator =6";


import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
import java.sql.*;
import java.util.Arrays;

public class JRITest14 {

        public static void main(String[] args)
        {
                MySQL mysql = new MySQL();
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
                ResultSet rs = mysql.selectOperations();

                int N = 37;
                double group1 [] = new double[N/2];
                double group2 [] = new double[N/2+1];//**注意i:奇数の時は+1**

                int index = 0;
                try {
                        while(rs.next()){
                                if(index < (int)(N/2)){
                                        group1[index] = rs.getDouble("value");
                                }else if(index >= (int)(N/2)){
                                        group2[index-(int)(N/2)] = rs.getDouble("value");
                                }
                                index ++;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }

                System.out.println(Arrays.toString(group1));
                System.out.println(Arrays.toString(group2));

                StringBuffer buf1 = new StringBuffer();
                buf1.append("c_group1<-c(");
                for(int i = 0; i < group1.length; i++){
                        if(i == group1.length-1)
                                buf1.append(group1[i]+")");
                        else
                                buf1.append(group1[i]+",");
                }
                String c_group1 = buf1.toString();
                re.eval(c_group1);

                REXP x1 = re.eval("summary(c_group1)");
                System.out.println(x1);
                double [] ary1 = x1.asDoubleArray();
                for (int i = 0; i < ary1.length; i++) {
                        System.out.println(ary1[i]);
                }

                StringBuffer buf2 = new StringBuffer();
                buf2.append("c_group2<-c(");
                for(int i = 0; i < group2.length; i++){
                        if(i == group2.length-1)
                                buf2.append(group2[i]+")");
                        else
                                buf2.append(group2[i]+",");
                }
                String c_group2 = buf2.toString();
                re.eval(c_group2);

                REXP x2 = re.eval("summary(c_group2)");
                System.out.println(x2);
                double [] ary2 = x2.asDoubleArray();
                for (int i = 0; i < ary2.length; i++) {
                        System.out.println(ary2[i]);
                }

                REXP x3 = re.eval("var.test(c_group1, c_group2)");
                System.out.println(x3);
                re.end();
        }
}


参考
http://kusuri-jouhou.com/statistics/fkentei.html
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/65.html
http://monge.tec.fukuoka-u.ac.jp/r_analysis/test_t03.html

2016年1月23日土曜日

Hubeny : 2点間の緯度、経度から距離を算出するプログラム

Hubeny : 2点間の緯度、経度から距離を算出するプログラム : PHP版
Javaはこちら:https://github.com/smzn/Hubeny


        public function Hubeny_Distance_start($x1, $y1, $x2, $y2){
                $d;//二点間距離
                $X1; $Y1; $X2; $Y2;//各値のラジアン値
                $dx; $dy;//X値、Y値の差
                $MuY;//緯度の平均値
                $W;
                $M;//子午線曲率半径
                $N;//卯酉線曲率半径
                //double E =0.00669437999014;//第一離心率eの二乗
                $E;
                $a=6378137.0;//長半径(赤道半径)
                $b=6356752.314140;//短半径(極半径)

                $X1 = $this->_toRadians($x1);
                $Y1 = $this->_toRadians($y1);
                $X2 = $this->_toRadians($x2);
                $Y2 = $this->_toRadians($y2);
                $dx = $X1-$X2;
                $dy = $Y1-$Y2;
                $MuY = ($Y1+$Y2)/2;
                $E = (($a*$a)-($b*$b))/($a*$a);
                $W = sqrt( 1-($E*(sin($MuY)*sin($MuY))) );
                $M = ($a*(1-$E)) / ($W*$W*$W);
                $N = $a/$W;
                $d = sqrt((($dy*$M)*($dy*$M))+(($dx*$N*cos($MuY))*($dx*$N*cos($MuY))));
                return $d;
        }

        public function _toRadians($deg)
        {
                return $deg * M_PI / 180.0;
        }

    /*
     * ラジアンを角度に変換する
     */
        public function _toDegrees($rad)
        {
            return $rad * 180.0 / M_PI;
        }

2016年1月21日木曜日

Android : データベース情報をGoogleMapに表示

前回、データベースからの情報をAndroidで受け取って表示すること(http://mizunolab.sist.ac.jp/2016/01/android-json.html)をやったので、取得情報をGoogleMapで表示するプログラムを作っておいた。
Android ソースコード
Web側(Cakephp : Jsonコードを出力)

        public function index2($name = 'j13000') {
                $this->Point->recursive = 0;

                //if (!is_null($name)) {
                        $this->paginate = array(
                                'conditions'=>array(
                                        'name' => $name
                                ),
                        'order' => array('id' => 'desc'),
                        'limit'=>20,
                        'fields' => array('id','name','latitude', 'longitude'),
                        );
                //}

                $datas = $this->Paginator->paginate();

                foreach ($datas as $data){
                        $datas['Point'][] = array(
                                'id'=> $data['Point']['id'],
                                'name' => $data['Point']['name'],
                                'latitude' => $data['Point']['latitude'],
                                'longitude' => $data['Point']['longitude'],
                        );
                }


                header('Content-Type: application/json');
                echo json_encode($datas);
                exit;

                $this->set('points', $this->Paginator->paginate());
        }

2016年1月20日水曜日

LocalSolver(1) : 起動とJavaの実行

LocalSolverの利用法です。ライセンス取得やテストに関しては下記を参考
http://www.msi-jp.com/localsolver/quickguide/gettingstarted/macos.html

localsolverコマンドを利用するので、/opt/localsolver_5_5/bin にパスを通す。
ホームディレクトリにて
$ vi .bash_profile
export PATH=$PATH:/opt/localsolver_5_5/bin
$ source .bash_profile

上記に書いてあるテストを実行してみる。

$ cd /opt/localsolver_5_5/examples/toy/
$ localsolver toy.lsp lsTimeLimit=1




lspファイルは実行できたので、次はJavaで実行する。
同じディレクトリで下記を実行。パーミッションエラーの場合は sudo をつける。
$ javac Toy.java -cp /opt/localsolver_5_5/bin/localsolver.jar
$ java -cp /opt/localsolver_5_5/bin/localsolver.jar:. -Djava.library.path=/opt/localsolver_5_5/bin/ Toy



LSPとJava両方で実行ができました。
Knapsack問題のものも実行してみます。
/opt/localsolver_5_5/examples/knapsack へ移動
$ sudo javac Knapsack.java -cp /opt/localsolver_5_5/bin/localsolver.jar
 $ sudo java -cp /opt/localsolver_5_5/bin/localsolver.jar:. -Djava.library.path=/opt/localsolver_5_5/bin/ Knapsack ./instances/kp_100_1.in

instanceフォルダに価値と重さが入っているファイルがあるので、1番目の引数につける。inputFile [outputFile] [timeLimit] 2番目と3番目の引数はオプション。


 入力ファイルを確認する。
$ cat instances/kp_100_1.in
最初の数字100が商品数
次の100件の数字が商品のweight、次の100件の数字が商品のvalue、
最後の数字がKnapsackBound(制約条件)。
 作成されたファイルには、商品番号が入っている


rJava : プログラミング(9) Bonferroni Test(多群(3群以上)分散分析)

Bartlett検定で等分散性が言えたので、Bonferroni検定を使って分散分析をしていきます。
Bonferroniを使う条件として
・各群の数:一致している
・分布:正規分布に従う
・分散:等分散性あり
ということで、各群の数が一致して、Bartlettが成立していれば大丈夫そうです。
参考:http://www.shiga-med.ac.jp/~koyama/stat/com-ph.html

段取りとしては、Bartlettの流れとほぼ同じで、得られたスタック配列をbonferroniを指定すればいいです。
[対応あり:Bonferroni]
REXP x1 = re.eval("pairwise.t.test(score, group, p.adjust.method='bonferroni',paired=TRUE)");

 結果は
のように出てくるので、4行4列の下三角部分に並べていきます。





$ vi JRITest12.java
$ javac JRITest12.java
$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest12
[VECTOR ([STRING "paired t tests"], [STRING "score and group"], [REAL* (0.5201862426593824, 1.0, 1.7887801018064625E-7, NaN, 1.0, 4.551864014755463E-6, NaN, NaN, 2.258041561699781E-7)], [STRING "bonferroni"])]

[JRITest12.java] MySQLクラスは同じ


import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
import java.sql.*;
import java.util.Arrays;

public class JRITest12 {

        public static void main(String[] args)
        {
                MySQL mysql = new MySQL();
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
                ResultSet rs = mysql.selectOperations();

                int N = 272;
                double awareness [] = new double[N];
                double decision [] = new double[N];
                double communication [] = new double[N];
                double leadership [] = new double[N];
                int index = 0;
                try {
                        while(rs.next()){
                                awareness[index] = rs.getInt("awareness");
                                decision[index] = rs.getInt("decision");
                                communication[index] = rs.getInt("communication");
                                leadership[index] = rs.getInt("leadership");
                                index ++;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                //System.out.println(Arrays.toString(result));
                double score[] = new double[awareness.length*4];
                int index2 = 0;
                for(int i = 0 ; i< awareness.length; i++) score[index2++] = awareness[i];
                for(int i = 0 ; i< decision.length; i++) score[index2++] = decision[i];
                for(int i = 0 ; i< communication.length; i++) score[index2++] = communication[i];
                for(int i = 0 ; i< leadership.length; i++) score[index2++] = leadership[i];

                System.out.println(Arrays.toString(score));

                StringBuffer buf = new StringBuffer();
                buf.append("score<-c(");
                for(int i = 0; i < score.length; i++){
                        if(i == score.length -1)
                                buf.append(score[i]+")");
                        else
                                buf.append(score[i]+",");
                }
                String c_value = buf.toString();
                re.eval(c_value);

                REXP x = re.eval("summary(score)");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }

                re.eval("group=factor(rep(c('awareness', 'decision', 'communication', 'leadership'), c(272, 272, 272, 272)))");
                REXP x1 = re.eval("pairwise.t.test(score, group, p.adjust.method='bonferroni',paired=TRUE)");
                System.out.println(x1);

                re.end();
        }
}



参考
http://monge.tec.fukuoka-u.ac.jp/r_analysis/test_t06_anova.html



2016年1月19日火曜日

rJava : プログラミング(8) Bartlett Test(等分散性の検定)

今回はoperationsテーブル274レコードの4カテゴリの等分散性(各群の母分散が等しく、正規分布に従う)ことを示すために、Bartlett検定をやりました。

[帰無仮説]:4群のデータの分散は等質である
p-valueの値>0.05であれば、帰無仮説は棄却されずに採択されるため、4カテゴリの母分散は等しくないとは言えない(等分散性あり)と言えます。

[手順]
1.operationsテーブルから274件を取り込む
2.スタック形式配列 score = [awareness decision communication leadership]の順で配列を作成
3.Rにscoreを渡し、bartlett検定。結果を得る。

$ vi JRITest11.java




import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
import java.sql.*;
import java.util.Arrays;

public class JRITest11 {

        public static void main(String[] args)
        {
                MySQL mysql = new MySQL();
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
                ResultSet rs = mysql.selectOperations();

                int N = 274;
                double awareness [] = new double[N];
                double decision [] = new double[N];
                double communication [] = new double[N];
                double leadership [] = new double[N];
                int index = 0;
                try {
                        while(rs.next()){
                                awareness[index] = rs.getInt("awareness");
                                decision[index] = rs.getInt("decision");
                                communication[index] = rs.getInt("communication");
                                leadership[index] = rs.getInt("leadership");
                                index ++;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
               
                double score[] = new double[awareness.length*4];
                int index2 = 0;
                for(int i = 0 ; i< awareness.length; i++) score[index2++] = awareness[i];
                for(int i = 0 ; i< decision.length; i++) score[index2++] = decision[i];
                for(int i = 0 ; i< communication.length; i++) score[index2++] = communication[i];
                for(int i = 0 ; i< leadership.length; i++) score[index2++] = leadership[i];

                StringBuffer buf = new StringBuffer(); 
                buf.append("score<-c(");
                for(int i = 0; i < score.length; i++){
                        if(i == score.length -1)
                                buf.append(score[i]+")");
                        else
                                buf.append(score[i]+",");
                }
                String c_value = buf.toString();
                re.eval(c_value);

                REXP x = re.eval("summary(score)");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }

                re.eval("group=factor(rep(c('awareness', 'decision', 'communication', 'leadership'), c(274, 274, 274, 274)))");
                REXP x1 = re.eval("bartlett.test(score ~ group)");
                System.out.println(x1);

                re.end();
        }
}



$ javac JRITest11.java
[notss_analysis@ip-10-0-0-217 rjava]$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest11
[REAL* (0.0, 9.0, 10.0, 9.765, 12.0, 12.0)]
0.0
9.0
10.0
9.765
12.0
12.0
[VECTOR ([REAL* (7.479622753319318)], [REAL* (3.0)], [REAL* (0.05808434871027897)], [STRING "score by group"], [STRING "Bartlett test of homogeneity of variances"])] 

この結果からp-value=0.05808434871027897となり、p-value>0.05なので帰無仮説が採択で、等分散性が言えます。

2016年1月15日金曜日

rJava : プログラミング(7) Boxplotの生成

今度はデータベースのデータを使ってBoxplotを描いてみました。
MySQLクラスは同じです。

$ vi JRITest09.java


import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
import java.sql.*;
import java.util.Arrays;

public class JRITest09 {

        public static void main(String[] args)
        {
                MySQL mysql = new MySQL();
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
                ResultSet rs = mysql.selectOperators();

                double awareness [] = new double[15];
                double decision [] = new double[15];
                double communication [] = new double[15];
                double leadership [] = new double[15];
                int index = 0;
                try {
                        while(rs.next()){
                                awareness[index] = rs.getDouble("awareness");
                                decision[index] = rs.getDouble("decision");
                                communication[index] = rs.getDouble("communication");
                                leadership[index] = rs.getDouble("leadership");
                                index ++;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                //System.out.println(Arrays.toString(result));

                StringBuffer buf = new StringBuffer();
                buf.append("awareness<-c(");
                for(int i = 0; i < awareness.length; i++){
                        if(i == awareness.length -1)
                                buf.append(awareness[i]+")");
                        else
                                buf.append(awareness[i]+",");
                }
                String c_value = buf.toString();
                re.eval(c_value);
                
                re.eval("decision<-c("+decision[0]+","+decision[1]+","+decision[2]+","+decision[3]+","+decision[4]+","+decision[5]+","+decision[6]+","+decision[7]+","+decision[8]+","+decision[9]+","+decision[10]+","+decision[11]+","+decision[12]+","+decision[13]+","+decision[14]+")");
                re.eval("communication<-c("+communication[0]+","+communication[1]+","+communication[2]+","+communication[3]+","+communication[4]+","+communication[5]+","+communication[6]+","+communication[7]+","+communication[8]+","+communication[9]+","+communication[10]+","+communication[11]+","+communication[12]+","+communication[13]+","+communication[14]+")");
                re.eval("leadership<-c("+leadership[0]+","+leadership[1]+","+leadership[2]+","+leadership[3]+","+leadership[4]+","+leadership[5]+","+leadership[6]+","+leadership[7]+","+leadership[8]+","+leadership[9]+","+leadership[10]+","+leadership[11]+","+leadership[12]+","+leadership[13]+","+leadership[14]+")");
                
                re.eval("png('boxplot.png', 640, 480)");
                re.eval("boxplot(awareness,decision,communication,leadership, main='BoxPlot for mean of each category',names = c('Awareness', 'Decision', 'Communication','Leadership'))");
                re.eval("dev.off()");
                re.end();
        }
}




配列生成のところはfor文でもやってもいいですが、そのまま書いた方がスペースが入らなくすみました。生成したグラフは、図のようになりました。
あとは
$ javac JRITest09.java
$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest09

参考
http://www.ic.daito.ac.jp/~mizutani/R/spread/boxplot.html

2016年1月14日木曜日

Android : Jsonデータ取得

AndroidからHTTP経由でJsonデータを取得し表示する方法です。

1.Web側
今回はCakephpで作ってあるので、indexアクションをコピーしてindex2アクションを作りました。

public function index2() {
                $this->Point->recursive = 0;

                $this->paginate = array(
                        'limit'=>2,
                        'fields' => array('id','name','latitude', 'longitude'),
                 );

                $datas = $this->Paginator->paginate();

                foreach ($datas as $data){
                        $datas['Point'][] = array(
                                'id'=> $data['Point']['id'],
                                'name' => $data['Point']['name'],
                                'latitude' => $data['Point']['latitude'],
                                'longitude' => $data['Point']['longitude'],
                        );
                }

                header('Content-Type: application/json');
                echo json_encode($datas);
                exit;
        }

※注意
               foreach ($datas as $data){
                        $datas['Point'][] = array(
                                'id'=> $data['Point']['id'],
                                'name' => $data['Point']['name'],
                                'latitude' => $data['Point']['latitude'],
                                'longitude' => $data['Point']['longitude'],
                        );
                }
findでそのままできれば良かったが、配列を作り直さなければうまくいかなかった。

2.Android側
 AsyncTaskクラスを利用(http://mizunolab.sist.ac.jp/2016/01/android-asynctask.html)
ソースコード

Android : AsyncTaskクラスについて

授業でAndroidのWeb連携をやっている時に、AsyncTaskクラスを使っているが、実は自分でも理解できてないところが多い。ちょっとまとめておく。

1.クラス定義(AsyncTaskサブクラスとして利用)
public class AsyncTaskGetJson extends AsyncTask {

この部分は実行時引数(Param)、進捗単位(Progress)、処理結果(Result)で扱う型を指定する必要があります。 
この場合は、実行時引数(なし)、進捗単位(なし)、処理結果(String)ということです。

2.実行時
MainActivityで
AsyncTaskGetJson taskGetJson = new AsyncTaskGetJson(this);
taskGetJson.execute();
とすると
(i) onPreExecute(): 例:進捗ダイアログの表示
(ii)doInBackground(Params...): 例:実際の処理
(iii) onProgressUpdate(Progress...): 進捗ダイアログの更新
(iv) onPostExecute(Result): データ表示、進捗ダイアログの非表示
の順で呼び出され、それぞれ引数が使われる。

参考
http://d.hatena.ne.jp/unagi_brandnew/20110628/1309193946
http://wikiwiki.jp/android/?AsyncTask%A4%C7%A5%D0%A5%C3%A5%AF%A5%B0%A5%E9%A5%A6%A5%F3%A5%C9%BD%E8%CD%FD%A4%F2%B9%D4%A4%A6

2016年1月11日月曜日

OptaPlannerの利用(2) : Eclipse設定

今回、optaplannerをカスタマイズできるようにEclipseに設定していく。

基本的には、https://www.ogis-ri.co.jp/otc/hiroba/technical/optaplanner/chap3.html の通りにやっていく。

1.Eclipseの設定
Drools and jBPM toolsのインストール
Help -> Install New Software をクリック

addして、http://download.jboss.org/drools/release/6.3.0.Final/org.drools.updatesite/ を登録。全部インストールしてみる。上記でやるとエラーが発生してしまうので
http://download.jboss.org/drools/release/6.1.0.Final/org.drools.updatesite/ でやってみる。
再起動すれば、ソフトのインストールは終了

2.ソースの設定
次にEclipseにプロジェクトを設置してみる。
今回は、optaplanner-distribution-6.3.0.Final/examples/sources/src/main/java/org/optaplanner/examples/tsp を設置する
プロジェクトを生成しプロジェクト名:TSPとする。
次にsrcにパッケージ:org.optaplanner.examples を作成
その中に、optaplanner-distribution-6.3.0.Final/examples/sources/src/main/java/org/optaplanner/examples/tsp とoptaplanner-distribution-6.3.0.Final/examples/sources/src/main/java/org/optaplanner/examples/common を同時にコピー

続いて、外部jarファイルのインポートをする。
optaplanner-distribution-6.3.0.Final/examples/binaries を全て登録する。まだエラーが残る
次にoptaplanner-distribution-6.3.0.Final/binaries を全て外部jarファイルに登録する。エラーが無くなる。

実行する時は、tsp.app.TspApp.javaを右クリックしてRun as -> Java Applicationで実行。これで実行するとエラーが発生。The directory dataDir (/Users/mizunolab/Documents/workspace/TSP/data/tsp) does not exist. と出ているので、
まずプロジェクト直下にdataフォルダを作成。

optaplanner-distribution-6.3.0.Final/examples/sources/data/tsp をdataにコピー

再度実行してみる。画面が起動し、TSPを実行できる。

これでEclipseで動かす準備ができた。今後カスタマイズして、システム連携できるようにするつもり。

OptaPlannerの利用(1) : インストール

組み合わせ最適化でOptaPlannerを利用したいので、環境を整える。

1. まず動かしてみる
http://www.optaplanner.org/ よりダウンロード
解凍したものをDesktopに配置してみる。ターミナルを開き、
mizunolab-no-MacBook-Air:~ mizunolab$ cd Desktop/
mizunolab-no-MacBook-Air:Desktop mizunolab$ cd optaplanner-distribution-6.3.0.Final/
mizunolab-no-MacBook-Air:optaplanner-distribution-6.3.0.Final mizunolab$ cd examples/

mizunolab-no-MacBook-Air:examples mizunolab$ ./runExamples.sh 
とするとページが開く
試しにTSPを動かしてみると、図のようになる。
動かすことは簡単。次は使えるようにしていく。

rJava : プログラミング(6) ヒストグラムのオプションとR配列生成

前回(http://mizunolab.sist.ac.jp/2016/01/rjava-5.html)、データベースからデータを持ってきてヒストグラムで書いたので、それをもう少し詳細にやりました。

ヒストグラムのオプション
re.eval("hist(c,main='Histogram',col='#dcdcdc',xlab='range')");
main : タイトル、col : 色、xlab : x座標

R用の配列生成
                StringBuffer buf = new StringBuffer();
                buf.append("c<-c br="">                for(int i = 0; i < result.length; i++){
                        if(i == result.length -1)
                                buf.append(result[i]+")");
                        else
                                buf.append(result[i]+",");
                }
                String c_value = buf.toString();
                re.eval("c<- c_value="" p="">
StringBufferを使いました。前に書いた(http://mizunolab.sist.ac.jp/2015/12/multiple-insertstringbuffer.html)を参考にしてます。

こんな感じで、MySQLクラスはそのまま。
[JRITest08.java]

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
import java.sql.*;
import java.util.Arrays;

public class JRITest08 {

        public static void main(String[] args)
        {
                MySQL mysql = new MySQL();
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
                ResultSet rs = mysql.selectOperators();

                double result [] = new double[15];
                double sum = 0;
                int index = 0;
                try {
                        while(rs.next()){
                                sum += rs.getDouble("awareness");
                                sum += rs.getDouble("decision");
                                sum += rs.getDouble("communication");
                                sum += rs.getDouble("leadership");
                                //result[index] = sum/48*100;
                                result[index] = sum;
                                sum = 0;
                                index ++;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                System.out.println(Arrays.toString(result));

                StringBuffer buf = new StringBuffer();
                buf.append("c<-c(");
                for(int i = 0; i < result.length; i++){
                        if(i == result.length -1)
                                buf.append(result[i]+")");
                        else
                                buf.append(result[i]+",");
                }
                String c_value = buf.toString();
                re.eval("c<-"+c_value);
                REXP x = re.eval("summary(c)");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }

                re.eval("png('hist02.png', 640, 480)");
                re.eval("hist(c,main='Frequency Distribution for NOTSS evaluation average of each operator',col='#dcdcdc',xlab='range')");
                re.eval("dev.off()");
                re.end();
        }
}




[notss_analysis@ip-10-0-0-217 rjava]$ javac JRITest08.java
[notss_analysis@ip-10-0-0-217 rjava]$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest08
[92.1875, 97.22222222222085, 90.70512820512708, 92.46794871795, 97.64492753623125, 88.5869565217375, 89.91228070175416, 87.73148148148331, 78.47222222222229, 76.33928571428582, 79.03225806451624, 62.05357142857145, 95.83333333333334, 70.83333333333334, 70.22058823529417, 61.111111111111036, 56.24999999999979]
[REAL* (56.25, 70.83, 87.73, 81.56, 92.19, 97.64)]
56.25
70.83
87.73
81.56
92.19
97.64

FTPでグラフを確認すると、下記になります。
参考
http://bio-info.biz/tips/r_histogram.html
http://stat.biopapyrus.net/graph/hist.html

2016年1月9日土曜日

rJava : プログラミング(5) データベース連携

javaでデータベースに接続し情報を持ってきてそれをRに渡し結果を得るまでやってみました。

1.準備
環境設定(MySQL-connector) (http://mizunolab.sist.ac.jp/2015/11/linuxjavamysql.html)
前回のソース(http://mizunolab.sist.ac.jp/2016/01/rjava-4.html)

2.プログラム

今回はデータベースに接続し、17件のデータを持ってきてRに渡し、ヒストグラムを描く。17件はselect count(*)でやる方がいいけど、面倒だったので直書きです。

$ vi JRITest07.java
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
import java.sql.*;
import java.util.Arrays;

public class JRITest07 {

        public static void main(String[] args)
        {
                MySQL mysql = new MySQL();
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
                ResultSet rs = mysql.selectOperators();

                double result [] = new double[17];
                double sum = 0;
                int index = 0;
                try {
                        while(rs.next()){
                                sum += rs.getDouble("awareness");
                                sum += rs.getDouble("decision");
                                sum += rs.getDouble("communication");
                                sum += rs.getDouble("leadership");
                                result[index] = sum/48*100;
                                sum = 0;
                                index ++;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
                System.out.println(Arrays.toString(result));

                re.eval("c<-c br="" result="">                REXP x = re.eval("summary(c)");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }
                re.eval("png('hist02.png', 640, 480)");
                re.eval("hist(c)");
                re.eval("dev.off()");
                re.end();
        }
}
class MySQL {

        String driver;
        String server, dbname, url, user, password;
        Connection con;
        Statement stmt;
        ResultSet rs;

        public MySQL() {
                this.driver = "org.gjt.mm.mysql.Driver";
                this.server = "localhost";
                this.dbname = "naisyo";
                this.url = "jdbc:mysql://" + server + "/" + dbname + "?useUnicode=true&characterEncoding=UTF-8";
                this.user = "naisyo";
                this.password = "oshierumonka";
                try {
                        this.con = DriverManager.getConnection(url, user, password);
                        this.stmt = con.createStatement ();
                } catch (SQLException e) {
                        // TODO Auto-generated catch block                                                     
                        e.printStackTrace();
                }
                try {
                        Class.forName (driver);
                } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
        public void close(){
                try {
                        rs.close();
                        stmt.close();
                        con.close();
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

        public ResultSet selectOperators(){

                String sql = "SELECT * FROM operators WHERE awareness !=0 AND decision !=0 AND communication !=0 AND leadership !=0";
                ResultSet rs = null;
                try {
                        rs = stmt.executeQuery (sql);
                } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                return rs;
        }

}

3.実行
[notss_analysis@ip-10-0-0-217 rjava]$ javac JRITest07.java
[notss_analysis@ip-10-0-0-217 rjava]$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest07
[92.1875, 97.22222222222085, 90.70512820512708, 92.46794871795, 97.64492753623125, 88.5869565217375, 89.91228070175416, 87.73148148148331, 78.47222222222229, 76.33928571428582, 79.03225806451624, 62.05357142857145, 95.83333333333334, 70.83333333333334, 70.22058823529417, 61.111111111111036, 56.24999999999979]
[REAL* (56.25, 70.83, 87.73, 81.56, 92.19, 97.64)]
56.25
70.83
87.73
81.56
92.19
97.64

FTPで接続し、グラフ画像を確認する(そっけない)





一応ここまで出来たので、R配列の作り方やヒストグラムのオプションをもう少し綺麗にやりたい。

2016年1月8日金曜日

rJava : プログラミング(4) グラフ描画

rJavaでグラフを書いてみた。テストのため乱数を発生させてやってみる。
ちなみに乱数を発生させる方法は、rxxx(n) nは乱数の個数となる。xxxには正規分布ならnormとなり、rnorm(100)だと正規乱数100個生成される。
他の乱数発生は、http://cse.naro.affrc.go.jp/takezawa/r-tips/r/60.html を参照

まずRでやってみる。
$ R
> c <- br="" rnorm="">> summary(c)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.
-3.22800 -0.73340 -0.02118 -0.04163  0.64810  3.35600
> png("hist01.png", 640, 480)
> hist(c)
> dev.off()
> q()

カレントディレクトリにhist01.pngが生成されるので、FTPで接続しダウンロードして確認する。




これをrJavaでやってみる。
$ vi JRITest06.java
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;

public class JRITest06 {

        public static void main(String[] args)
        {
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );

                re.eval("c<-rnorm br="">                REXP x = re.eval("summary(c)");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }
                re.eval("png('hist02.png', 640, 480)");
                re.eval("hist(c)");
                re.eval("dev.off()");
                re.end();
        }
}

[notss_analysis@ip-10-0-0-217 rjava]$ vi JRITest06.java
[notss_analysis@ip-10-0-0-217 rjava]$ javac JRITest06.java
[notss_analysis@ip-10-0-0-217 rjava]$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest06
[REAL* (-3.322, -0.6323, 0.01249, 0.02881, 0.6197, 4.142)]
-3.322
-0.6323
0.01249
0.02881
0.6197
4.142

FTPで接続してみると、カレントディレクトリにhist02.pngがある。ダウンロードして表示すると同じようにグラフができている。

rJavaでグラフが描けるようになった。次はデータベースから持ってきたデータに対し、グラフを描いてみる。

参考
http://stat.biopapyrus.net/graph/imagedevice.html
http://stat.biopapyrus.net/graph/hist.html

2016年1月6日水曜日

rJava : プログラミング(3)

前回の続きで、Rの基本コマンドをrJavaで実行してみた。

1.組み合わせ数表示
[R]
[notss_analysis@ip-10-0-0-217 rjava]$ R
> choose(5,2)
[1] 10
> q()

[rJava]
$ vi JRITest03.java
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;

public class JRITest03 {

        public static void main(String[] args)
        {
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );

                REXP x = re.eval("choose(5,2)");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }
                re.end();
        }
}

$ javac JRITest03.java
$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest03
[REAL* (10.0)]
10.0

2.平均算出
$ R
> mean(c(193, 204, 172, 177, 175, 155, 122, 118, 120, 139))
[1] 157.5

$ vi JRITest04.java
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;

public class JRITest04 {

        public static void main(String[] args)
        {
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );

                REXP x = re.eval("mean(c(193, 204, 172, 177, 175, 155, 122, 118, 120, 139))");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }
                re.end();
        }
}
$ javac JRITest04.java
$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest04
[REAL* (157.5)]
157.5

3.summaryの表示
$ R
> summary(c(193, 204, 172, 177, 175, 155, 122, 118, 120, 139))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
  118.0   126.2   163.5   157.5   176.5   204.0
> q()

$ vi JRITest05.java
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;

public class JRITest05 {

        public static void main(String[] args)
        {
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );

                REXP x = re.eval("summary(c(193, 204, 172, 177, 175, 155, 122, 118, 120, 139))");
                System.out.println(x);
                double [] ary = x.asDoubleArray();
                for (int i = 0; i < ary.length; i++) {
                        System.out.println(ary[i]);
                }
                re.end();
        }
}
$ javac JRITest05.java
$ java -Djava.library.path=/usr/lib64/R/library/rJava/jri/ JRITest05
[REAL* (118.0, 126.2, 163.5, 157.5, 176.5, 204.0)]
118.0
126.2
163.5
157.5
176.5
204.0

rJava : プログラミング(2)

rJavaプログラミングの続き(http://mizunolab.sist.ac.jp/2016/01/rjava-1.html)です。
参考:http://se.cite.ehime-u.ac.jp/wiki/index.php?R_rJava

Rで計算させたものをJavaでどう利用するかということですが、参考ページの下記のソースを試してみます。

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;

public class JRITest02 {

    public static void main(String[] args)
    {
        Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
       
        REXP x = re.eval("sample(10,5)");
        System.out.println(x);
        int[] ary = x.asIntArray();
        for (int i = 0; i < ary.length; i++) {
            System.out.println(ary[i]);
        }
        re.end();
    }
}



「Rengine インスタンスに対して eval メソッドを呼び出すと REXP クラスのインスタンスが戻り値として得られる.」とあります。
REXP x = re.eval("sample(10,5)"); 
REXPクラスの説明が、http://rforge.net/org/doc/org/rosuda/JRclient/REXP.html
にあります。今回はint[] ary = x.asIntArray();とasIntArray()関数を使っていますが、他にも色々あるようです。

何となくわかったので、次はRの基本コマンドをevalで発行して、結果を取得してみたい。

2016年1月5日火曜日

rJava : プログラミング(1)

rJavaの環境が整ったので(http://mizunolab.sist.ac.jp/2015/12/centosrjava.html)、サンプルを実行しながら勉強していく。

[サンプルプログラム : Rを使いJava側で出力]
サンプルはhttp://se.cite.ehime-u.ac.jp/wiki/index.php?R_rJavaを参考にしています。
 [JRITest01.java]
import org.rosuda.JRI.Rengine;
public class JRITest01 {
    public static void main(String[] args)
    {
        Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
        System.out.println( re.eval("sample(10,5)") );
        re.end();
    }
}

まずRengine re = new Rengine( new String[]{"--no-save"}, false, null );でRengineクラスを見てみるとコンストラクタに
Rengine(java.lang.String[] args, boolean runMainLoop, RMainLoopCallbacks initialCallbacks) 
          create and start a new instance of R.
 とある。よくわからないが、おまじないとしておく。

 次に、re.eval("sample(10,5)")のところで
evalは
eval(java.lang.String s) 
          Parses and evaluates an R expression and returns the result.
 とあるのでevalは引数の文字列を評価してR側に渡す役割みたい。
sampleは
sample(x, size, replace = FALSE, prob = NULL)
 のように乱数を発生させる。
https://stat.ethz.ch/R-manual/R-devel/library/base/html/sample.html
ということで
 re.eval("sample(10,5)")
はsample(10,5)というコマンド文字列をevalがRに渡し実行している。

コンパイル実行してみると、下記になる。

ということでrengineインスタンス生成とevalの使い方がわかりました。

2016年1月2日土曜日

Cakephp:cronでのシェルの実行

Cakephpで作ったシェルをcronで動かす方法です。

1.シェルを作成
前回作ったシェルを利用(http://mizunolab.sist.ac.jp/2016/01/cakephp-shell.html

2.呼び出すためのスクリプトを作成
スクリプトはいらないかもしれませんが、作っときました。
app]$ vi Vendor/CakeShell.sh
#!/bin/bash

cd ~
cd www/app
Console/cake test

app]$ chmod +x Vendor/CakeShell.sh

3.cronに登録
app]$ crontab -e
* * * * * /home/garden/www/app/Vendor/CakeShell.sh >> /home/garden/cron.txt 2>>/home/garden/cron_err.txt

動作確認のため、ホームディレクトリのcron.txtとcron_err.txtに追記しておく(2つのファイルも作っておく)。

app]$ cat ~/cron.txt
動いていることが確認できた。
次はモデル、コントローラとの連携をして、実際の処理をしていく。