Python の pyper モジュールにより、R を利用できる。R のパスを通しておく。
import csv
import random
from matplotlib import pyplot as plt
%matplotlib inline
import pyper
モジュールのインポート。
reader = csv.reader(open('data.csv', 'r'))
next(reader)
data = [r for r in reader]
n = len(data)
min1 = min([float(d[1]) for d in data])
max1 = max([float(d[1]) for d in data])
min2 = min([float(d[2]) for d in data])
max2 = max([float(d[2]) for d in data])
input_data_a = []
input_data_b = []
output_data = []
for i in xrange(n):
a = (float(data[i][1]) - min1)/(max1 - min1)
b = (float(data[i][2]) - min2)/(max2 - min2)
input_data_a.append(a)
input_data_b.append(b)
output_data.append(float(data[i][0]))
データの用意。
R = pyper.R()
R('library(nnet)')
R['a'] = input_data_a
R['b'] = input_data_b
R['r'] = output_data
R('input <- cbind(a, b)')
R('output <- as.matrix(r)')
print R('''
set.seed(1)
learn <- nnet(input, output, size=3, rang=0.1, maxit=2000, abstol=1e-4, reltol=1e-8)
result <- predict(learn, input)
''')
result = R['result']
R のコードの実行。nnet によりデータの学習を行う。
count = 0
for i in xrange(n):
if result[i] >= 0.5:
v = 1
else:
v = 0
if output_data[i] == v:
count += 1
print 'n = ', n, 'right = ', count, '(%.2f %%)' % (100.*count/n)
成績。PyBrain より成績がよい上に処理も速い。
data0_a = [input_data_a[i]*(max1 - min1) + min1 for i in xrange(n) if result[i] < 0.5]
data0_b = [input_data_b[i]*(max2 - min2) + min2 for i in xrange(n) if result[i] < 0.5]
data1_a = [input_data_a[i]*(max1 - min1) + min1 for i in xrange(n) if result[i] >= 0.5]
data1_b = [input_data_b[i]*(max2 - min2) + min2 for i in xrange(n) if result[i] >= 0.5]
plt.plot(data0_a, data0_b, '+')
plt.plot(data1_a, data1_b, 'r+');
学習結果。
random.seed(2)
data0_a = []
data0_b = []
data1_a = []
data1_b = []
data_a = []
data_b = []
for i in xrange(n):
a = random.random()
b = random.random()
data_a.append(a)
data_b.append(b)
R['a'] = data_a
R['b'] = data_b
R('''
input <- cbind(a, b)
result <- predict(learn, input)
''')
data_r = R['result']
data0_a = [data_a[i]*(max1 - min1) + min1 for i in xrange(n) if data_r[i] < 0.5]
data0_b = [data_b[i]*(max2 - min2) + min2 for i in xrange(n) if data_r[i] < 0.5]
data1_a = [data_a[i]*(max1 - min1) + min1 for i in xrange(n) if data_r[i] >= 0.5]
data1_b = [data_b[i]*(max2 - min2) + min2 for i in xrange(n) if data_r[i] >= 0.5]
plt.plot(data0_a, data0_b, '+')
plt.plot(data1_a, data1_b, 'r+');
ランダムに選んだ点における予測結果。