r's anti sparseness
DESCRIPTION
http://twitter.com/y_benjo Tsukuba.R#6 http://wiki.livedoor.jp/syou6162/d/Tsukuba.R%236TRANSCRIPT
Tsukuba.R#6 @ 筑波大学y_benjo
Intro
• y_benjo(便所糞⾍)• http://d.hatena.ne.jp/repose/
自⼰紹介
専門:機械学習っぽい事• これまで
専門:機械学習っぽい事• これまで
• やる夫でSVMを説明したりRで書いたり
専門:機械学習っぽい事• これまで
• やる夫でSVMを説明したりRで書いたり• Twitterをクラスタリングしたり
専門:機械学習っぽい事• これまで
• やる夫でSVMを説明したりRで書いたり• Twitterをクラスタリングしたり• アクセスログをRで触ったり
Agenda
• 疎⾏列って何
• 疎⾏列って何• 便利なパッケージの話
• 疎⾏列って何• 便利なパッケージの話• 試してみる
• 疎⾏列って何• 便利なパッケージの話• 試してみる• Matrixを楽に触るためにちょっとした関
数を書いてみる
What’s sparseness?
Sparseness:データが疎な事• 具体例
• ⼀度しか出てこない要素が全要素の7割を占めたり
• 1800000×1300の⾏列で値が⼊っている部分が約120000個しかない• 0.05%しか値が⼊っておらず、その他は全てゼロ• すっかすか
疎⾏列は⽇常茶飯事• 自然⾔語処理などの単語-⽂章⾏列
疎⾏列は⽇常茶飯事• 自然⾔語処理などの単語-⽂章⾏列• 情報推薦などにおけるユーザー-アイテム
⾏列
疎⾏列は⽇常茶飯事• 自然⾔語処理などの単語-⽂章⾏列• 情報推薦などにおけるユーザー-アイテム
⾏列• グラフを表した隣接⾏列
疎⾏列は⽇常茶飯事• 自然⾔語処理などの単語-⽂章⾏列• 情報推薦などにおけるユーザー-アイテム
⾏列• グラフを表した隣接⾏列
• データが大きくなればなるほどスパースネスは重要な問題になる
Problem
問題点• 大多数をゼロで占める⾏列の全てを持っ
ていてもメモリの無駄
問題点• 大多数をゼロで占める⾏列の全てを持っ
ていてもメモリの無駄• むしろそのままだとメモリに載せられない• Rだと作ることすらできなかったり
> i.u.mat <- matrix(0,1300,1800000)以下にエラー matrix(0, 1300, 1800000) : 指定された要素数が多すぎます
Anti sparseness?
• 怠惰な回避策• ゼロじゃないところだけで持てば良い• 連想配列を使う
• C++ : std::map<int, std::map<int, int> >• Ruby : hoge[i => j] = 1• …
問題点• これだと⾏列のフリは出来ても、⾏列操
作をそのまま⾏えるわけではない• Rの便利な関数やパッケージ達をそのまま
使えて、なおかつメモリを⾷わないようにしたい• 自作データ構造用に⾞輪の再開発なんてして
たら死んでしまう
Anti sparseness!
CRAN package
Matrix• Matrix: Sparse and Dense Matrix
Classes and Methods• “Package Matrix: a recommended R
package since R 2.9.0”• ⾊々なパッケージから依存されてるような⼼
強いパッケージ
• 導⼊はinstall.packages(“Matrix”)
Simple example
> mat <- spMatrix(10,20,+ i=c(1,5,3:6),+ j=c(2,8,17:20),+ x=2*c(1:6)+ )> mat10 x 20 sparse Matrix of class "dgTMatrix"
[1,] . 2 . . . . . . . . . . . . . . . . . .[2,] . . . . . . . . . . . . . . . . . . . .[3,] . . . . . . . . . . . . . . . . 6 . . .[4,] . . . . . . . . . . . . . . . . . 8 . .[5,] . . . . . . . 4 . . . . . . . . . . 10 .[6,] . . . . . . . . . . . . . . . . . . . 12[7,] . . . . . . . . . . . . . . . . . . . .[8,] . . . . . . . . . . . . . . . . . . . .[9,] . . . . . . . . . . . . . . . . . . . .
[10,] . . . . . . . . . . . . . . . . . . . .
• spMatrix(nrow, ncol, i = integer(), j = integer(), x = numeric())• i、jには値が存在する⾏列のインデックスが
⼊ったベクトルを• xにはその値
> summary(mat)
10 x 20 sparse Matrix of class "dgTMatrix", with 6 entries
i j x
1 1 2 2
2 5 8 4
3 3 17 6
4 4 18 8
> mat>710 x 20 sparse Matrix of class "lgTMatrix"
[1,] . : . . . . . . . . . . . . . . . . . .[2,] . . . . . . . . . . . . . . . . . . . .[3,] . . . . . . . . . . . . . . . . : . . .[4,] . . . . . . . . . . . . . . . . . | . .[5,] . . . . . . . : . . . . . . . . . . | .[6,] . . . . . . . . . . . . . . . . . . . |[7,] . . . . . . . . . . . . . . . . . . . .[8,] . . . . . . . . . . . . . . . . . . . .[9,] . . . . . . . . . . . . . . . . . . . .[10,] . . . . . . . . . . . . . . . . . . . .
補⾜• あとは普通のmatrixのように操作可能
• x %*% y, x+y• crossprod(x,y)• eigen(x)
• “operations on them using Lapack and SuiteSparse.”• まだ実装できてるわけじゃないらしいけど• “Matrix 1.0-0 will contain truly sparse
lm(*, sparse=TRUE)”
Lazy tips
SpMatrixめんどくせ…• 便利っぽそうなのは判った• でも代⼊がめんどくさい• 普段使うファイルはこんな形式v1,v2,valaa,bb,1.0Aa,cc,1.0xx,bb,0.5…• というわけで自作関数で対応
makaSM
raw.data <- read.csv("test.csv",h=F,stringsAsFactors=FALSE)
ans <- makeSM(raw.data)
• 使い⽅
makeSM <- function(raw.data){
i.uniq <- unique(raw.data[,1])j.uniq <- unique(raw.data[,2])
i.index <- c()j.index <- c()x <- c()
for(i in 1:nrow(raw.data)){i.index <- append(i.index, which(i.uniq == raw.data[i,1]))j.index <- append(j.index, which(j.uniq == raw.data[i,2]))x <- append(x, raw.data[i,3])
}
ret <- (spMatrix(length(i.uniq),length(j.uniq),i = i.index, j = j.index, x))
rownames(ret) <- i.uniqcolnames(ret) <- j.uniq
return(ret)}
Lazy&Happy!
Conclusion
まとめ• Matrixを使えば疎⾏列も怖くない!!!
• アンチスパースネス!!!!!!!!!• 既存の関数使いまくり!!!!!!!!• 疎⾏列が怖くないから機械学習だって怖くな
い!!!!!!!!• あとhashもあるから僕みたいなLL脳な⼈
はinstall.packages(“hash”)してもっと楽をしましょう
参考資料• Maechler Martin, Bates Douglas, “Sparse
Matrices in package Matrix and applications”, http://www.agrocampus-ouest.fr/math/useR-2009/slides/Maechler+Bates.pdf
• 表紙ロゴ:とある画像の自動⽣成<ジェネレータ>, http://zio3.net/toarugen/