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)
  以...
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....
Simple example
> mat <- spMatrix(10,20,
+                 i=c(1,5,3:6),
+                 j=c(2,8,17:20),
+                 x=2*c(1:6)
+ ...
• spMatrix(nrow, ncol, i = integer(), j =
  integer(), x = numeric())
    • i、jには値が存在する⾏列のインデックスが
      ⼊ったベクトルを
    • xには...
> mat>7
10 x 20 sparse Matrix of class "lgTMatrix"

 [1,] . : . . . . . . . . . . . . . . . . . .
 [2,] . . . . . . . . . ...
補⾜
• あとは普通のmatrixのように操作可能
  • x %*% y, x+y
  • crossprod(x,y)
  • eigen(x)
• “operations on them using Lapack and
  SuiteS...
Lazy tips
SpMatrixめんどくせ…
• 便利っぽそうなのは判った
• でも代⼊がめんどくさい
• 普段使うファイルはこんな形式
v1,v2,val
aa,bb,1.0
Aa,cc,1.0
xx,bb,0.5
…
• というわけで自作関数で対応
makaSM

• 使い⽅
raw.data <- read.csv("test.csv",
                   h=F,
                   stringsAsFactors=FALSE)

ans <- ...
makeSM <- function(raw.data){

    i.uniq <- unique(raw.data[,1])
    j.uniq <- unique(raw.data[,2])

    i.index <- c()
 ...
Lazy&Happy!
Conclusion
まとめ
• Matrixを使えば疎⾏列も怖くない!!!
 • アンチスパースネス!!!!!!!!!
 • 既存の関数使いまくり!!!!!!!!
 • 疎⾏列が怖くないから機械学習だって怖くな
   い!!!!!!!!
• あとhashもあるから...
参考資料
• Maechler Martin, Bates Douglas, “Sparse
  Matrices in package Matrix and applications”,
  http://www.agrocampus-oue...
Upcoming SlideShare
Loading in...5
×

R's anti sparseness

2,692

Published on

http://twitter.com/y_benjo
Tsukuba.R#6
http://wiki.livedoor.jp/syou6162/d/Tsukuba.R%236

Published in: Technology, Education
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,692
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
9
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "R's anti sparseness"

  1. 1. Tsukuba.R#6 @ 筑波大学 y_benjo
  2. 2. Intro
  3. 3. 自⼰紹介 • y_benjo(便所糞⾍) • http://d.hatena.ne.jp/repose/
  4. 4. 専門:機械学習っぽい事 • これまで
  5. 5. 専門:機械学習っぽい事 • これまで • やる夫でSVMを説明したりRで書いたり
  6. 6. 専門:機械学習っぽい事 • これまで • やる夫でSVMを説明したりRで書いたり • Twitterをクラスタリングしたり
  7. 7. 専門:機械学習っぽい事 • これまで • やる夫でSVMを説明したりRで書いたり • Twitterをクラスタリングしたり • アクセスログをRで触ったり
  8. 8. Agenda
  9. 9. • 疎⾏列って何
  10. 10. • 疎⾏列って何 • 便利なパッケージの話
  11. 11. • 疎⾏列って何 • 便利なパッケージの話 • 試してみる
  12. 12. • 疎⾏列って何 • 便利なパッケージの話 • 試してみる • Matrixを楽に触るためにちょっとした関 数を書いてみる
  13. 13. What’s sparseness?
  14. 14. Sparseness:データが疎な事 • 具体例 • ⼀度しか出てこない要素が全要素の7割を占 めたり • 1800000×1300の⾏列で値が⼊っている部 分が約120000個しかない • 0.05%しか値が⼊っておらず、その他は全てゼロ • すっかすか
  15. 15. 疎⾏列は⽇常茶飯事 • 自然⾔語処理などの単語-⽂章⾏列
  16. 16. 疎⾏列は⽇常茶飯事 • 自然⾔語処理などの単語-⽂章⾏列 • 情報推薦などにおけるユーザー-アイテム ⾏列
  17. 17. 疎⾏列は⽇常茶飯事 • 自然⾔語処理などの単語-⽂章⾏列 • 情報推薦などにおけるユーザー-アイテム ⾏列 • グラフを表した隣接⾏列
  18. 18. 疎⾏列は⽇常茶飯事 • 自然⾔語処理などの単語-⽂章⾏列 • 情報推薦などにおけるユーザー-アイテム ⾏列 • グラフを表した隣接⾏列 • データが大きくなればなるほどスパース ネスは重要な問題になる
  19. 19. Problem
  20. 20. 問題点 • 大多数をゼロで占める⾏列の全てを持っ ていてもメモリの無駄
  21. 21. 問題点 • 大多数をゼロで占める⾏列の全てを持っ ていてもメモリの無駄 • むしろそのままだとメモリに載せられない • Rだと作ることすらできなかったり > i.u.mat <- matrix(0,1300,1800000) 以下にエラー matrix(0, 1300, 1800000) : 指定 された要素数が多すぎます
  22. 22. Anti sparseness?
  23. 23. • 怠惰な回避策 • ゼロじゃないところだけで持てば良い • 連想配列を使う • C++ : std::map<int, std::map<int, int> > • Ruby : hoge[i => j] = 1 •…
  24. 24. 問題点 • これだと⾏列のフリは出来ても、⾏列操 作をそのまま⾏えるわけではない • Rの便利な関数やパッケージ達をそのまま 使えて、なおかつメモリを⾷わないよう にしたい • 自作データ構造用に⾞輪の再開発なんてして たら死んでしまう
  25. 25. Anti sparseness!
  26. 26. CRAN package
  27. 27. Matrix • Matrix: Sparse and Dense Matrix Classes and Methods • “Package Matrix: a recommended R package since R 2.9.0” • ⾊々なパッケージから依存されてるような⼼ 強いパッケージ • 導⼊はinstall.packages(“Matrix”)
  28. 28. Simple example
  29. 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. 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. 31. > mat>7 10 x 20 sparse Matrix of class "lgTMatrix" [1,] . : . . . . . . . . . . . . . . . . . . [2,] . . . . . . . . . . . . . . . . . . . . [3,] . . . . . . . . . . . . . . . . : . . . [4,] . . . . . . . . . . . . . . . . . | . . [5,] . . . . . . . : . . . . . . . . . . | . [6,] . . . . . . . . . . . . . . . . . . . | [7,] . . . . . . . . . . . . . . . . . . . . [8,] . . . . . . . . . . . . . . . . . . . . [9,] . . . . . . . . . . . . . . . . . . . . [10,] . . . . . . . . . . . . . . . . . . . .
  32. 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)”
  33. 33. Lazy tips
  34. 34. SpMatrixめんどくせ… • 便利っぽそうなのは判った • でも代⼊がめんどくさい • 普段使うファイルはこんな形式 v1,v2,val aa,bb,1.0 Aa,cc,1.0 xx,bb,0.5 … • というわけで自作関数で対応
  35. 35. makaSM • 使い⽅ raw.data <- read.csv("test.csv", h=F, stringsAsFactors=FALSE) ans <- makeSM(raw.data)
  36. 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) }
  37. 37. Lazy&Happy!
  38. 38. Conclusion
  39. 39. まとめ • Matrixを使えば疎⾏列も怖くない!!! • アンチスパースネス!!!!!!!!! • 既存の関数使いまくり!!!!!!!! • 疎⾏列が怖くないから機械学習だって怖くな い!!!!!!!! • あとhashもあるから僕みたいなLL脳な⼈ はinstall.packages(“hash”)してもっと楽 をしましょう
  40. 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/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×