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

39,662 views
39,584 views

Published on

Published in: Technology
0 Comments
70 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
39,662
On SlideShare
0
From Embeds
0
Number of Embeds
3,944
Actions
Shares
0
Downloads
354
Comments
0
Likes
70
Embeds 0
No embeds

No notes for slide

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

  1. 1. Rにおける大規模データ解析 ~bigmemoryパッケージ~ 2011年4月10日第10回 TokyoWebMining 2nd week @sfchaos
  2. 2. 本発表の趣旨 Rは便利な統計解析ツールとして注目を浴びていますが,大 規模なデータを扱うことが得意ではありません. そこで,本発表では,大規模データを扱うパッケージの一つで あるbigmemoryとその兄弟パッケージについて紹介します. HadoopやMahoutなどを使うほどではなく,かといってRの標準 機能だけでは扱いに困るほどの規模のデータを扱う方のお役 に立てれば幸いです. 2
  3. 3. アジェンダ1. 自己紹介2.Rの長所と短所3.Rにおける大規模データ管理4. bigmemoryパッケージを用いた並列計算5. まとめ 3
  4. 4. アジェンダ1. 自己紹介2.Rの長所と短所3.Rにおける大規模データ管理4. bigmemoryパッケージを用いた並列計算5. まとめ 4
  5. 5. 自己紹介 TwitterID: @sfchaos 出身地: 埼玉県 職業:コンサルタント  数年間,金融工学のモデル構築・データ解析  最近,大規模データ解析に着手(Hadoop/Mahout) 学生時代の専攻は物理・応用数学(非線形力学系・カオス) ※博士ではありません 5
  6. 6. アジェンダ1. 自己紹介2.Rの長所と短所3.Rにおける大規模データ管理4. bigmemoryパッケージを用いた並列計算5. まとめ 6
  7. 7. 2.1 Rとは 統計計算とグラフィックスのための言語・環境 多様な統計手法 (線形・非線形モデル、古典的統計検定、時 系列解析、判別分析、クラスタリング等) とグラフィックスを提 供 フリーソフトであり,近年,大いに注目を集めている 7
  8. 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. 9.  きれいなグラフィクス Average Yearly Su nspo ts 1750 1800 1850 1900 1950 150 spots 100 50 0 150 spots 100 50 0 1750 1800 1850 1900 1950 Year 9
  10. 10.  最新の手法を用意した豊富なパッケージ群 10
  11. 11. 2.3 Rの短所 11
  12. 12. 2.3 Rの短所 マルチCPU(コア)の環境でも基本的に1CPU(コア) 12
  13. 13. 2.3 Rの短所 マルチCPU(コア)の環境でも基本的に1CPU(コア) 基本的にオンメモリでデータを保持,計算を実行 13
  14. 14. 2.3 Rの短所 マルチCPU(コア)の環境でも基本的に1CPU(コア) 基本的にオンメモリでデータを保持,計算を実行 ベクトル,行列,配列などの要素数の上限が231-1 14
  15. 15. 2.3 Rの短所 マルチCPU(コア)の環境でも基本的に1CPU(コア) 基本的にオンメモリでデータを保持,計算を実行 ベクトル,行列,配列などの要素数の上限が231-1 基本的にオブジェクトの参照渡しができず値渡しを行うため, コピーがあちこちで発生しメモリを消費する 15
  16. 16. 2.3 Rの短所 マルチCPU(コア)の環境でも基本的に1CPU(コア) 基本的にオンメモリでデータを保持,計算を実行 ベクトル,行列,配列などの要素数の上限が231-1 基本的にオブジェクトの参照渡しができず値渡しを行うため, コピーがあちこちで発生しメモリを消費する 大規模なデータを扱ったり 計算速度を上げるためには工夫が必要→高性能計算(High Performance Computing, HPC) 16
  17. 17. アジェンダ1. 自己紹介2.Rの長所と短所3.Rにおける大規模データ管理4. Bigmemory Project5. bigmemoryパッケージを用いた並列計算6. まとめ 17
  18. 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. 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. 20. 3.2 大規模データ管理パッケージ ffとbigmemoryが代表的なパッケージ. 両方のパッケージともバックエンドでC++を使用. 20
  21. 21. 3.2 大規模データ管理パッケージ ff  データをディスクに置き,必要に応じてメモリにロードする.  行列,データフレーム,因子など多数のデータ型を用意している. bigmemory  大規模データをディスク等に置き,必要に応じて物理メモリにキャッシュ する.  扱えるデータ型は行列のみである.  1台の計算機上で複数のRのプロセスでオブジェクトを共有することが 可能である. 21
  22. 22. 3.2 大規模データ管理パッケージ ff  データをディスクに置き,必要に応じてメモリにロードする.  行列,データフレーム,因子など多数のデータ型を用意している. どちらが優位かについては 一概に言えない bigmemory  大規模データをディスク等に置き,必要に応じて物理メモリにキャッシュ する.  扱えるデータ型は行列のみである.  1台の計算機上で複数のRのプロセスでオブジェクトを共有することが 可能である. 22
  23. 23. 3.2 大規模データ管理パッケージ ff  データをディスクに置き,必要に応じてメモリにロードする.  行列,データフレーム,因子など多数のデータ型を用意している. どちらが優位かについては 一概に言えない bigmemory  大規模データをディスク等に置き,必要に応じて物理メモリにキャッシュ する.  扱えるデータ型は行列のみである.  1台の計算機上で複数のRのプロセスでオブジェクトを共有することが 可能である. 23
  24. 24. 3.2 大規模データ管理パッケージ ff  データをディスクに置き,必要に応じてメモリにロードする.  行列,データフレーム,因子など多数のデータ型を用意している. どちらが優位かについては 一概に言えない bigmemory  大規模データをディスク等に置き,必要に応じて物理メモリにキャッシュ する.  扱えるデータ型は行列のみである.  1台の計算機上で複数のRのプロセスでオブジェクトを共有することが 可能である. 並列計算・並行計算が可能に 24
  25. 25. 3.3 bigmemoryを用いて解決するRの欠点 欠点 bigmemoryの使用による解決度合いマルチCPU(コア)の環境でも基 ○本的に1CPU(コア) 並列計算,並行計算が可能に ○基本的にオンメモリでデータを保持,計算を実行 RAMをはるかに超えるデータの扱いが可 能にベクトル,行列,配列などの要素 ○数の上限が231-1 要素数の上限は252まで拡張基本的にオブジェクトの参照渡しができず値渡しを行うため,コ ◎ピーがあちこちで発生しメモリを消費する 参照渡しでオブジェクトを渡せる 25
  26. 26. 3.4 The bigmemory project 大規模行列の管理/解析/集計を行うパッケージ群 2010年度の米国の統計学会の 統計計算分野で、2010年の "John M. Chambers Statistical Software Award"を受賞 次の5つのパッケージで構成される パッケージ名 機能bigmemory 大規模行列の管理biganalytics 大規模行列の解析bigtabulate 大規模行列の集計bigalgebra 大規模行列の演算synchronicity 大規模行列の処理の同期・排他制御 26
  27. 27. 3.5 bigmemoryパッケージの基本的な使い方 Data Expo 2009 アメリカの旅客機のフライトデータ(1987年~2008年) 約1億2,300万レコード,29フィールド(約12GB) 27
  28. 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. 29.  bigtabulateを用いると,データの要約・集計も可能になる.> library(bigtabulate)> # 各列の要約(最小値、最大値、平均値、NAの数)> summary(airline)> # 年ごと月ごとのフライト数> bigtable(airline, c("Year", "Month"))> # 曜日ごとの到着時間の遅れの統計量(最小値、最大値、平均値、標準 偏差、NAの数)> bigtsummary(airline, "DayOfWeek", cols="ArrDelay", na.rm=T) 29
  30. 30. 3.6 (ご参考)大規模データを扱うメカニズム メモリマッピングという技術を用いて,ファイルをメモリのように 扱い,必要なときに高速にキャッシュする. ファイルから メモリに メモリ 高速キャッシュ ディスク ファイル CPU ファイルを メモリのように扱う 30
  31. 31. アジェンダ1. 自己紹介2.Rの長所と短所3.Rにおける大規模データ管理4. bigmemoryパッケージを用いた並列計算5. まとめ 31
  32. 32. 4.1 並列計算とは ジョブを分割して複数のCPU(orコア)で処理すること CPU CPU CPU CPU 1CPU(コア)での処理に比べ計算速度が向上 32
  33. 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. 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. 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. 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. 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. 38.  そこで,異なるアプローチで計算を行う> library(bigtabulate)> # 旅客機コードごとのレコード番号> planeindices <- bigsplit(x, TailNum)> library(doMC)> registerDoMC(cores=2) 2コアを使って 並列計算> # 製造月の推定> planeStart <-+ foreach(i=planeindices, .combine=c) %dopar% {+ return(birthmonth(x[i, c(Year,Month),+ drop=FALSE]))+ } 14秒!! 38
  39. 39.  そこで,異なるアプローチで計算を行う> library(bigtabulate)> # 旅客機コードごとのレコード番号> planeindices <- bigsplit(x, TailNum)> library(doMC)> registerDoMC(cores=2) 2コアを使って 並列計算> # 製造月の推定 旅客機ごとに> planeStart <- ジョブを分割+ foreach(i=planeindices, .combine=c) %dopar% {+ return(birthmonth(x[i, c(Year,Month),+ drop=FALSE]))+ } 14秒!! 39
  40. 40.  そこで,異なるアプローチで計算を行う> library(bigtabulate)> # 旅客機コードごとのレコード番号> planeindices <- bigsplit(x, TailNum)> library(doMC)> registerDoMC(cores=2) 2コアを使って 並列計算> # 製造月の推定 旅客機ごとに> planeStart <- ジョブを分割+ foreach(i=planeindices, .combine=c) %dopar% {+ return(birthmonth(x[i, c(Year,Month),+ drop=FALSE]))+ } 旅客機ごとの製造月の推定 14秒!! 40
  41. 41.  そこで,異なるアプローチで計算を行う> library(bigtabulate)> # 旅客機コードごとのレコード番号> planeindices <- bigsplit(x, TailNum)> library(doMC)> registerDoMC(cores=2) 2コアを使って 並列計算> # 製造月の推定 旅客機ごとに> planeStart <- ジョブを分割 結果の集約+ foreach(i=planeindices, .combine=c) %dopar% {+ return(birthmonth(x[i, c(Year,Month),+ drop=FALSE]))+ } 旅客機ごとの製造月の推定 14秒!! 41
  42. 42. 4.3 split-apply-combine CPU CPU CPU CPU 42
  43. 43. 4.3 split-apply-combine CPU CPU CPU CPU 2コアを使って 並列計算 43
  44. 44. 4.3 split-apply-combine CPU CPU CPU CPU 旅客機ごとに 2コアを使って ジョブを分割 並列計算 44
  45. 45. 4.3 split-apply-combine CPU CPU CPU CPU 旅客機ごとに 2コアを使って ジョブを分割 並列計算 旅客機ごとの 製造月の推定 45
  46. 46. 4.3 split-apply-combine CPU CPU CPU CPU 旅客機ごとに 2コアを使って 結果の集約 ジョブを分割 並列計算 旅客機ごとの 製造月の推定 46
  47. 47. 4.3 split-apply-combine split CPU CPU CPU CPU 旅客機ごとに 2コアを使って 結果の集約 ジョブを分割 並列計算 旅客機ごとの 製造月の推定 47
  48. 48. 4.3 split-apply-combine split apply CPU CPU CPU CPU 旅客機ごとに 2コアを使って 結果の集約 ジョブを分割 並列計算 旅客機ごとの 製造月の推定 48
  49. 49. 4.3 split-apply-combine split apply combine CPU CPU CPU CPU 旅客機ごとに 2コアを使って 結果の集約 ジョブを分割 並列計算 旅客機ごとの 製造月の推定 49
  50. 50. 4.3 split-apply-combine "split-apply-combine" split apply combine CPU CPU CPU CPU 旅客機ごとに 2コアを使って 結果の集約 ジョブを分割 並列計算 旅客機ごとの 製造月の推定 50
  51. 51. 4.4 biganalyticsパッケージにおける実装例 非階層的クラスター分析のk平均法 分析対象のデータ ① 指定したクラスター数個分の クラスター中心をランダムに選ぶ ② 各データに対して ③ 各クラスターに属する点の中心を 最も近い中心を探す 新たなクラスター中心とする クラスターが変化 しなくなるまで 繰り返す 51
  52. 52. 4.4 biganalyticsパッケージにおける実装例 K平均法の結果は初期値に大きく依存 → 複数回試行する 分析対象のデータ ① 指定したクラスター数個分の クラスター中心をランダムに選ぶ ② 各データに対して ③ 各クラスターに属する点の中心を 最も近い中心を探す 新たなクラスター中心とする クラスターが変化 しなくなるまで 繰り返す 52
  53. 53. 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)) } }     (以降略)} 53
  54. 54. 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)) } }     (以降略)} 54
  55. 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)) } }     (以降略)} 55
  56. 56. 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)     (以降略)} 56
  57. 57. 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)     (以降略)} 57
  58. 58. 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関数 ③ ― 58
  59. 59. ① 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 59
  60. 60. 4.5 biganalyticsパッケージの問題点 bigmemoryパッケージのbig.matrix型は,既存のRのコードでの 行列と同様に扱えないため,分析用の関数を自前で作らなけ ればならない. 現状のbiganalyticsパッケージ(Ver.1.0.14)において,分析 用の関数として提供されているものは,(一般化)線形回帰, k平均法のみである. 分析 関数名 通常のRの関数線形回帰 biglm.big.matrix lm一般化線形回帰 bigglm.big.matrix glmk平均法 bigkmeans kmeans 60
  61. 61.  大規模データの並列(分散)処理といえば・・・ 61
  62. 62.  大規模データの並列(分散)処理といえば・・・ 62
  63. 63.  大規模データの並列(分散)処理といえば・・・ Mahoutのような機械学習のアルゴリズムを biganalyticsパッケージの関数として実装してみよう! 63
  64. 64.  今回はナイーブベイズ分類器を実装する. ナイーブベイズ分類器は,教師あり学習によりクラス分類を行 う手法の一つ. 現状ではクラスの予測では並列化を行なっていない(今後, 並列化予定). 64
  65. 65. 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")} 65
  66. 66. 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)} 66
  67. 67. アジェンダ1. 自己紹介2.Rの長所と短所3.Rにおける大規模データ管理4. bigmemoryパッケージを用いた並列計算5. まとめ 67
  68. 68.  統計解析ツールとして有望なRは大規模なデータを扱うことが 得意ではない. そのため,Rで大規模なデータを管理,分析しようとすると工 夫が必要. bigmemoryパッケージを用いるとディスクを用いてRAMをはる かに超える量のデータを管理でき,また同一計算機上の複数 プロセスでオブジェクトを共有できる. bigmemoryとその兄弟パッケージを用いると大規模データの 管理や集計が可能だが,biganalyticsパッケージに入っている 分析用の関数はまだまだ少ない. そこで,機械学習のアルゴリズムを実装しようと試みた(to be coninued). 68
  69. 69. 宣伝「Rパッケージガイドブック」(4月8日発売) 69
  70. 70. 参考文献 Bigmemory Project  Michael J. Kane and John W. Emerso(2010): The Bigmemory project, http://cran.rproject.org/web/packages/bigmemory/vignettes/O verview.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日. 70

×