用tensorflow来做回归分析,基于梯度下降法
这里以一元回归分析为例子来说明如何用tensorflow实现回归分析。
1、产生数据
采用随机的方式来产生。
先基于均值为0,方差为0.9的正态分布产生随机数X,再通过线性变换产生Y,再添加一个均值为0,方差为0.5的噪声。这样便得到数据X和Y。
import numpy as np
#产生100条数据
num_puntos = 100
conjunto_puntos = []
for i in range(num_puntos):
x1= np.random.normal(0.0, 0.9)
y1= x1 * 0.1 + 0.3 + np.random.normal(0.0, 0.05)
conjunto_puntos.append([x1, y1])
x_data = [v[0] for v in conjunto_puntos]
y_data = [v[1] for v in conjunto_puntos]
画出散点图
import matplotlib.pyplot as plt
#Graphic display
plt.plot(x_data, y_data, 'ro')
plt.legend()
plt.show()
定义模型
import tensorflow as tf
#定义W和b,这里的W是一个数,取值范围为-1到1,b为一个数
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
#模型
y = W * x_data + b
#损失函数
loss = tf.reduce_mean(tf.square(y - y_data))
#优化,基于梯度下降法的优化,步长为0.5
optimizer = tf.train.GradientDescentOptimizer(0.5)
#对损失函数优化
train = optimizer.minimize(loss)
#初始化
init = tf.global_variables_initializer()
#启动图计算
sess = tf.Session()
sess.run(init)
迭代计算,迭代100步,每10次输出一个结果
for step in range(100):
sess.run(train)
if step % 10 == 0:
print(step, sess.run(W), sess.run(b))
结果:
0 [ 0.13928029] [ 0.30465567]
10 [ 0.10003368] [ 0.29671374]
20 [ 0.10003368] [ 0.29671374]
30 [ 0.10003368] [ 0.29671374]
40 [ 0.10003368] [ 0.29671374]
50 [ 0.10003368] [ 0.29671374]
60 [ 0.10003368] [ 0.29671374]
70 [ 0.10003368] [ 0.29671374]
80 [ 0.10003368] [ 0.29671374]
90 [ 0.10003368] [ 0.29671374]
画出散点图和回归线
plt.plot(x_data, y_data, 'ro')
plt.plot(x_data, sess.run(W) * x_data + sess.run(b))
plt.legend()
plt.show()
完整的代码见github: https://github.com/zhangdm/machine-learning-summary/tree/master/tensorflow/回归