高速SVD
FastSVDという関数をRで見つけたので
早速使ってみました。
パッケージの作成者が公開している
ベンチマークテストを用いて自分のPCで
200×50000の行列をSVDしてみたところ
通常 = 39秒
fastSVD = 17秒
おお、なかなか早くなる。
というわけでRpy2を使って
実行する方法を以下に載せます。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys, random, os import numpy as NP import rpy2.robjects as robjects robjects.r["library"]("corpcor") try: sys.argv[1],sys.argv[2] except: print "実行文にエラーがあります" print "python fastSVD.py [解析対象のデータ] [出力先ディレクトリ]" sys.exit() def csv2dataframe(File): import csv CSVreader = csv.reader(file(File, 'r')) dataframe = {} for row in NP.transpose(list(CSVreader)): dataframe[row[0]] = robjects.FloatVector(NP.array(row[1:],NP.float64)) return robjects.r["data.frame"](**dataframe) def robj2csv(RFResult): import csv writer = csv.writer(file(sys.argv[2]+'d.csv', 'w')) writer.writerow(NP.array(RFResult.r["d"][0])) writer = csv.writer(file(sys.argv[2]+'u.csv', 'w')) for data in NP.array(RFResult.r["u"][0]): writer.writerow(data) writer = csv.writer(file(sys.argv[2]+'v.csv', 'w')) for data in NP.array(RFResult.r["v"][0]): writer.writerow(data) Rdataframe = csv2dataframe(sys.argv[1]) formula = robjects.RFormula('~ .') x = robjects.r["as.matrix"](Rdataframe) RFResult = robjects.r["fast.svd"](x) robj2csv(RFResult)
あと、データセットごとDropboxにアップロードしたので
もしも、実際に解析をして見たいという方がいたら
Dropboxのソースが入っているフォルダをシェアしますので
コメントとかTwitterを駆使して連絡ください。