疎行列(SparseMatrix)
- 数百万個の各インプットに対して、数万個のキーワードの有無をフラグ化したい
- インプットを行、キーワードを列にTrue/Falseを値として持つ行列とみなせる。
- しかし、普通の行列(密行列)ではメモリ不足&重い
- 疎行列を使うべき
- アソシエーション分析
arules
や正則化付きロジスティック回帰glmnet
などでも活用しやすい。
- Rで疎行列を扱うパッケージといえば
Matrix
だが、要素ごとの最大最小を取る関数などは実装していない。
- 疎行列のクラス(dgCMatrix等)に実装されていない操作を行うと、エラーになる or 密行列に変換されてメモリ不足に陥る。
data.tableを使ったソリューション
- 疎行列Mに対して
summary
すると、Triplet格納形式(data.frame)が取得できる。
- Triplet格納形式とは、疎行列を<row index i, col index j, value x>で表したもの
- Triplet格納形式に対してデータを操作して、最後に疎行列(dgCMatrix)に戻す。
- 疎行列M1, M2に対する要素ごとの最大値を取るコード
class(M1)
class(M2)
dt <- rbind(summary(M1) %>% data.table(), summary(M2) %>% data.table())
dt2 <- dt[, x:=max(x, na.rm=TRUE), by=.(i, j)]
res <- sparseMatrix(i = dt2$i, j = dt2$j, x = dt2$x, dims = dim(M1))