パーセプトロンによるフィッティング

範囲-1〜1のcos関数の値に正規分布の乱数によるノイズを混ぜたデータをパーセプトロンによりフィッティングする

# coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

def multiplier_list(v, n):
    """
    引数を0乗からn乗したリストを返す
    例:
    multiplier_list(2, 4)
    [1, 2, 4, 8]
    """
    return [v ** i for i in range(0, n)]

# 9次多項式による多項式フィッティング(パーセプトロン版)
dim = 9
x_data = np.arange(-1.0, 1.0, 0.01)
formed_x_data = np.array([multiplier_list(x, dim) for x in x_data])
# ノイズ
bias = np.random.normal(scale=0.2, size=x_data.shape)
# cos関数にノイズをのせる
y_data = y = np.cos(2.*np.pi*x_data) + bias
# 縦ベクトルに変換
formed_y_data = y_data[:,np.newaxis]

# N x dim 行列(Nはデータ数)
X = tf.placeholder(tf.float32, shape=(None,dim))
# ラベル(正解データ)
t = tf.placeholder(tf.float32, shape=(None,1))

def single_layer(input_layer, node_num=1024):
    """隠れ層"""
    w = tf.Variable(tf.truncated_normal([dim,node_num]))
    b = tf.Variable(tf.zeros([node_num]))
    f = tf.matmul(input_layer, w) + b
    layer = tf.nn.relu(f)
    return layer

def output_layer(layer, node_num=1024):
    """出力層"""
    w = tf.Variable(tf.zeros([node_num,1]))
    b = tf.Variable(tf.zeros([1]))
    y = tf.matmul(layer, w) + b
    return y

# 隠れ層
hidden_layer = single_layer(X, node_num=64)
# 出力層
y = output_layer(hidden_layer, node_num=64)

# 誤差関数(二乗誤差)
loss = tf.reduce_mean(tf.square(y - t))
# Adam
optimizer = tf.train.AdamOptimizer()
train_step = optimizer.minimize(loss)

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    i = 0
    for _ in range(1000):
        i += 1
        sess.run(train_step, feed_dict={X:formed_x_data,t:formed_y_data})
        if i % 200 == 0:
            train_loss = sess.run(loss, feed_dict={X:formed_x_data,t:formed_y_data})
            print "[Train] step: %d, loss: %f" % (i,train_loss)
            # 予測値のプロット
            predict_y = sess.run(y, feed_dict={X:formed_x_data})
            plt.plot(x_data, predict_y, label="STEP %d" % i)

    # 学習データのプロット
    plt.scatter(x_data, y_data)
    plt.legend()
    plt.show()

実行結果 :

[Train] step: 200, loss: 0.133793
[Train] step: 400, loss: 0.049397
[Train] step: 600, loss: 0.034507
[Train] step: 800, loss: 0.031959
[Train] step: 1000, loss: 0.031614

グラフ :

参考