技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く興味があります。

Extream Learning Machineの簡単実装

あまり知られていないかも知れないが、Extream Learning Machineというニューラルネットの一種がある。
3層のニューラルネットなんだけど、通常のニューラルネットと違い、学習は出力層と中間層の重回帰で学習する。通常のようなバックプロパゲーションのような面倒なことはしない。
入力層と中間層の間の重みはランダムで良く、学習する必要がない。ただ通常より多くの中間層ニューロンを用意しておく必要がある。
イメージとしては特徴量を大量生成しておいて、分類に役に立ちそうな候補手を重回帰で選択するといった感じだろうか。重回帰なのでデータをまとめてオフラインでしか学習できない。
利点

欠点

  • オンライン学習ではない
  • 過学習の問題がありそう
import matplotlib.pyplot as plt
import numpy as np
import seaborn
seaborn.set_style("whitegrid")

mid_num = 200
train_num = 2000
test_num = 200
train = np.random.random([train_num, 2]) * 10 - 5
teacher = np.zeros(train_num)
for i in range(train_num):
    teacher[i] = 0 if np.linalg.norm(train[i]) < 3 else 1
test = np.random.random([test_num, 2]) * 10 - 5
predict = np.zeros(test_num)

def activation(x):
    return 1/(1 + np.exp(-x))

# learning
input_weight = np.random.random([2,mid_num])
mid = activation(np.dot(train, input_weight))
output_weight = np.dot(np.linalg.pinv(mid), teacher)

# predicting
mid = activation(np.dot(test, input_weight))
output = np.dot(mid, output_weight)
predict = map(lambda x: 1 if x>0.5 else 0, output)

for i in range(test_num):
    color = "r" if teacher[i] else "b"
    plt.scatter(*train[i], color=color)

circle = [(3*np.sin(x), 3*np.cos(x)) for x in np.arange(0, 6.29, 0.001)]
plt.plot(*zip(*circle), color="g")

plt.axis("square")
plt.show()

f:id:swdrsker:20170302225355p:plain