Weitere ähnliche Inhalte Ähnlich wie R's anti sparseness (20) Kürzlich hochgeladen (11) R's anti sparseness12. • 疎⾏列って何
• 便利なパッケージの話
• 試してみる
• Matrixを楽に触るためにちょっとした関
数を書いてみる
14. Sparseness:データが疎な事
• 具体例
• ⼀度しか出てこない要素が全要素の7割を占
めたり
• 1800000×1300の⾏列で値が⼊っている部
分が約120000個しかない
• 0.05%しか値が⼊っておらず、その他は全てゼロ
• すっかすか
21. 問題点
• 大多数をゼロで占める⾏列の全てを持っ
ていてもメモリの無駄
• むしろそのままだとメモリに載せられない
• Rだと作ることすらできなかったり
> i.u.mat <- matrix(0,1300,1800000)
以下にエラー matrix(0, 1300, 1800000) : 指定
された要素数が多すぎます
23. • 怠惰な回避策
• ゼロじゃないところだけで持てば良い
• 連想配列を使う
• C++ : std::map<int, std::map<int, int> >
• Ruby : hoge[i => j] = 1
•…
24. 問題点
• これだと⾏列のフリは出来ても、⾏列操
作をそのまま⾏えるわけではない
• Rの便利な関数やパッケージ達をそのまま
使えて、なおかつメモリを⾷わないよう
にしたい
• 自作データ構造用に⾞輪の再開発なんてして
たら死んでしまう
27. Matrix
• Matrix: Sparse and Dense Matrix
Classes and Methods
• “Package Matrix: a recommended R
package since R 2.9.0”
• ⾊々なパッケージから依存されてるような⼼
強いパッケージ
• 導⼊はinstall.packages(“Matrix”)
29. > mat <- spMatrix(10,20,
+ i=c(1,5,3:6),
+ j=c(2,8,17:20),
+ x=2*c(1:6)
+ )
> mat
10 x 20 sparse Matrix of class "dgTMatrix"
[1,] . 2 . . . . . . . . . . . . . . . . . .
[2,] . . . . . . . . . . . . . . . . . . . .
[3,] . . . . . . . . . . . . . . . . 6 . . .
[4,] . . . . . . . . . . . . . . . . . 8 . .
[5,] . . . . . . . 4 . . . . . . . . . . 10 .
[6,] . . . . . . . . . . . . . . . . . . . 12
[7,] . . . . . . . . . . . . . . . . . . . .
[8,] . . . . . . . . . . . . . . . . . . . .
[9,] . . . . . . . . . . . . . . . . . . . .
[10,] . . . . . . . . . . . . . . . . . . . .
30. • 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
31. > mat>7
10 x 20 sparse Matrix of class "lgTMatrix"
[1,] . : . . . . . . . . . . . . . . . . . .
[2,] . . . . . . . . . . . . . . . . . . . .
[3,] . . . . . . . . . . . . . . . . : . . .
[4,] . . . . . . . . . . . . . . . . . | . .
[5,] . . . . . . . : . . . . . . . . . . | .
[6,] . . . . . . . . . . . . . . . . . . . |
[7,] . . . . . . . . . . . . . . . . . . . .
[8,] . . . . . . . . . . . . . . . . . . . .
[9,] . . . . . . . . . . . . . . . . . . . .
[10,] . . . . . . . . . . . . . . . . . . . .
32. 補⾜
• あとは普通の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)”
36. 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.uniq
colnames(ret) <- j.uniq
return(ret)
}
39. まとめ
• Matrixを使えば疎⾏列も怖くない!!!
• アンチスパースネス!!!!!!!!!
• 既存の関数使いまくり!!!!!!!!
• 疎⾏列が怖くないから機械学習だって怖くな
い!!!!!!!!
• あとhashもあるから僕みたいなLL脳な⼈
はinstall.packages(“hash”)してもっと楽
をしましょう
40. 参考資料
• 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/