R, Python, DB 備忘録

データベースとか、jupyter(Python)、Rとか色々

疎行列同士の最大最小

疎行列(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に対する要素ごとの最大値を取るコード
    • M1とM2の次元は一致している前提
class(M1)     # 'dgCMatrix'
class(M2)     # 'dgCMatrix'
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))