TensorFlowでカスみたいな線形回帰(Linear Regression)

TensorFlowでカスみたいな線形回帰をやってみます。ダミーデータを作り、回帰直線が「Y = 2X + 3」になるようにがんばってみます :muscle: 

```py3:linearRegression.py
import tensorflow as tf
import numpy

#学習率
learning_rate = 0.01
training_epochs = 1000
display_step = 100

# -1から1を100等分した数値が入った配列
train_X = numpy.linspace(-1, 1, 100)

# shapeで配列の次元数を取得
# 誤差を生成
err = numpy.random.randn(*train_X.shape) * 0.5
# Y = 2X + 3に誤差を加える
train_Y = 2 * train_X + 3 + err

n_samples = train_X.shape[0]

#モデルを作成(placeholderのインスタンスを作成)
X = tf.placeholder("float")
Y = tf.placeholder("float")

#重み
W = tf.Variable(numpy.random.randn(), name="weight")
#バイアス
b = tf.Variable(numpy.random.randn(), name="bias")

# Y = X * W + b
activation = tf.add(tf.mul(X, W), b)

#目的関数(二乗誤差の平均)
cost = tf.reduce_sum(tf.pow(activation - Y, 2) / (2 * n_samples))
#最急降下法
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)


init = tf.initialize_all_variables()

with tf.Session() as sess:
  #セッション開始
  sess.run(init)

  for epoch in range(training_epochs):
    for(x, y) in zip(train_X, train_Y):
      # placeholderでX,Yを定義したのでfeed_dictで渡して、sessionを実行
      sess.run(optimizer, feed_dict={X: x, Y: y})

    if epoch % display_step == 0:
      print("Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(sess.run(cost, feed_dict={X: train_X, Y:train_Y})), \
              "W=", sess.run(W), "b=", sess.run(b))

  print("Optimization Finished!")
  training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
  print("Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n')
```

#データを作る
##linspace

[numpy.linspace — NumPy v1.10 Manual](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.linspace.html#numpy.linspace)

##shape

[numpy.ndarray.shape — NumPy v1.10 Manual](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ndarray.shape.html)

##randn
[numpy.matlib.randn — NumPy v1.10 Manual](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.matlib.randn.html)

#モデルの作成

##reduce_sum
各行列の要素を足し合わせ0階テンソルを返す。
[Math reduce_sum](https://www.tensorflow.org/versions/r0.7/api_docs/python/math_ops.html#reduce_sum)



#学習する(Running Graphs)
##session
[Running Graphs session](https://www.tensorflow.org/versions/r0.7/api_docs/python/client.html#Session)

##zip
2つの変数を同時に繰り返す。
[forループで便利な zip, enumerate関数 | Python Snippets](http://python.civic-apps.com/zip-enumerate/)

#学習結果
```py3
Epoch: 0001 cost= 7.190456867 W= -1.00389 b= -0.309475
Epoch: 0101 cost= 1.629324675 W= -0.168345 b= 1.81013
Epoch: 0201 cost= 0.614938080 W= 0.427797 b= 2.58925
Epoch: 0301 cost= 0.344420433 W= 0.852618 b= 2.87544
Epoch: 0401 cost= 0.240160167 W= 1.15516 b= 2.98041
Epoch: 0501 cost= 0.191739887 W= 1.37056 b= 3.01882
Epoch: 0601 cost= 0.167796254 W= 1.52389 b= 3.03281
Epoch: 0701 cost= 0.155743539 W= 1.63303 b= 3.03784
Epoch: 0801 cost= 0.149647340 W= 1.71071 b= 3.03962
Epoch: 0901 cost= 0.146560609 W= 1.76599 b= 3.04021
Optimization Finished!
Training cost= 0.145008 W= 1.805 b= 3.04038
```
costが小さくなり、「Y = 2X + 3」に値が近づいているのがわかりました :smile: 

#参考
[TensorFlowで線形回帰を実装してみる - もふもふ技術部](http://tech.mof-mof.co.jp/blog/tensorflow-linear-regression.html)
[TensorFlow-Examples/linear_regression.py at master · aymericdamien/TensorFlow-Examples](https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/2%20-%20Basic%20Classifiers/linear_regression.py)
[TensorFlowを算数で理解する - Qiita](http://qiita.com/icoxfog417/items/fb5c24e35a849f8e2c5d#%E6%BC%94%E7%AE%97)