dataminer.me

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

R+Pythonでダイナミックベイジアンネットワーク

アクセスの結果を見てみると、ダイナミックベイジアンネットワーク関連で

検索をかけてきている人が結構いるみたいなので

RとPythonと使ってダイナミックベイジアンネットワークを生成する

スクリプトをしたにはってみる。

入力に用いることができるデータ形式

一行目をラベルとして、その右に時系列ごとの値を記載した

csvファイルとして

python 【以下のスクリプト】 【解析対象のcsv】という感じで実行する

今のところ、1990年〜2009年までの日経225の週次データや

2chのネットゲーム関連のスレの書き込み係数の推移とか

を元に投資傾向のセクターの移動とか

ネットゲームのユーザーの変遷とかをシミュレーションして遊んでた。

他にも時系列データだったら色々使えると思うので

何かに使ったら教えてもらいたい。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#rpy2が使える環境であることを確認
import numpy as NP
import sys
try:
	import rpy2.robjects as robjects
except:
	print "Rpy2をインストールしてください。"
	print "UBUNTUの場合、apt-get install python-rpy2 でインストールできます。"
	print "easy_install が入っている場合は easy_install rpy2 でインストールできます。"
	print "その他の場合は http://sourceforge.net/projects/rpy/files/rpy2/ からダウンロードして対応ください。"


#Rのダイナミックベイジアンネットワーク用のパッケージのインストール
try:
	robjects.r["library"]("G1DBN")
except:
	print "CRANのミラーサイトを使ってMCMCパッケージをダウンロードしてください。"
	robjects.r["install.packages"]("G1DBN")

#エッジの条件を決めるための関数
Dataframe = {}
file = sys.argv[1]
for line in open(file):
	data = line.strip().split(",")
	Dataframe[data[0]] = robjects.FloatVector(data[1:])
key = Dataframe.keys()
RDataframe = robjects.r["data.frame"](**Dataframe)
data = robjects.r["as.matrix"](RDataframe)
out = robjects.r["DBNScoreStep1"](data,method='ls')
edgesG1idx = robjects.r["BuildEdges"](score=out.r["S1ls"][0],targetNames=key,predNames=key)

#ダイナミックベイジアンネットワークによるエッジのしきい値を下方0.1、上方0.5にした場合
thlow = 0.1
thhigh = 0.5
counter = 0
words = str(edgesG1idx).split()
for i in range(len(words)):
	if words[i].startswith("["):
		if counter == 0:
			counter = 1
		else:
			if float(words[i-1]) > thlow and float(words[i-1]) < thhigh:
				print words[i-3][1:-1] + "\t" + words[i-2][1:-1]