SlideShare une entreprise Scribd logo
1  sur  70
Télécharger pour lire hors ligne
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)

Contenu connexe

Tendances

階層ベイズと自由エネルギー
階層ベイズと自由エネルギー階層ベイズと自由エネルギー
階層ベイズと自由エネルギーHiroshi Shimizu
 
星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章Shuyo Nakatani
 
ベイズ統計学の概論的紹介
ベイズ統計学の概論的紹介ベイズ統計学の概論的紹介
ベイズ統計学の概論的紹介Naoki Hayashi
 
因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説Shiga University, RIKEN
 
比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!takehikoihayashi
 
Rで計量時系列分析~CRANパッケージ総ざらい~
Rで計量時系列分析~CRANパッケージ総ざらい~ Rで計量時系列分析~CRANパッケージ総ざらい~
Rで計量時系列分析~CRANパッケージ総ざらい~ Takashi J OZAKI
 
Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)Kohta Ishikawa
 
グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門Kawamoto_Kazuhiko
 
相関と因果について考える:統計的因果推論、その(不)可能性の中心
相関と因果について考える:統計的因果推論、その(不)可能性の中心相関と因果について考える:統計的因果推論、その(不)可能性の中心
相関と因果について考える:統計的因果推論、その(不)可能性の中心takehikoihayashi
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...Kazuya Wada
 
Visualizing Data Using t-SNE
Visualizing Data Using t-SNEVisualizing Data Using t-SNE
Visualizing Data Using t-SNETomoki Hayashi
 
ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)yutannihilation
 
心理学者のためのGlmm・階層ベイズ
心理学者のためのGlmm・階層ベイズ心理学者のためのGlmm・階層ベイズ
心理学者のためのGlmm・階層ベイズHiroshi Shimizu
 
階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布についてhoxo_m
 
Rで架空データの発生
Rで架空データの発生Rで架空データの発生
Rで架空データの発生Makoto Hirakawa
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使うAtsushi Hayakawa
 

Tendances (20)

階層ベイズと自由エネルギー
階層ベイズと自由エネルギー階層ベイズと自由エネルギー
階層ベイズと自由エネルギー
 
星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
ベイズ統計学の概論的紹介
ベイズ統計学の概論的紹介ベイズ統計学の概論的紹介
ベイズ統計学の概論的紹介
 
一般化線形モデル (GLM) & 一般化加法モデル(GAM)
一般化線形モデル (GLM) & 一般化加法モデル(GAM) 一般化線形モデル (GLM) & 一般化加法モデル(GAM)
一般化線形モデル (GLM) & 一般化加法モデル(GAM)
 
因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説
 
比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!比例ハザードモデルはとってもtricky!
比例ハザードモデルはとってもtricky!
 
Rで計量時系列分析~CRANパッケージ総ざらい~
Rで計量時系列分析~CRANパッケージ総ざらい~ Rで計量時系列分析~CRANパッケージ総ざらい~
Rで計量時系列分析~CRANパッケージ総ざらい~
 
Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)Rでisomap(多様体学習のはなし)
Rでisomap(多様体学習のはなし)
 
Juliaで並列計算
Juliaで並列計算Juliaで並列計算
Juliaで並列計算
 
グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門
 
相関と因果について考える:統計的因果推論、その(不)可能性の中心
相関と因果について考える:統計的因果推論、その(不)可能性の中心相関と因果について考える:統計的因果推論、その(不)可能性の中心
相関と因果について考える:統計的因果推論、その(不)可能性の中心
 
因果推論の基礎
因果推論の基礎因果推論の基礎
因果推論の基礎
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...
 
Visualizing Data Using t-SNE
Visualizing Data Using t-SNEVisualizing Data Using t-SNE
Visualizing Data Using t-SNE
 
ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)
 
心理学者のためのGlmm・階層ベイズ
心理学者のためのGlmm・階層ベイズ心理学者のためのGlmm・階層ベイズ
心理学者のためのGlmm・階層ベイズ
 
階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について階層モデルの分散パラメータの事前分布について
階層モデルの分散パラメータの事前分布について
 
Rで架空データの発生
Rで架空データの発生Rで架空データの発生
Rで架空データの発生
 
Visual Studio CodeでRを使う
Visual Studio CodeでRを使うVisual Studio CodeでRを使う
Visual Studio CodeでRを使う
 

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

統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用Shintaro Fukushima
 
Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11
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
 
20190625 OpenACC 講習会 第2部
20190625 OpenACC 講習会 第2部20190625 OpenACC 講習会 第2部
20190625 OpenACC 講習会 第2部NVIDIA Japan
 
Ⅲ. 資料編 2017
Ⅲ. 資料編 2017Ⅲ. 資料編 2017
Ⅲ. 資料編 2017wada, kazumi
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
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
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LTKohei KaiGai
 
Googleの基盤クローン Hadoopについて
Googleの基盤クローン HadoopについてGoogleの基盤クローン Hadoopについて
Googleの基盤クローン HadoopについてKazuki Ohta
 
Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版Daiyu Hatakeyama
 
20160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5Koichiro Sasaki
 
081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.pptNaoya Ito
 
kagamicomput201714
kagamicomput201714kagamicomput201714
kagamicomput201714swkagami
 
mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理Shintaro Fukushima
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)NTT DATA Technology & Innovation
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Yoshinori Matsunobu
 

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

R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11R-hpc-1 TokyoR#11
R-hpc-1 TokyoR#11
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
 
Apache Drill でオープンデータを分析してみる - db tech showcase Sapporo 2015 2015/09/11
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部
20190625 OpenACC 講習会 第2部20190625 OpenACC 講習会 第2部
20190625 OpenACC 講習会 第2部
 
Ⅲ. 資料編 2017
Ⅲ. 資料編 2017Ⅲ. 資料編 2017
Ⅲ. 資料編 2017
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
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
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 
20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT20181212 - PGconf.ASIA - LT
20181212 - PGconf.ASIA - LT
 
Tokyor23 doradora09
Tokyor23 doradora09Tokyor23 doradora09
Tokyor23 doradora09
 
Googleの基盤クローン Hadoopについて
Googleの基盤クローン HadoopについてGoogleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
 
Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版Azure Machine Learning Services 概要 - 2019年3月版
Azure Machine Learning Services 概要 - 2019年3月版
 
20160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #520160121 データサイエンティスト協会 木曜セミナー #5
20160121 データサイエンティスト協会 木曜セミナー #5
 
081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.ppt
 
kagamicomput201714
kagamicomput201714kagamicomput201714
kagamicomput201714
 
GTC Japan 2017
GTC Japan 2017GTC Japan 2017
GTC Japan 2017
 
mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理mmapパッケージを使ってお手軽オブジェクト管理
mmapパッケージを使ってお手軽オブジェクト管理
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
BigtopでHadoopをビルドする(Open Source Conference 2021 Online/Spring 発表資料)
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)Linux/DB Tuning (DevSumi2010, Japanese)
Linux/DB Tuning (DevSumi2010, Japanese)
 

Plus de Shintaro Fukushima

20230216_Python機械学習プログラミング.pdf
20230216_Python機械学習プログラミング.pdf20230216_Python機械学習プログラミング.pdf
20230216_Python機械学習プログラミング.pdfShintaro Fukushima
 
機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組み機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組みShintaro Fukushima
 
Materials Informatics and Python
Materials Informatics and PythonMaterials Informatics and Python
Materials Informatics and PythonShintaro Fukushima
 
最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-Shintaro Fukushima
 
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jlShintaro Fukushima
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門Shintaro Fukushima
 
Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価Shintaro Fukushima
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価Shintaro Fukushima
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
data.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理するdata.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理するShintaro Fukushima
 
アクションマイニングを用いた最適なアクションの導出
アクションマイニングを用いた最適なアクションの導出アクションマイニングを用いた最適なアクションの導出
アクションマイニングを用いた最適なアクションの導出Shintaro Fukushima
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類Shintaro Fukushima
 
Numpy scipyで独立成分分析
Numpy scipyで独立成分分析Numpy scipyで独立成分分析
Numpy scipyで独立成分分析Shintaro Fukushima
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Shintaro Fukushima
 

Plus de Shintaro Fukushima (20)

20230216_Python機械学習プログラミング.pdf
20230216_Python機械学習プログラミング.pdf20230216_Python機械学習プログラミング.pdf
20230216_Python機械学習プログラミング.pdf
 
機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組み機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組み
 
Materials Informatics and Python
Materials Informatics and PythonMaterials Informatics and Python
Materials Informatics and Python
 
BPstudy sklearn 20180925
BPstudy sklearn 20180925BPstudy sklearn 20180925
BPstudy sklearn 20180925
 
最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-最近のRのランダムフォレストパッケージ -ranger/Rborist-
最近のRのランダムフォレストパッケージ -ranger/Rborist-
 
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jl
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門
 
Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価Juliaによる予測モデル構築・評価
Juliaによる予測モデル構築・評価
 
機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価機械学習を用いた予測モデル構築・評価
機械学習を用いた予測モデル構築・評価
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
data.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理するdata.tableパッケージで大規模データをサクッと処理する
data.tableパッケージで大規模データをサクッと処理する
 
アクションマイニングを用いた最適なアクションの導出
アクションマイニングを用いた最適なアクションの導出アクションマイニングを用いた最適なアクションの導出
アクションマイニングを用いた最適なアクションの導出
 
R3.0.0 is relased
R3.0.0 is relasedR3.0.0 is relased
R3.0.0 is relased
 
外れ値
外れ値外れ値
外れ値
 
Rでreproducible research
Rでreproducible researchRでreproducible research
Rでreproducible research
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
 
Numpy scipyで独立成分分析
Numpy scipyで独立成分分析Numpy scipyで独立成分分析
Numpy scipyで独立成分分析
 
Rで学ぶロバスト推定
Rで学ぶロバスト推定Rで学ぶロバスト推定
Rで学ぶロバスト推定
 
Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)Rあんなときこんなとき(tokyo r#12)
Rあんなときこんなとき(tokyo r#12)
 
Tokyo.R(#07)
Tokyo.R(#07)Tokyo.R(#07)
Tokyo.R(#07)
 

Dernier

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Dernier (9)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

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