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]