Article Outline
Example Python program fit2.py Python version 3.x or newer. To check the Python version use:
python --version
Modules
- import matplotlib
- import tensorflow as tf
- import numpy as np
- import matplotlib.pyplot as plt
Methods
- def fit2(data,itr=1000,alpha=1.0,xmin=-5,xmax=5,cutoff=0.2): # itr 繰り返しの回数、alpha 学習係数、cutoff y の値がこれ以下の部分は近似に使わない
- def model(a,b,c,x): # 1/(1+exp(-a(x-c)) (1+ exp(-b(x-c))))
Code
Python example
# TensorFlow による曲線あてはめ Pattern 2
import matplotlib
# %matplotlib nbagg
# matplotlib.use('nbagg')
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# %matplotlib inline
# y = 1/(1+exp(-a*(x-c)) (1+ exp(-b*(x-c))))という関係式を使って
# 実験用に仮想の x, y のペアデータを生成し、
# TensorFlow で回帰曲線を求めてみたい。
def fit2(data,itr=1000,alpha=1.0,xmin=-5,xmax=5,cutoff=0.2): # itr 繰り返しの回数、alpha 学習係数、cutoff y の値がこれ以下の部分は近似に使わない
def model(a,b,c,x): # 1/(1+exp(-a*(x-c)) (1+ exp(-b*(x-c))))
x_c = tf.sub(x,c) # x - c
tmpA = tf.exp(-tf.mul(a,x_c)) # exp( - a ( x-c) )
tmpB = tf.exp(-tf.mul(b,x_c)) # exp( - b ( x-c) )
tmpB1 = tf.add(1.0, tmpB ) # 1 + exp(- b ( x-c) )
tmpAB = tf.mul(tmpA,tmpB1) # exp(-a*(x-c)) (1+ exp(-b*(x-c)))
ret = tf.div(1.0,tf.add(1.0,tmpAB))
return ret
(x_dataAll,y_dataAll) = data
use = y_dataAll >= cutoff
x_data=x_dataAll[use]
y_data=y_dataAll[use]
x_dataRest = x_dataAll[~use]
y_dataRest = y_dataAll[~use]
num = len(x_data)
a = tf.Variable([2.])
b = tf.Variable([6.])
c = tf.Variable([0.])
x = tf.placeholder(tf.float32, shape=(len(x_data)))
y = tf.placeholder(tf.float32, shape=(len(y_data)))
# 目的関数の設定。平均自乗誤差の最小化
mserror = tf.reduce_mean(tf.square(model(a,b,c,x) - y))
# 最適化手法の設定。最急降下法 alpha はいわゆる学習係数 適当
optimizer = tf.train.GradientDescentOptimizer(alpha)
# つまり平均自乗誤差を最急降下で減少させる試みを train と名付ける
train = optimizer.minimize(mserror)
# 学習を始めるためにやっておかねばならないおまじない(変数の初期化)を init とおく,
init = tf.initialize_all_variables()
# セッションを生成し、init つまり変数の初期化を実行
with tf.Session() as sess:
sess.run(init)
# モデル当てはめのステップを繰り返し実行
for step in range(itr+1):
sess.run(train, feed_dict = {x: x_data, y: y_data})
if step % (itr/10) == 0: # 100回(繰り返し回数の10分の1)毎に推定された係数値を表示
da = sess.run(a)[0]
db = sess.run(b)[0]
dc = sess.run(c)[0]
er = sess.run(mserror,feed_dict = {x:x_data,y:y_data})
print("%5d:(a,b,c,err) = (%10.4f,%10.4f, %10.4f, %10.4f)"%(step,da,db,dc,er) )
A = sess.run(a)
B = sess.run(b)
C = sess.run(c)
plt.gca().set_aspect('equal',adjustable='box')
plt.plot(x_data,y_data,".",color="green")
plt.plot(x_dataRest,y_dataRest,"-",color="gray")
plt.hold(True);
xd = np.linspace(xmin, xmax, num)
yd = 1.0/(1.0+np.exp(-A * (xd - C))*(1.0+np.exp(-B * (xd - C))))
plt.plot(xd,yd,"-")
Useful Links
- Articles: https://python-commandments.org/
- Python shell: https://bsdnerds.org/learn-python/
- Tutorial: https://pythonprogramminglanguage.com/