for を捨てよ、foreach を書こう

32
for を捨てよ、foreach を書こう @hoxo_m 2015/07/18

Upload: hoxom

Post on 13-Aug-2015

1.883 views

Category:

Data & Analytics


1 download

TRANSCRIPT

Page 1: for を捨てよ、foreach を書こう

for を捨てよ、foreachを書こう

@hoxo_m

2015/07/18

Page 2: for を捨てよ、foreach を書こう

自己紹介

• hoxo_m

• 某 ECサイトでデータ分析をやっています

• 作成パッケージ:

– pforeach (R の並列処理を超簡単に書く)

– SparkRext (SparkRを dplyrに近づける)

– dplyrr (dplyrの DB用ユーティリティー)

– lambdaR (R にラムダ式を導入する)

– easyRFM (RFM 分析を簡単に実行する)

Page 4: for を捨てよ、foreach を書こう

R 入門者

R をおぼえたぞ!楽しい!

Page 5: for を捨てよ、foreach を書こう

繰り返し処理が便利!

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/30.html

Page 7: for を捨てよ、foreach を書こう

R 上級者の教え

R で for を使ってはいけません

apply を使うのです

調べてみます

Page 8: for を捨てよ、foreach を書こう

apply ファミリー

• apply

• sapply

• lapply

• mapply

• tapply

• eapply

• rapply

Page 9: for を捨てよ、foreach を書こう

わからない

Page 10: for を捨てよ、foreach を書こう

わからない

Page 11: for を捨てよ、foreach を書こう
Page 12: for を捨てよ、foreach を書こう

apply ファミリー

• なぜこんなにたくさんの関数の使い方を覚えなければならないのか?

– apply

– sapply

– lapply

– mapply

– tapply

– eapply

– rapply

Page 13: for を捨てよ、foreach を書こう

foreach

Page 14: for を捨てよ、foreach を書こう

foreachパッケージ

• Revolution Analytics 社が開発

• for と同じような使い方でわかりやすい

• apply ファミリのように使い分ける必要なし

• 返り値を返す

• イテレータを使った省メモリループ

• 並列化をサポート

Page 15: for を捨てよ、foreach を書こう

for と同じような使い方

for

foreach

in ではなく =

%do% が必要

Page 16: for を捨てよ、foreach を書こう

返り値を返す

for

foreach

結果を格納する変数の事前準備が不要

Page 17: for を捨てよ、foreach を書こう

オプションによる柔軟な動作

• 特に .combine 引数は結果を結合する関数を指定できる

デフォルトではリストで返すが、結合関数に c を指定することでベクトルに

その他 .init や .final など「foreachについてまとめたい」が詳しい

Page 18: for を捨てよ、foreach を書こう

Simultaneous Iteration

• 2 つの変数を同時に変更しながらループ

結果は 5, 7, 9 になる(1+4, 2+5, 3+6)

Page 19: for を捨てよ、foreach を書こう

リスト内包表記

• リスト内包表記のように使える

Python の次のコードと同じ

Page 20: for を捨てよ、foreach を書こう

iterators

Page 21: for を捨てよ、foreach を書こう

イテレータ

• iteratorsパッケージ

必要になったときに必要な分だけ生成

⇒省メモリ

Page 22: for を捨てよ、foreach を書こう

イテレータ

• foreachと組み合わせて使う

Page 23: for を捨てよ、foreach を書こう

イテレータと省メモリ

イテレータで使う時だけ生成!

データが大きすぎてエラーに!

1億×10 の乱数行列に対してループしたい

※ iread.table() で大きなファイルを一行づつ読み込むこともできる

Page 24: for を捨てよ、foreach を書こう

イテレータと並列化

• 並列化したとき、各クラスタノードに必要な分だけデータを渡す

• 不要な通信コスト削減

データを全部渡す

Page 25: for を捨てよ、foreach を書こう

並列化

Page 26: for を捨てよ、foreach を書こう

並列化

• バックエンドを設定すれば並列化可能

• 様々なバックエンドが使える

– parallel

– snow

– multicore

– Rmpi

• 詳細はこの本が金字塔

Page 27: for を捨てよ、foreach を書こう

parallel & doParallel

• parallel パッケージ

– R 標準の並列化パッケージ

–インストール不要

• doParallelパッケージ

– foreachで parallel パッケージを用いた並列化を簡単にするためのパッケージ

Page 28: for を捨てよ、foreach を書こう

並列化の基本

Page 29: for を捨てよ、foreach を書こう

並列化の注意点

• 並列化するためにやること

–並列計算用ライブラリの読み込み

–クラスタの作成

–ループ内で使用するパッケージの指定

–ループ内にエクスポートする必要のある変数の指定

– %do% を%dopar% に変更

–クラスタの終了処理

Page 30: for を捨てよ、foreach を書こう

pforeach

• めんどくさいと思ったあなたへ

• R で超簡単に並列処理を書けるパッケージpforeachを作った

http://d.hatena.ne.jp/hoxo_m/20141222/p1

Page 31: for を捨てよ、foreach を書こう

まとめ

• for はバッドノウハウのかたまり

• apply ファミリーは初心者殺し

foreachを使おう!

Page 32: for を捨てよ、foreach を書こう

参考• foreachパッケージの Vignette

– Using The foreach Package

–【超訳】foreachパッケージの使い方

• 書籍

–福島真太朗『Rによるハイパフォーマンスコンピューティング』

• スライド

– Rで並列処理:foreachパッケージ解剖学

– RにおけるHPC~並列計算編~