Rにおける大規模データ解析(第10回TokyoWebMining)

S
Shintaro FukushimaData Scientist / Researcher
Rにおける大規模データ解析
 ~bigmemoryパッケージ~

       2011年2月27日
第10回 TokyoWebMining 1st week
          @sfchaos
本発表の趣旨

� Rは便利な統計解析ツールとして注目を浴びていますが,
  大規模なデータを扱うことが得意ではありません.
� そこで,本発表では,大規模データを扱うパッケージの
  一つであるbigmemoryとその兄弟パッケージについて紹
  介します.
� HadoopやMahoutなどを使うほどではなく,かといってR
  の標準機能だけでは扱いに困るほどの規模のデータを扱
  う方のお役に立てれば幸いです.




                                2
アジェンダ

1. 自己紹介
2.Rの長所と短所
3.Rにおける大規模データ管理
4. bigmemoryパッケージを用いた並列計算
5. まとめ




                            3
アジェンダ

1. 自己紹介
2.Rの長所と短所
3.Rにおける大規模データ管理
4. bigmemoryパッケージを用いた並列計算
5. まとめ




                            4
自己紹介

� TwitterID: @sfchaos
� 出身地: 埼玉県
� 職業:コンサルタント
  � 数年間,金融工学のモデル構築・データ解析
  � 最近,大規模データ解析に着手(Hadoop/Mahout)
� 学生時代の専攻は物理・応用数学(非線形力学系・カオ
  ス)
  ※博士ではありません




                                    5
アジェンダ

1. 自己紹介
2.Rの長所と短所
3.Rにおける大規模データ管理
4. bigmemoryパッケージを用いた並列計算
5. まとめ




                            6
2.1 Rとは

� 統計計算とグラフィックスのための言語・環境
� 多様な統計手法 (線形・非線形モデル、古典的統計検定、
  時系列解析、判別分析、クラスタリング等) とグラ
  フィックスを提供
� フリーソフトであり,近年,大いに注目を集めている




                           7
2.2 Rの長所(の一例)

� ベクトルや行列等のオブジェクトの扱いやすさ
> x <- 1:10
> x
 [1] 1 2 3 4 5 6 7 8 9 10
> x[x%%2==0] # 偶数番目の要素の取り出し
[1] 2 4 6 8 10
> y <- matrix(1:10, nrow=2)
> y
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8 10
> apply(y, 1, mean) # 各行の平均
[1] 5 6


                                8
� きれいなグラフィクス

                             Average Yearly Sunspots
                     1750   1800     1850          1900   1950




               150
       spots



               100




                50




                0




               150
       spots




               100
                50
                0
                     1750   1800     1850          1900   1950

                                            Year




                                                                 9
� 最新の手法を用意した豊富なパッケージ群




                        10
2.3 Rの短所




           11
2.3 Rの短所

� マルチCPU(コア)の環境でも基本的に1CPU(コア)




                                12
2.3 Rの短所

� マルチCPU(コア)の環境でも基本的に1CPU(コア)
� 基本的にオンメモリでデータを保持,計算を実行




                                13
2.3 Rの短所

� マルチCPU(コア)の環境でも基本的に1CPU(コア)
� 基本的にオンメモリでデータを保持,計算を実行
� ベクトル,行列,配列などの要素数の上限が231-1




                                14
2.3 Rの短所

�   マルチCPU(コア)の環境でも基本的に1CPU(コア)
�   基本的にオンメモリでデータを保持,計算を実行
�   ベクトル,行列,配列などの要素数の上限が231-1
�   基本的にオブジェクトの参照渡しができず値渡しを行う
    ため,コピーがあちこちで発生しメモリを消費する




                              15
2.3 Rの短所

�   マルチCPU(コア)の環境でも基本的に1CPU(コア)
�   基本的にオンメモリでデータを保持,計算を実行
�   ベクトル,行列,配列などの要素数の上限が231-1
�   基本的にオブジェクトの参照渡しができず値渡しを行う
    ため,コピーがあちこちで発生しメモリを消費する




         大規模なデータを扱ったり
      計算速度を上げるためには工夫が必要
    →高性能計算(High Performance Computing)


                                         16
アジェンダ

1. 自己紹介
2.Rの長所と短所
3.Rにおける大規模データ管理
4. Bigmemory Project
5. bigmemoryパッケージを用いた並列計算
6. まとめ




                            17
3.1 RにおけるHPC
                     明示的な並列化
                     内部的な並列化
                     グリッドコンピューティング
                     乱数
並列計算
                     リソース管理・バッチスケジューリ
                     ング
                     応用
                     GPU
大規模データ管理
コンパイルコードへの簡便なインタフェース
プロファイリングツール
   CRAN Task View: High-Performance and Parallel Computing with R
                             http://cran.r-project.org/index.html
                                                               18
3.1 RにおけるHPC
                     明示的な並列化(マルチコア/CPU計算等)
                     内部的な並列化
                     グリッドコンピューティング
                     乱数
並列計算
                     リソース管理・バッチスケジューリ
                     ング
                     応用
                     GPU
大規模データ管理(RAMを超えるデータ管理)
コンパイルコードへの簡便なインタフェース
プロファイリングツール
   CRAN Task View: High-Performance and Parallel Computing with R
                             http://cran.r-project.org/index.html
                                                               19
3.2 大規模データ管理パッケージ

� ffとbigmemoryが代表的なパッケージ.
� 両方のパッケージともバックエンドでC++を使用.




                             20
3.2 大規模データ管理パッケージ

� ff
  � データをディスクに置き,必要に応じてメモリにロードする.
  � 行列,データフレーム,因子など多数のデータ型を用意してい
    る.



� bigmemory
  � 大規模データをディスク等に置き,必要に応じて物理メモリに
    キャッシュする.
  � 扱えるデータ型は行列のみである.
  � 1台の計算機上で複数のRのプロセスでオブジェクトを共有する
    ことが可能である.




                                   21
3.2 大規模データ管理パッケージ

� ff
  � データをディスクに置き,必要に応じてメモリにロードする.
  � 行列,データフレーム,因子など多数のデータ型を用意してい
    る.
                どちらが優位かについては
                   一概に言えない
� bigmemory
  � 大規模データをディスク等に置き,必要に応じて物理メモリに
    キャッシュする.
  � 扱えるデータ型は行列のみである.
  � 1台の計算機上で複数のRのプロセスでオブジェクトを共有する
    ことが可能である.




                                   22
3.2 大規模データ管理パッケージ

� ff
  � データをディスクに置き,必要に応じてメモリにロードする.
  � 行列,データフレーム,因子など多数のデータ型を用意してい
    る.
                どちらが優位かについては
                   一概に言えない
� bigmemory
  � 大規模データをディスク等に置き,必要に応じて物理メモリに
    キャッシュする.
  � 扱えるデータ型は行列のみである.
  � 1台の計算機上で複数のRのプロセスでオブジェクトを共有する
    ことが可能である.




                                   23
3.2 大規模データ管理パッケージ

� ff
  � データをディスクに置き,必要に応じてメモリにロードする.
  � 行列,データフレーム,因子など多数のデータ型を用意してい
    る.
                どちらが優位かについては
                   一概に言えない
� bigmemory
  � 大規模データをディスク等に置き,必要に応じて物理メモリに
    キャッシュする.
  � 扱えるデータ型は行列のみである.
  � 1台の計算機上で複数のRのプロセスでオブジェクトを共有する
    ことが可能である.
                 並列計算・並行計算が可能に


                                   24
3.3 bigmemoryを用いて解決するRの欠点


      欠点           bigmemoryの使用による解決度合い
マルチCPU(コア)の環境でも基          ○
本的に1CPU(コア)         並列計算,並行計算が可能に
                            ○
基本的にオンメモリでデータ
を保持,計算を実行          RAMをはるかに超えるデータの扱いが
                           可能に
ベクトル,行列,配列などの              ○
要素数の上限が231-1         要素数の上限は252まで拡張
基本的にオブジェクトの参照
渡しができず値渡しを行うた             ◎
め,コピーがあちこちで発生      参照渡しでオブジェクトを渡せる
しメモリを消費する



                                          25
3.4 The bigmemory project

� 大規模行列の管理/解析/集計を行うパッケージ群
� 2010年度の米国の統計学会の
  統計計算分野で、2010年の
  "John M. Chambers Statistical
  Software Award"を受賞
� 次の5つのパッケージで構成される
     パッケージ名                  機能
bigmemory         大規模行列の管理
biganalytics      大規模行列の解析
bigtabulate       大規模行列の集計
bigalgebra        大規模行列の演算
synchronicity     大規模行列の処理の同期・排他制御
                                     26
3.5 bigmemoryパッケージの基本的な使い方

� Data Expo 2009
  アメリカの旅客機のフライトデータ(1987年~2008年)
� 約1億2,300万レコード,29フィールド(約12GB)




                                  27
� データの読み込み
> library(bigmemory)
> airline <- read.big.matrix("AirlineAllData.csv", header=TRUE,
   sep=",", backingifle="AirlineAllData.bin",
   descriptorfile="AirlineAllData.desc")
� 行列サイズの確認
> dim(airline)
[1] 123534969        29
� 行列要素へのアクセス・値の格納 
> airline[1:5, 1:5]
> airline[1:5, ]
> airline[1:5, 1] <- 1986


通常のRの関数を使った場合とほとんど同じように操作できる


                                                             28
� bigtabulateを用いると,データの要約・集計も可能に
> library(bigtabulate)
> # 各列の要約(最小値、最大値、平均値、NAの数)
> summary(airline)
> # 年ごと月ごとのフライト数
> bigtable(airline, c("Year", "Month"))
> # 曜日ごとの到着時間の遅れの統計量(最小値、最大値、平均値、標
   準偏差、NAの数)
> bigtsummary(airline, "DayOfWeek", cols="ArrDelay", na.rm=T)




                                                           29
3.6 (ご参考)大規模データを扱うメカニズム

� メモリマッピングという技術を用いて,ファイルをメモ
  リのように扱い,必要なときに高速にキャッシュする.


                 ファイルから
                   メモリに
           メモリ   高速キャッシュ    ディスク

                           ファイル




                           ファイルを
                   CPU
                         メモリのように扱う




                                   30
アジェンダ

1. 自己紹介
2.Rの長所と短所
3.Rにおける大規模データ管理
4. bigmemoryパッケージを用いた並列計算
5. まとめ




                            31
4.1 並列計算とは

� ジョブを分割して複数のCPU(orコア)で処理すること



             CPU

             CPU

             CPU

             CPU




  1CPU(コア)での処理に比べ計算速度が向上

                                32
4.2 bigmemoryを用いた並列計算

� 旅客機の製造後の経過年数を推定する問題
    (Vignette "The Bigmemory Project"に掲載されている例)

>   # 1つの旅客機のフライト日から製造された月を推定する関数
>   birthmonth <- function(y) {
+   minYear <- min(y[,'Year'], na.rm=TRUE)
+   these <- which(y[,'Year']==minYear)
+   minMonth <- min(y[these,'Month'], na.rm=TRUE)
+   return(12*minYear + minMonth - 1)




                                                    33
� 普通にやろうとすると・・・
>   # 旅客機コード
>   allplanes <- unique(x[,'TailNum'])
>   planeStart <- rep(0, length(allplanes))
>   # 各旅客機に対してfor文で製造月を推定
>   for (i in allplanes) {
+   planeStart[i] <- birthmonth( x[mwhich(x, 'TailNum', i, 'eq'),
+   c('Year', 'Month'), drop=FALSE] )}




                                                               34
� 普通にやろうとすると・・・
>   # 旅客機コード
>   allplanes <- unique(x[,'TailNum'])
>   planeStart <- rep(0, length(allplanes))
>   # 各旅客機に対してfor文で製造月を推定
>   for (i in allplanes) {
+   planeStart[i] <- birthmonth( x[mwhich(x, 'TailNum', i, 'eq'),
+   c('Year', 'Month'), drop=FALSE] )}


                                        約9時間もかかる!!




                                                               35
� そこで,異なるアプローチで計算を行う
>   library(bigtabulate)
>   # 旅客機コードごとのレコード番号
>   planeindices <- bigsplit(x, 'TailNum')
>   library(doMC)
>   registerDoMC(cores=2)
>   # 製造月の推定
>   planeStart <-
+     foreach(i=planeindices, .combine=c) %dopar% {
+       return(birthmonth(x[i, c('Year','Month'),
+               drop=FALSE]))
+   }




                                                      36
� そこで,異なるアプローチで計算を行う
>   library(bigtabulate)
>   # 旅客機コードごとのレコード番号
>   planeindices <- bigsplit(x, 'TailNum')
>   library(doMC)
>   registerDoMC(cores=2)
>   # 製造月の推定
>   planeStart <-
+     foreach(i=planeindices, .combine=c) %dopar% {
+       return(birthmonth(x[i, c('Year','Month'),
+               drop=FALSE]))
+   }
                                              14秒!!



                                                      37
� そこで,異なるアプローチで計算を行う
>   library(bigtabulate)
>   # 旅客機コードごとのレコード番号
>   planeindices <- bigsplit(x, 'TailNum')
>   library(doMC)          2コアを使って
>   registerDoMC(cores=2)     並列計算
>   # 製造月の推定
>   planeStart <-
+     foreach(i=planeindices, .combine=c) %dopar% {
+       return(birthmonth(x[i, c('Year','Month'),
+               drop=FALSE]))
+   }
                                              14秒!!



                                                      38
� そこで,異なるアプローチで計算を行う
>   library(bigtabulate)
>   # 旅客機コードごとのレコード番号
>   planeindices <- bigsplit(x, 'TailNum')
>   library(doMC)          2コアを使って
>   registerDoMC(cores=2)     並列計算
>   # 製造月の推定       旅客機ごとに
>   planeStart <- ジョブを分割
+     foreach(i=planeindices, .combine=c) %dopar% {
+       return(birthmonth(x[i, c('Year','Month'),
+               drop=FALSE]))
+   }
                                              14秒!!



                                                      39
� そこで,異なるアプローチで計算を行う
>   library(bigtabulate)
>   # 旅客機コードごとのレコード番号
>   planeindices <- bigsplit(x, 'TailNum')
>   library(doMC)          2コアを使って
>   registerDoMC(cores=2)     並列計算
>   # 製造月の推定       旅客機ごとに
>   planeStart <- ジョブを分割
+     foreach(i=planeindices, .combine=c) %dopar% {
+       return(birthmonth(x[i, c('Year','Month'),
+               drop=FALSE]))
+   }                旅客機ごとの製造月の推定

                                              14秒!!



                                                      40
� そこで,異なるアプローチで計算を行う
>   library(bigtabulate)
>   # 旅客機コードごとのレコード番号
>   planeindices <- bigsplit(x, 'TailNum')
>   library(doMC)          2コアを使って
>   registerDoMC(cores=2)     並列計算
>   # 製造月の推定       旅客機ごとに
                               結果の集約
>   planeStart <- ジョブを分割
+     foreach(i=planeindices, .combine=c) %dopar% {
+       return(birthmonth(x[i, c('Year','Month'),
+               drop=FALSE]))
+   }                旅客機ごとの製造月の推定

                                              14秒!!



                                                      41
4.3 split-apply-combine




                     CPU

                     CPU

                     CPU

                     CPU




                           42
CPU

  CPU

  CPU

  CPU

2コアを使って
  並列計算




          43
CPU

           CPU

           CPU

           CPU

旅客機ごとに   2コアを使って
ジョブを分割     並列計算




                   44
CPU

           CPU

           CPU

           CPU

旅客機ごとに   2コアを使って 旅客機ごとの
ジョブを分割     並列計算  製造月の推定




                          45
CPU

           CPU

           CPU

           CPU

旅客機ごとに   2コアを使って 旅客機ごとの 結果の集約
ジョブに分割     並列計算  製造月の推定




                                46
split


           CPU

           CPU

           CPU

           CPU

旅客機ごとに   2コアを使って 旅客機ごとの 結果の集約
ジョブに分割     並列計算  製造月の推定




                                47
split    apply


           CPU

           CPU

           CPU

           CPU

旅客機ごとに   2コアを使って 旅客機ごとの 結果の集約
ジョブを分割     並列計算  製造月の推定




                                48
"split-apply-combine"

 split           apply           combine


                  CPU

                  CPU

                  CPU

                  CPU

旅客機ごとに         2コアを使って 旅客機ごとの 結果の集約
ジョブを分割           並列計算  製造月の推定




                                           49
4.4 biganalyticsパッケージにおける実装例

� 非階層的クラスター分析のk平均法
  分析対象のデータ       ① 指定したクラスター数個分の
                 クラスター中心をランダムに選ぶ




  ② 各データに対して      ③ 各クラスターに属する点の中心を
  最も近い中心を探す       新たなクラスター中心とする




             クラスターが変化
             しなくなるまで
               繰り返す
                                      50
4.4.1 k平均法を使用する際の注意点

� 初期中心の選び方に大きく依存 → 複数回試行する
  分析対象のデータ       ① 指定したクラスター数個分の
                 クラスター中心をランダムに選ぶ




  ② 各データに対して      ③ 各クラスターに属する点の中心を
  最も近い中心を探す       新たなクラスター中心とする




             クラスターが変化
             しなくなるまで
               繰り返す
                                      51
4.4.2 設計方針
bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){
   (中略)
    ans <- foreach(cen = centers, .combine = "choosebest") %dopar% {
            require(biganalytics)
          (中略)
            if (is.null(xdesc)) {
                if (mattype == 4) {
                  res <- .Call("kmeansRIntMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                } else {
                  res <- .Call("kmeansRNumericMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                }
            }
     (以降略)
}

                                                                            52
bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){
   (中略) 並列計算
    ans <- foreach(cen = centers, .combine = "choosebest") %dopar% {
            require(biganalytics)
          (中略)
            if (is.null(xdesc)) {
                if (mattype == 4) {
                  res <- .Call("kmeansRIntMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                } else {
                  res <- .Call("kmeansRNumericMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                }
            }
     (以降略)
}

                                                                            53
bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){
   (中略) 並列計算 クラスター中心(split)
    ans <- foreach(cen = centers, .combine = "choosebest") %dopar% {
            require(biganalytics)
          (中略)
            if (is.null(xdesc)) {
                if (mattype == 4) {
                  res <- .Call("kmeansRIntMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                } else {
                  res <- .Call("kmeansRNumericMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                }
            }
     (以降略)
}

                                                                            54
bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){
   (中略) 並列計算 クラスター中心(split)
    ans <- foreach(cen = centers, .combine = "choosebest") %dopar% {
            require(biganalytics)
          (中略)
            if (is.null(xdesc)) {
                if (mattype == 4) {
                  res <- .Call("kmeansRIntMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                } else {
                  res <- .Call("kmeansRNumericMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                }
            }
                                                                 1回のk平均法の
                                                                   実行(apply)
     (以降略)
}

                                                                         55
bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){
   (中略) 並列計算 クラスター中心(split)
    ans <- foreach(cen = centers, .combine = "choosebest") %dopar% {
            require(biganalytics) 結果の集約(combine)
          (中略)
            if (is.null(xdesc)) {
                if (mattype == 4) {
                  res <- .Call("kmeansRIntMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                } else {
                  res <- .Call("kmeansRNumericMatrix", x, center@address,
                    clust@address, clustsizes@address, wss@address,
                    as.integer(iter.max))
                }
            }
                                                                 1回のk平均法の
                                                                   実行(apply)
     (以降略)
}

                                                                         56
4.4.3 bigkmeans関数を用いて計算が速くなる例

� UCI Machine Learning Repository
  Gisette Data Set 
  http://archive.ics.uci.edu/ml/datasets/Gisette
  � 手書きの数字の「4」と「9」の5000個の特徴に関するデータ
    セット
  � 13,500レコード,5000フィールド
� 3つのケースについて計算速度を比較する
  � クラスター数は2個
  � 収束までの最大反復回数は50回
  � クラスタリングの試行回数は10回

                                     k平均法
                              kmeans関数   bigkmeans関数
 データの     read.table関数           ①           ②
 読み込み     read.big.matrix関数      ③           ー

                                                       57
① read.table関数 + kmeans関数
> z.rt <- read.table("gisette.data", sep="", header=FALSE)
> system.time(z.rt.km <- kmeans(z.rt, centers=2, iter.max=50,
+ nstart=10, algorithm="MacQueen"))
    ユーザ システム                 経過
     413.31       3.18     416.79
② read.table関数 + bigkmeans関数
> z.mat <- as.matrix(z.rt)
> system.time(z.rt.bkm <- bigkmeans(z.mat, centers=2, iter.max=50,
+ nstart=10))
   ユーザ システム   経過
     316.07       0.06     316.46
③ read.big.matrix関数 + bigkmeans関数
> z.bm <- read.big.matrix("gisette.data", sep="", header=FALSE,
+ type="integer")
> system.time(z.bm.bkm <- bigkmeans(z.bm, centers=2, iter.max=50,
+ nstart=10))
  ユーザ システム   経過
   131.82       1.01   132.90




                                                                     58
4.5 biganalyticsパッケージの問題点

� bigmemoryパッケージのbig.matrix型は,既存のRのコー
  ドでの行列と同様に扱えないため,分析用の関数を自前
  で作らなければならない.
� 現状のbiganalyticsパッケージ(Ver.1.0.14)において,
  分析用の関数として提供されているものは,(一般化)線
  形回帰,k平均法のみである.



       分析          関数名                通常のRの関数
線形回帰         biglm.big.matrix    lm
一般化線形回帰      bigglm.big.matrix   glm
k平均法         bigkmeans           kmeans




                                                59
� 大規模データの並列(分散)処理といえば・・・




                           60
� 大規模データの並列(分散)処理といえば・・・




                           61
� 大規模データの並列(分散)処理といえば・・・




      Mahoutのような機械学習のアルゴリズムを
biganalyticsパッケージの関数として実装してみよう!


                                  62
� 今回はナイーブベイズ分類器を実装する.
� ナイーブベイズ分類器は,教師あり学習によりクラス分
  類を行う手法の一つ.
� 一応コーディング完了.ただし,現状では並列化はして
  いないw
  → 今後,並列化予定




                          63
bignaiveBayes <- function(x, ...)
    UseMethod("bignaiveBayes")
bignaiveBayes.default <-function(x, ccols, summary.cols, laplace = 0,
                                     datatype, ...) {
    call <- match.call()
   if (length(summary.cols) != length(datatype))
         stop("length(summary.cols) must equal length(datatype)n")
    # estimation-function
    apriori <- bigtable(x, ccols)
    Yname <- names(apriori)
   tables <- lapply(summary.cols,
                  function(i) if (datatype[i] == "char") {
                    tab <- bigtable(x, c(ccols, i))
                      (tab + laplace) /
                         (rowSums(tab) + laplace * ncol(tab))
                  } else {
                    z <- bigtsummary(x, ccols=ccols, cols=i)
                    z <- sapply(z, function(zz) zz[, c("mean", "sd")])
                            as.table(t(z))
                  }
   )
    # fix dimname names
    names(tables) <- colnames(x)[summary.cols]
    structure(list(apriori = apriori, tables = tables, levels = Yname, call   =
   call), class = "bignaiveBayes")
}

                                                                              64
predict.bignaiveBayes <- function(object, newdata, type = c("class", "raw"), threshold =
    0.001, datatype, ...) {
    type <- match.arg(type)
    attribs <- which(names(object$tables) %in% colnames(newdata))
    isnumeric <- datatype!="char"
    L <- sapply(1:nrow(newdata), function(i) {
        ndata <- newdata[i,]
        L <- log(object$apriori) + apply(log(sapply(attribs, function(v) {
                nd <- ndata[v]
                if(is.na(nd)) rep(1, length(object$apriori))
                else {
                    prob <- if (isnumeric[v]) {
                         msd <- object$tables[[v]]
                         msd[,2][msd[,2]==0] <- threshold
                         dnorm(nd, msd[,1], msd[,2])
                    } else
                         object$tables[[v]][,nd]
                    prob[prob == 0] <- threshold
                    prob
                }
            })), 1, sum)
        if (type == "class") L
        else {
            L <- exp(L)
            L / sum(L)
        }
    })
    if (type == "class")
        factor(object$levels[apply(L, 2, which.max)], levels = object$levels)
    else t(L)
}

                                                                                           65
アジェンダ

1. 自己紹介
2.Rの長所と短所
3.Rにおける大規模データ管理
4. bigmemoryパッケージを用いた並列計算
5. まとめ




                            66
� 統計解析ツールとして有望なRは大規模なデータを扱う
  ことが得意ではない.
� そのため,Rで大規模なデータを管理,分析しようとす
  ると工夫が必要.
� bigmemoryパッケージを用いるとディスクを用いてRAMを
  はるかに超える量のデータを管理でき,また同一計算機
  上の複数プロセスでオブジェクトを共有できる.
� bigmemoryとその兄弟パッケージを用いると大規模デー
  タの管理や集計が可能だが,biganalyticsパッケージに
  入っている分析用の関数はまだまだ少ない.
� そこで,機械学習のアルゴリズムを実装しようと試みた
  (to be coninued).


                                67
参考文献

� Bigmemory Project
   � Michael J. Kane and John W. Emerso(2010):
     The Bigmemory project,
     http://cran.rproject.org/web/packages/bigmemory/vignettes/Overv
     iew.pdf.
   � Michael J. Kane and John W. Emerso(2010):
     Scalable strategies for computing with massive data: The
     Bigmemory project,
     http://www.slideshare.net/joshpaulson/big-memory?from=ss_embed.
� 「Rを使ったハイパフォーマンスコンピューティング入門」,
  統計数理研究所公開講座,2011年1月24日.




                                                                  68
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)
1 of 70

Recommended

Rの高速化 by
Rの高速化Rの高速化
Rの高速化弘毅 露崎
39.3K views33 slides
RのffとbigmemoryとRevoScaleRとを比較してみた by
RのffとbigmemoryとRevoScaleRとを比較してみたRのffとbigmemoryとRevoScaleRとを比較してみた
RのffとbigmemoryとRevoScaleRとを比較してみたKazuya Wada
23.1K views24 slides
RのffでGLMしてみたけど... by
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...Kazuya Wada
11.2K views30 slides
比例ハザードモデルはとってもtricky! by
比例ハザードモデルはとってもtricky!比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!takehikoihayashi
82.3K views43 slides
xtsパッケージで時系列解析 by
xtsパッケージで時系列解析xtsパッケージで時系列解析
xtsパッケージで時系列解析Nagi Teramo
21.8K views42 slides
ベイズ統計入門 by
ベイズ統計入門ベイズ統計入門
ベイズ統計入門Miyoshi Yuya
58.3K views42 slides

More Related Content

What's hot

Rで学ぶ回帰分析と単位根検定 by
Rで学ぶ回帰分析と単位根検定Rで学ぶ回帰分析と単位根検定
Rで学ぶ回帰分析と単位根検定Nagi Teramo
32.7K views55 slides
Rによる高速処理 まだfor使ってるの? by
Rによる高速処理 まだfor使ってるの?Rによる高速処理 まだfor使ってるの?
Rによる高速処理 まだfor使ってるの?jundoll
699 views49 slides
GEE(一般化推定方程式)の理論 by
GEE(一般化推定方程式)の理論GEE(一般化推定方程式)の理論
GEE(一般化推定方程式)の理論Koichiro Gibo
31.4K views44 slides
関数データ解析の概要とその方法 by
関数データ解析の概要とその方法関数データ解析の概要とその方法
関数データ解析の概要とその方法Hidetoshi Matsui
9.6K views156 slides
社会心理学者のための時系列分析入門_小森 by
社会心理学者のための時系列分析入門_小森社会心理学者のための時系列分析入門_小森
社会心理学者のための時系列分析入門_小森Masashi Komori
18.7K views66 slides
多重代入法の書き方 公開用 by
多重代入法の書き方 公開用 多重代入法の書き方 公開用
多重代入法の書き方 公開用 Koichiro Gibo
22.4K views56 slides

What's hot(20)

Rで学ぶ回帰分析と単位根検定 by Nagi Teramo
Rで学ぶ回帰分析と単位根検定Rで学ぶ回帰分析と単位根検定
Rで学ぶ回帰分析と単位根検定
Nagi Teramo32.7K views
Rによる高速処理 まだfor使ってるの? by jundoll
Rによる高速処理 まだfor使ってるの?Rによる高速処理 まだfor使ってるの?
Rによる高速処理 まだfor使ってるの?
jundoll699 views
GEE(一般化推定方程式)の理論 by Koichiro Gibo
GEE(一般化推定方程式)の理論GEE(一般化推定方程式)の理論
GEE(一般化推定方程式)の理論
Koichiro Gibo31.4K views
関数データ解析の概要とその方法 by Hidetoshi Matsui
関数データ解析の概要とその方法関数データ解析の概要とその方法
関数データ解析の概要とその方法
Hidetoshi Matsui9.6K views
社会心理学者のための時系列分析入門_小森 by Masashi Komori
社会心理学者のための時系列分析入門_小森社会心理学者のための時系列分析入門_小森
社会心理学者のための時系列分析入門_小森
Masashi Komori18.7K views
多重代入法の書き方 公開用 by Koichiro Gibo
多重代入法の書き方 公開用 多重代入法の書き方 公開用
多重代入法の書き方 公開用
Koichiro Gibo22.4K views
StanとRでベイズ統計モデリングに関する読書会(Osaka.stan) 第四章 by nocchi_airport
StanとRでベイズ統計モデリングに関する読書会(Osaka.stan) 第四章StanとRでベイズ統計モデリングに関する読書会(Osaka.stan) 第四章
StanとRでベイズ統計モデリングに関する読書会(Osaka.stan) 第四章
nocchi_airport8.6K views
MCMCによるベイズ因子分析法について by 考司 小杉
MCMCによるベイズ因子分析法についてMCMCによるベイズ因子分析法について
MCMCによるベイズ因子分析法について
考司 小杉9.2K views
ベイズモデリングと仲良くするために by Shushi Namba
ベイズモデリングと仲良くするためにベイズモデリングと仲良くするために
ベイズモデリングと仲良くするために
Shushi Namba6.6K views
for関数を使った繰り返し処理によるヒストグラムの一括出力 by imuyaoti
for関数を使った繰り返し処理によるヒストグラムの一括出力for関数を使った繰り返し処理によるヒストグラムの一括出力
for関数を使った繰り返し処理によるヒストグラムの一括出力
imuyaoti12.5K views
階層モデルの分散パラメータの事前分布について by hoxo_m
階層モデルの分散パラメータの事前分布について階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について
hoxo_m35K views
統計的因果推論勉強会 第1回 by Hikaru GOTO
統計的因果推論勉強会 第1回統計的因果推論勉強会 第1回
統計的因果推論勉強会 第1回
Hikaru GOTO21.5K views
重回帰分析で交互作用効果 by Makoto Hirakawa
重回帰分析で交互作用効果重回帰分析で交互作用効果
重回帰分析で交互作用効果
Makoto Hirakawa35K views
R高速化 by Monta Yashi
R高速化R高速化
R高速化
Monta Yashi12.7K views
Rによるやさしい統計学第20章「検定力分析によるサンプルサイズの決定」 by Takashi J OZAKI
Rによるやさしい統計学第20章「検定力分析によるサンプルサイズの決定」Rによるやさしい統計学第20章「検定力分析によるサンプルサイズの決定」
Rによるやさしい統計学第20章「検定力分析によるサンプルサイズの決定」
Takashi J OZAKI154.4K views
基礎からのベイズ統計学 輪読会資料 第4章 メトロポリス・ヘイスティングス法 by Ken'ichi Matsui
基礎からのベイズ統計学 輪読会資料 第4章 メトロポリス・ヘイスティングス法基礎からのベイズ統計学 輪読会資料 第4章 メトロポリス・ヘイスティングス法
基礎からのベイズ統計学 輪読会資料 第4章 メトロポリス・ヘイスティングス法
Ken'ichi Matsui26.2K views
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」 by Ken'ichi Matsui
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
Ken'ichi Matsui96.4K views
心理学のためのPsychパッケージ by 考司 小杉
心理学のためのPsychパッケージ心理学のためのPsychパッケージ
心理学のためのPsychパッケージ
考司 小杉16.5K views

Similar to Rにおける大規模データ解析(第10回TokyoWebMining)

R-hpc-1 TokyoR#11 by
R-hpc-1 TokyoR#11R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11Shintaro Fukushima
3.2K views24 slides
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用 by
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用Shintaro Fukushima
4.5K views49 slides
Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11 by
Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11
Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11MapR Technologies Japan
2.6K views46 slides
20190625 OpenACC 講習会 第2部 by
20190625 OpenACC 講習会 第2部20190625 OpenACC 講習会 第2部
20190625 OpenACC 講習会 第2部NVIDIA Japan
1.5K views58 slides
Ⅲ. 資料編 2017 by
Ⅲ. 資料編 2017Ⅲ. 資料編 2017
Ⅲ. 資料編 2017wada, kazumi
291 views16 slides
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics by
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsKohei KaiGai
1.1K views49 slides

Similar to Rにおける大規模データ解析(第10回TokyoWebMining)(20)

統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用 by Shintaro Fukushima
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
Shintaro Fukushima4.5K views
Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11 by MapR Technologies Japan
Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11
Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11
20190625 OpenACC 講習会 第2部 by NVIDIA Japan
20190625 OpenACC 講習会 第2部20190625 OpenACC 講習会 第2部
20190625 OpenACC 講習会 第2部
NVIDIA Japan1.5K views
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics by Kohei KaiGai
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
Kohei KaiGai1.1K views
20181212 - PGconf.ASIA - LT by Kohei KaiGai
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
Kohei KaiGai805 views
Googleの基盤クローン Hadoopについて by Kazuki Ohta
Googleの基盤クローン HadoopについてGoogleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Kazuki Ohta2.8K views
Azure Machine Learning Services 概要 - 2019年3月版 by Daiyu Hatakeyama
Azure Machine Learning Services 概要 - 2019年3月版Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版
Daiyu Hatakeyama2.2K views
20160121 データサイエンティスト協会 木曜セミナー #5 by Koichiro Sasaki
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5
Koichiro Sasaki4.7K views
081108huge_data.ppt by Naoya Ito
081108huge_data.ppt081108huge_data.ppt
081108huge_data.ppt
Naoya Ito2.8K views
kagamicomput201714 by swkagami
kagamicomput201714kagamicomput201714
kagamicomput201714
swkagami674 views
mmapパッケージを使ってお手軽オブジェクト管理 by Shintaro Fukushima
mmapパッケージを使ってお手軽オブジェクト管理mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理
Shintaro Fukushima1.6K views

More from Shintaro Fukushima

20230216_Python機械学習プログラミング.pdf by
20230216_Python機械学習プログラミング.pdf20230216_Python機械学習プログラミング.pdf
20230216_Python機械学習プログラミング.pdfShintaro Fukushima
573 views22 slides
機械学習品質管理・保証の動向と取り組み by
機械学習品質管理・保証の動向と取り組み機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組みShintaro Fukushima
8.2K views55 slides
Materials Informatics and Python by
Materials Informatics and PythonMaterials Informatics and Python
Materials Informatics and PythonShintaro Fukushima
7.2K views56 slides
BPstudy sklearn 20180925 by
BPstudy sklearn 20180925BPstudy sklearn 20180925
BPstudy sklearn 20180925Shintaro Fukushima
1.1K views14 slides
最近のRのランダムフォレストパッケージ -ranger/Rborist- by
最近のRのランダムフォレストパッケージ -ranger/Rborist-最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-Shintaro Fukushima
19.2K views35 slides
Why dont you_create_new_spark_jl by
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jlShintaro Fukushima
3.4K views57 slides

More from Shintaro Fukushima(20)

20230216_Python機械学習プログラミング.pdf by Shintaro Fukushima
20230216_Python機械学習プログラミング.pdf20230216_Python機械学習プログラミング.pdf
20230216_Python機械学習プログラミング.pdf
Shintaro Fukushima573 views
機械学習品質管理・保証の動向と取り組み by Shintaro Fukushima
機械学習品質管理・保証の動向と取り組み機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組み
Shintaro Fukushima8.2K views
最近のRのランダムフォレストパッケージ -ranger/Rborist- by Shintaro Fukushima
最近のRのランダムフォレストパッケージ -ranger/Rborist-最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-
Shintaro Fukushima19.2K views
Juliaによる予測モデル構築・評価 by Shintaro Fukushima
Juliaによる予測モデル構築・評価Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価
Shintaro Fukushima4.1K views
機械学習を用いた予測モデル構築・評価 by Shintaro Fukushima
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価
Shintaro Fukushima39.7K views
データサイエンスワールドからC++を眺めてみる by Shintaro Fukushima
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
Shintaro Fukushima7.5K views
data.tableパッケージで大規模データをサクッと処理する by Shintaro Fukushima
data.tableパッケージで大規模データをサクッと処理するdata.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理する
Shintaro Fukushima18.3K views
アクションマイニングを用いた最適なアクションの導出 by Shintaro Fukushima
アクションマイニングを用いた最適なアクションの導出アクションマイニングを用いた最適なアクションの導出
アクションマイニングを用いた最適なアクションの導出
Shintaro Fukushima5.5K views
Rあんなときこんなとき(tokyo r#12) by Shintaro Fukushima
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)
Shintaro Fukushima5.6K views

Recently uploaded

速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
23 views38 slides
定例会スライド_キャチs 公開用.pdf by
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
121 views64 slides
SNMPセキュリティ超入門 by
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門mkoda
376 views15 slides
The Things Stack説明資料 by The Things Industries by
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
71 views29 slides
光コラボは契約してはいけない by
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
18 views17 slides
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
73 views26 slides

Recently uploaded(11)

速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda376 views
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.71 views
光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga18 views
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4353 views
Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka88 views

Rにおける大規模データ解析(第10回TokyoWebMining)

  • 1. Rにおける大規模データ解析 ~bigmemoryパッケージ~ 2011年2月27日 第10回 TokyoWebMining 1st week @sfchaos
  • 2. 本発表の趣旨 � Rは便利な統計解析ツールとして注目を浴びていますが, 大規模なデータを扱うことが得意ではありません. � そこで,本発表では,大規模データを扱うパッケージの 一つであるbigmemoryとその兄弟パッケージについて紹 介します. � HadoopやMahoutなどを使うほどではなく,かといってR の標準機能だけでは扱いに困るほどの規模のデータを扱 う方のお役に立てれば幸いです. 2
  • 5. 自己紹介 � TwitterID: @sfchaos � 出身地: 埼玉県 � 職業:コンサルタント � 数年間,金融工学のモデル構築・データ解析 � 最近,大規模データ解析に着手(Hadoop/Mahout) � 学生時代の専攻は物理・応用数学(非線形力学系・カオ ス) ※博士ではありません 5
  • 7. 2.1 Rとは � 統計計算とグラフィックスのための言語・環境 � 多様な統計手法 (線形・非線形モデル、古典的統計検定、 時系列解析、判別分析、クラスタリング等) とグラ フィックスを提供 � フリーソフトであり,近年,大いに注目を集めている 7
  • 8. 2.2 Rの長所(の一例) � ベクトルや行列等のオブジェクトの扱いやすさ > x <- 1:10 > x [1] 1 2 3 4 5 6 7 8 9 10 > x[x%%2==0] # 偶数番目の要素の取り出し [1] 2 4 6 8 10 > y <- matrix(1:10, nrow=2) > y [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 > apply(y, 1, mean) # 各行の平均 [1] 5 6 8
  • 9. � きれいなグラフィクス Average Yearly Sunspots 1750 1800 1850 1900 1950 150 spots 100 50 0 150 spots 100 50 0 1750 1800 1850 1900 1950 Year 9
  • 13. 2.3 Rの短所 � マルチCPU(コア)の環境でも基本的に1CPU(コア) � 基本的にオンメモリでデータを保持,計算を実行 13
  • 14. 2.3 Rの短所 � マルチCPU(コア)の環境でも基本的に1CPU(コア) � 基本的にオンメモリでデータを保持,計算を実行 � ベクトル,行列,配列などの要素数の上限が231-1 14
  • 15. 2.3 Rの短所 � マルチCPU(コア)の環境でも基本的に1CPU(コア) � 基本的にオンメモリでデータを保持,計算を実行 � ベクトル,行列,配列などの要素数の上限が231-1 � 基本的にオブジェクトの参照渡しができず値渡しを行う ため,コピーがあちこちで発生しメモリを消費する 15
  • 16. 2.3 Rの短所 � マルチCPU(コア)の環境でも基本的に1CPU(コア) � 基本的にオンメモリでデータを保持,計算を実行 � ベクトル,行列,配列などの要素数の上限が231-1 � 基本的にオブジェクトの参照渡しができず値渡しを行う ため,コピーがあちこちで発生しメモリを消費する 大規模なデータを扱ったり 計算速度を上げるためには工夫が必要 →高性能計算(High Performance Computing) 16
  • 17. アジェンダ 1. 自己紹介 2.Rの長所と短所 3.Rにおける大規模データ管理 4. Bigmemory Project 5. bigmemoryパッケージを用いた並列計算 6. まとめ 17
  • 18. 3.1 RにおけるHPC 明示的な並列化 内部的な並列化 グリッドコンピューティング 乱数 並列計算 リソース管理・バッチスケジューリ ング 応用 GPU 大規模データ管理 コンパイルコードへの簡便なインタフェース プロファイリングツール CRAN Task View: High-Performance and Parallel Computing with R http://cran.r-project.org/index.html 18
  • 19. 3.1 RにおけるHPC 明示的な並列化(マルチコア/CPU計算等) 内部的な並列化 グリッドコンピューティング 乱数 並列計算 リソース管理・バッチスケジューリ ング 応用 GPU 大規模データ管理(RAMを超えるデータ管理) コンパイルコードへの簡便なインタフェース プロファイリングツール CRAN Task View: High-Performance and Parallel Computing with R http://cran.r-project.org/index.html 19
  • 20. 3.2 大規模データ管理パッケージ � ffとbigmemoryが代表的なパッケージ. � 両方のパッケージともバックエンドでC++を使用. 20
  • 21. 3.2 大規模データ管理パッケージ � ff � データをディスクに置き,必要に応じてメモリにロードする. � 行列,データフレーム,因子など多数のデータ型を用意してい る. � bigmemory � 大規模データをディスク等に置き,必要に応じて物理メモリに キャッシュする. � 扱えるデータ型は行列のみである. � 1台の計算機上で複数のRのプロセスでオブジェクトを共有する ことが可能である. 21
  • 22. 3.2 大規模データ管理パッケージ � ff � データをディスクに置き,必要に応じてメモリにロードする. � 行列,データフレーム,因子など多数のデータ型を用意してい る. どちらが優位かについては 一概に言えない � bigmemory � 大規模データをディスク等に置き,必要に応じて物理メモリに キャッシュする. � 扱えるデータ型は行列のみである. � 1台の計算機上で複数のRのプロセスでオブジェクトを共有する ことが可能である. 22
  • 23. 3.2 大規模データ管理パッケージ � ff � データをディスクに置き,必要に応じてメモリにロードする. � 行列,データフレーム,因子など多数のデータ型を用意してい る. どちらが優位かについては 一概に言えない � bigmemory � 大規模データをディスク等に置き,必要に応じて物理メモリに キャッシュする. � 扱えるデータ型は行列のみである. � 1台の計算機上で複数のRのプロセスでオブジェクトを共有する ことが可能である. 23
  • 24. 3.2 大規模データ管理パッケージ � ff � データをディスクに置き,必要に応じてメモリにロードする. � 行列,データフレーム,因子など多数のデータ型を用意してい る. どちらが優位かについては 一概に言えない � bigmemory � 大規模データをディスク等に置き,必要に応じて物理メモリに キャッシュする. � 扱えるデータ型は行列のみである. � 1台の計算機上で複数のRのプロセスでオブジェクトを共有する ことが可能である. 並列計算・並行計算が可能に 24
  • 25. 3.3 bigmemoryを用いて解決するRの欠点 欠点 bigmemoryの使用による解決度合い マルチCPU(コア)の環境でも基 ○ 本的に1CPU(コア) 並列計算,並行計算が可能に ○ 基本的にオンメモリでデータ を保持,計算を実行 RAMをはるかに超えるデータの扱いが 可能に ベクトル,行列,配列などの ○ 要素数の上限が231-1 要素数の上限は252まで拡張 基本的にオブジェクトの参照 渡しができず値渡しを行うた ◎ め,コピーがあちこちで発生 参照渡しでオブジェクトを渡せる しメモリを消費する 25
  • 26. 3.4 The bigmemory project � 大規模行列の管理/解析/集計を行うパッケージ群 � 2010年度の米国の統計学会の 統計計算分野で、2010年の "John M. Chambers Statistical Software Award"を受賞 � 次の5つのパッケージで構成される パッケージ名 機能 bigmemory 大規模行列の管理 biganalytics 大規模行列の解析 bigtabulate 大規模行列の集計 bigalgebra 大規模行列の演算 synchronicity 大規模行列の処理の同期・排他制御 26
  • 27. 3.5 bigmemoryパッケージの基本的な使い方 � Data Expo 2009 アメリカの旅客機のフライトデータ(1987年~2008年) � 約1億2,300万レコード,29フィールド(約12GB) 27
  • 28. � データの読み込み > library(bigmemory) > airline <- read.big.matrix("AirlineAllData.csv", header=TRUE, sep=",", backingifle="AirlineAllData.bin", descriptorfile="AirlineAllData.desc") � 行列サイズの確認 > dim(airline) [1] 123534969 29 � 行列要素へのアクセス・値の格納  > airline[1:5, 1:5] > airline[1:5, ] > airline[1:5, 1] <- 1986 通常のRの関数を使った場合とほとんど同じように操作できる 28
  • 29. � bigtabulateを用いると,データの要約・集計も可能に > library(bigtabulate) > # 各列の要約(最小値、最大値、平均値、NAの数) > summary(airline) > # 年ごと月ごとのフライト数 > bigtable(airline, c("Year", "Month")) > # 曜日ごとの到着時間の遅れの統計量(最小値、最大値、平均値、標 準偏差、NAの数) > bigtsummary(airline, "DayOfWeek", cols="ArrDelay", na.rm=T) 29
  • 30. 3.6 (ご参考)大規模データを扱うメカニズム � メモリマッピングという技術を用いて,ファイルをメモ リのように扱い,必要なときに高速にキャッシュする. ファイルから メモリに メモリ 高速キャッシュ ディスク ファイル ファイルを CPU メモリのように扱う 30
  • 32. 4.1 並列計算とは � ジョブを分割して複数のCPU(orコア)で処理すること CPU CPU CPU CPU 1CPU(コア)での処理に比べ計算速度が向上 32
  • 33. 4.2 bigmemoryを用いた並列計算 � 旅客機の製造後の経過年数を推定する問題 (Vignette "The Bigmemory Project"に掲載されている例) > # 1つの旅客機のフライト日から製造された月を推定する関数 > birthmonth <- function(y) { + minYear <- min(y[,'Year'], na.rm=TRUE) + these <- which(y[,'Year']==minYear) + minMonth <- min(y[these,'Month'], na.rm=TRUE) + return(12*minYear + minMonth - 1) 33
  • 34. � 普通にやろうとすると・・・ > # 旅客機コード > allplanes <- unique(x[,'TailNum']) > planeStart <- rep(0, length(allplanes)) > # 各旅客機に対してfor文で製造月を推定 > for (i in allplanes) { + planeStart[i] <- birthmonth( x[mwhich(x, 'TailNum', i, 'eq'), + c('Year', 'Month'), drop=FALSE] )} 34
  • 35. � 普通にやろうとすると・・・ > # 旅客機コード > allplanes <- unique(x[,'TailNum']) > planeStart <- rep(0, length(allplanes)) > # 各旅客機に対してfor文で製造月を推定 > for (i in allplanes) { + planeStart[i] <- birthmonth( x[mwhich(x, 'TailNum', i, 'eq'), + c('Year', 'Month'), drop=FALSE] )} 約9時間もかかる!! 35
  • 36. � そこで,異なるアプローチで計算を行う > library(bigtabulate) > # 旅客機コードごとのレコード番号 > planeindices <- bigsplit(x, 'TailNum') > library(doMC) > registerDoMC(cores=2) > # 製造月の推定 > planeStart <- + foreach(i=planeindices, .combine=c) %dopar% { + return(birthmonth(x[i, c('Year','Month'), + drop=FALSE])) + } 36
  • 37. � そこで,異なるアプローチで計算を行う > library(bigtabulate) > # 旅客機コードごとのレコード番号 > planeindices <- bigsplit(x, 'TailNum') > library(doMC) > registerDoMC(cores=2) > # 製造月の推定 > planeStart <- + foreach(i=planeindices, .combine=c) %dopar% { + return(birthmonth(x[i, c('Year','Month'), + drop=FALSE])) + } 14秒!! 37
  • 38. � そこで,異なるアプローチで計算を行う > library(bigtabulate) > # 旅客機コードごとのレコード番号 > planeindices <- bigsplit(x, 'TailNum') > library(doMC) 2コアを使って > registerDoMC(cores=2) 並列計算 > # 製造月の推定 > planeStart <- + foreach(i=planeindices, .combine=c) %dopar% { + return(birthmonth(x[i, c('Year','Month'), + drop=FALSE])) + } 14秒!! 38
  • 39. � そこで,異なるアプローチで計算を行う > library(bigtabulate) > # 旅客機コードごとのレコード番号 > planeindices <- bigsplit(x, 'TailNum') > library(doMC) 2コアを使って > registerDoMC(cores=2) 並列計算 > # 製造月の推定 旅客機ごとに > planeStart <- ジョブを分割 + foreach(i=planeindices, .combine=c) %dopar% { + return(birthmonth(x[i, c('Year','Month'), + drop=FALSE])) + } 14秒!! 39
  • 40. � そこで,異なるアプローチで計算を行う > library(bigtabulate) > # 旅客機コードごとのレコード番号 > planeindices <- bigsplit(x, 'TailNum') > library(doMC) 2コアを使って > registerDoMC(cores=2) 並列計算 > # 製造月の推定 旅客機ごとに > planeStart <- ジョブを分割 + foreach(i=planeindices, .combine=c) %dopar% { + return(birthmonth(x[i, c('Year','Month'), + drop=FALSE])) + } 旅客機ごとの製造月の推定 14秒!! 40
  • 41. � そこで,異なるアプローチで計算を行う > library(bigtabulate) > # 旅客機コードごとのレコード番号 > planeindices <- bigsplit(x, 'TailNum') > library(doMC) 2コアを使って > registerDoMC(cores=2) 並列計算 > # 製造月の推定 旅客機ごとに 結果の集約 > planeStart <- ジョブを分割 + foreach(i=planeindices, .combine=c) %dopar% { + return(birthmonth(x[i, c('Year','Month'), + drop=FALSE])) + } 旅客機ごとの製造月の推定 14秒!! 41
  • 42. 4.3 split-apply-combine CPU CPU CPU CPU 42
  • 43. CPU CPU CPU CPU 2コアを使って 並列計算 43
  • 44. CPU CPU CPU CPU 旅客機ごとに 2コアを使って ジョブを分割 並列計算 44
  • 45. CPU CPU CPU CPU 旅客機ごとに 2コアを使って 旅客機ごとの ジョブを分割 並列計算 製造月の推定 45
  • 46. CPU CPU CPU CPU 旅客機ごとに 2コアを使って 旅客機ごとの 結果の集約 ジョブに分割 並列計算 製造月の推定 46
  • 47. split CPU CPU CPU CPU 旅客機ごとに 2コアを使って 旅客機ごとの 結果の集約 ジョブに分割 並列計算 製造月の推定 47
  • 48. split apply CPU CPU CPU CPU 旅客機ごとに 2コアを使って 旅客機ごとの 結果の集約 ジョブを分割 並列計算 製造月の推定 48
  • 49. "split-apply-combine" split apply combine CPU CPU CPU CPU 旅客機ごとに 2コアを使って 旅客機ごとの 結果の集約 ジョブを分割 並列計算 製造月の推定 49
  • 50. 4.4 biganalyticsパッケージにおける実装例 � 非階層的クラスター分析のk平均法 分析対象のデータ ① 指定したクラスター数個分の クラスター中心をランダムに選ぶ ② 各データに対して ③ 各クラスターに属する点の中心を 最も近い中心を探す 新たなクラスター中心とする クラスターが変化 しなくなるまで 繰り返す 50
  • 51. 4.4.1 k平均法を使用する際の注意点 � 初期中心の選び方に大きく依存 → 複数回試行する 分析対象のデータ ① 指定したクラスター数個分の クラスター中心をランダムに選ぶ ② 各データに対して ③ 各クラスターに属する点の中心を 最も近い中心を探す 新たなクラスター中心とする クラスターが変化 しなくなるまで 繰り返す 51
  • 52. 4.4.2 設計方針 bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){ (中略) ans <- foreach(cen = centers, .combine = "choosebest") %dopar% { require(biganalytics) (中略) if (is.null(xdesc)) { if (mattype == 4) { res <- .Call("kmeansRIntMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } else { res <- .Call("kmeansRNumericMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } }      (以降略) } 52
  • 53. bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){ (中略) 並列計算 ans <- foreach(cen = centers, .combine = "choosebest") %dopar% { require(biganalytics) (中略) if (is.null(xdesc)) { if (mattype == 4) { res <- .Call("kmeansRIntMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } else { res <- .Call("kmeansRNumericMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } }      (以降略) } 53
  • 54. bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){ (中略) 並列計算 クラスター中心(split) ans <- foreach(cen = centers, .combine = "choosebest") %dopar% { require(biganalytics) (中略) if (is.null(xdesc)) { if (mattype == 4) { res <- .Call("kmeansRIntMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } else { res <- .Call("kmeansRNumericMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } }      (以降略) } 54
  • 55. bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){ (中略) 並列計算 クラスター中心(split) ans <- foreach(cen = centers, .combine = "choosebest") %dopar% { require(biganalytics) (中略) if (is.null(xdesc)) { if (mattype == 4) { res <- .Call("kmeansRIntMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } else { res <- .Call("kmeansRNumericMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } } 1回のk平均法の 実行(apply)      (以降略) } 55
  • 56. bigkmeans <- function (x, centers, iter.max = 10, nstart = 1){ (中略) 並列計算 クラスター中心(split) ans <- foreach(cen = centers, .combine = "choosebest") %dopar% { require(biganalytics) 結果の集約(combine) (中略) if (is.null(xdesc)) { if (mattype == 4) { res <- .Call("kmeansRIntMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } else { res <- .Call("kmeansRNumericMatrix", x, center@address, clust@address, clustsizes@address, wss@address, as.integer(iter.max)) } } 1回のk平均法の 実行(apply)      (以降略) } 56
  • 57. 4.4.3 bigkmeans関数を用いて計算が速くなる例 � UCI Machine Learning Repository Gisette Data Set  http://archive.ics.uci.edu/ml/datasets/Gisette � 手書きの数字の「4」と「9」の5000個の特徴に関するデータ セット � 13,500レコード,5000フィールド � 3つのケースについて計算速度を比較する � クラスター数は2個 � 収束までの最大反復回数は50回 � クラスタリングの試行回数は10回 k平均法 kmeans関数 bigkmeans関数 データの read.table関数 ① ② 読み込み read.big.matrix関数 ③ ー 57
  • 58. ① read.table関数 + kmeans関数 > z.rt <- read.table("gisette.data", sep="", header=FALSE) > system.time(z.rt.km <- kmeans(z.rt, centers=2, iter.max=50, + nstart=10, algorithm="MacQueen"))  ユーザ システム 経過 413.31 3.18 416.79 ② read.table関数 + bigkmeans関数 > z.mat <- as.matrix(z.rt) > system.time(z.rt.bkm <- bigkmeans(z.mat, centers=2, iter.max=50, + nstart=10))   ユーザ システム   経過 316.07 0.06 316.46 ③ read.big.matrix関数 + bigkmeans関数 > z.bm <- read.big.matrix("gisette.data", sep="", header=FALSE, + type="integer") > system.time(z.bm.bkm <- bigkmeans(z.bm, centers=2, iter.max=50, + nstart=10))   ユーザ システム   経過 131.82   1.01   132.90 58
  • 59. 4.5 biganalyticsパッケージの問題点 � bigmemoryパッケージのbig.matrix型は,既存のRのコー ドでの行列と同様に扱えないため,分析用の関数を自前 で作らなければならない. � 現状のbiganalyticsパッケージ(Ver.1.0.14)において, 分析用の関数として提供されているものは,(一般化)線 形回帰,k平均法のみである. 分析 関数名 通常のRの関数 線形回帰 biglm.big.matrix lm 一般化線形回帰 bigglm.big.matrix glm k平均法 bigkmeans kmeans 59
  • 62. � 大規模データの並列(分散)処理といえば・・・ Mahoutのような機械学習のアルゴリズムを biganalyticsパッケージの関数として実装してみよう! 62
  • 63. � 今回はナイーブベイズ分類器を実装する. � ナイーブベイズ分類器は,教師あり学習によりクラス分 類を行う手法の一つ. � 一応コーディング完了.ただし,現状では並列化はして いないw → 今後,並列化予定 63
  • 64. bignaiveBayes <- function(x, ...) UseMethod("bignaiveBayes") bignaiveBayes.default <-function(x, ccols, summary.cols, laplace = 0, datatype, ...) { call <- match.call() if (length(summary.cols) != length(datatype)) stop("length(summary.cols) must equal length(datatype)n") # estimation-function apriori <- bigtable(x, ccols) Yname <- names(apriori) tables <- lapply(summary.cols, function(i) if (datatype[i] == "char") {   tab <- bigtable(x, c(ccols, i)) (tab + laplace) / (rowSums(tab) + laplace * ncol(tab)) } else {   z <- bigtsummary(x, ccols=ccols, cols=i)   z <- sapply(z, function(zz) zz[, c("mean", "sd")]) as.table(t(z)) } ) # fix dimname names names(tables) <- colnames(x)[summary.cols] structure(list(apriori = apriori, tables = tables, levels = Yname, call = call), class = "bignaiveBayes") } 64
  • 65. predict.bignaiveBayes <- function(object, newdata, type = c("class", "raw"), threshold = 0.001, datatype, ...) { type <- match.arg(type) attribs <- which(names(object$tables) %in% colnames(newdata)) isnumeric <- datatype!="char" L <- sapply(1:nrow(newdata), function(i) { ndata <- newdata[i,] L <- log(object$apriori) + apply(log(sapply(attribs, function(v) { nd <- ndata[v] if(is.na(nd)) rep(1, length(object$apriori)) else { prob <- if (isnumeric[v]) { msd <- object$tables[[v]] msd[,2][msd[,2]==0] <- threshold dnorm(nd, msd[,1], msd[,2]) } else object$tables[[v]][,nd] prob[prob == 0] <- threshold prob } })), 1, sum) if (type == "class") L else { L <- exp(L) L / sum(L) } }) if (type == "class") factor(object$levels[apply(L, 2, which.max)], levels = object$levels) else t(L) } 65
  • 67. � 統計解析ツールとして有望なRは大規模なデータを扱う ことが得意ではない. � そのため,Rで大規模なデータを管理,分析しようとす ると工夫が必要. � bigmemoryパッケージを用いるとディスクを用いてRAMを はるかに超える量のデータを管理でき,また同一計算機 上の複数プロセスでオブジェクトを共有できる. � bigmemoryとその兄弟パッケージを用いると大規模デー タの管理や集計が可能だが,biganalyticsパッケージに 入っている分析用の関数はまだまだ少ない. � そこで,機械学習のアルゴリズムを実装しようと試みた (to be coninued). 67
  • 68. 参考文献 � Bigmemory Project � Michael J. Kane and John W. Emerso(2010): The Bigmemory project, http://cran.rproject.org/web/packages/bigmemory/vignettes/Overv iew.pdf. � Michael J. Kane and John W. Emerso(2010): Scalable strategies for computing with massive data: The Bigmemory project, http://www.slideshare.net/joshpaulson/big-memory?from=ss_embed. � 「Rを使ったハイパフォーマンスコンピューティング入門」, 統計数理研究所公開講座,2011年1月24日. 68