dataminer.me

データマイニングやその周辺のお話を書くブログ

高速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を駆使して連絡ください。