###前提・実現したいこと
下記のコードではrpy2によってPythonからRを呼び出しているのですが、自分はpyperによってRを呼び出したいと考えています。
しかし色々調べたのですが、PythonもRについても最近勉強し始めた自分にはどこをどのように変更すれば良いのか分かりませんでした。
そこで、変更点などを具体的に分かる方どうか教えていただけないでしょうか?
ちなみに正常に動作すれば「emd = 160.542762808」と出力されると思います。
どうかよろしくお願いします。
###該当のソースコード
python
1#coding:utf-8 2import numpy as np 3import rpy2.robjects as robjects 4 5# Rのlp.transport()をインポート 6robjects.r['library']('lpSolve') 7transport = robjects.r['lp.transport'] 8 9def euclid_dist(feature1, feature2): 10 """ユークリッド距離を計算""" 11 if len(feature1) != len(feature2): 12 print "ERROR: calc euclid_dist: %d <=> %d" % (len(feature1), len(feature2)) 13 return -1 14 return np.sqrt(np.sum((feature1 - feature2) ** 2)) 15 16def emd(dist, w1, w2): 17 """Rのtransport()関数を使ってEMDを計算""" 18 # transport()の引数を用意 19 costs = robjects.r['matrix'](robjects.FloatVector(dist), 20 nrow=len(w1), ncol=len(w2), 21 byrow=True) 22 row_signs = ["<"] * len(w1) 23 row_rhs = robjects.FloatVector(w1) 24 col_signs = [">"] * len(w2) 25 col_rhs = robjects.FloatVector(w2) 26 27 t = transport(costs, "min", row_signs, row_rhs, col_signs, col_rhs) 28 flow = t.rx2('solution') 29 30 dist = dist.reshape(len(w1), len(w2)) 31 flow = np.array(flow) 32 work = np.sum(flow * dist) 33 emd = work / np.sum(flow) 34 return emd 35 36if __name__ == "__main__": 37 f1 = np.array([ [100, 40, 22], [211, 20, 2], [32, 190, 150], [2, 100, 100] ]) 38 f2 = np.array([ [0, 0, 0], [50, 100, 80], [255, 255, 255] ]) 39 40 # 重みは自然数のみ 41 w1 = np.array([4, 3, 2, 1]) 42 w2 = np.array([5, 3, 2]) 43 44 n1 = len(f1) 45 n2 = len(f2) 46 47 # 距離行列を作成 48 dist = np.zeros(n1 * n2) 49 for i in range(n1): 50 for j in range(n2): 51 dist[i * n2 + j] = euclid_dist(f1[i], f2[j]) 52 53 # 距離行列と重みからEMDを計算 54 print "emd =", emd(dist, w1, w2)
###補足情報(言語/FW/ツール等のバージョンなど)
Windows10
Python2.7
R3.3.2
pyper-1.1.2
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。