7. 简单线性回归
import tensorflow as tf
def regression():
"""
用Tensorflow实现一个简单的线性回归
我们预设一个线性函数然后通过线性回归看看能否得到这个函数对应的参数
预设的函数:y = 0.7 * x + 0.5 (其中0.7和0.5是我们需要通过训练得到的参数,也就是最终需要的得到模型)
"""
# 1. 自己生成一些训练数据,真实项目中这些数据应该是给定的
# 1.1 随机生成100个数作为x的训练数据
x_true = tf.random_normal([100, 1], mean=2.0, stddev=1.5, name="x")
# 1.2 根据x值和预设好的函数来生成100个数作为y的训练数据
# y = 0.7 * x + 0.5 相当于用生成好的100个x每一个都运行一遍该函数得到100个y
y_true = tf.matmul(x_true, [[0.7]]) + 0.5
# 2. 构建线性回归模型,由于我们已经预设了函数模型所以直接知道了模型的大概结构是由一个权重(w)和一个偏置(b)组成
# 真实项目中可能需要分析数据或者自然规律来确定模型的大概结构
# 2.1 创建权重变量,由于权重只有一个所以生成1行1列的随机数
weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=0.1), name="w")
# 2.2 创建偏置变量,由于偏置是相加所以不需要创建矩阵类型的数据,直接随便定义一个数即可
bias = tf.Variable(2.0, name="b")
# 2.3 创建模型,y = weight * x + bias
y_predict = tf.matmul(x_true, weight) + bias
# 3. 构建损失函数,这里取的数均方,也就是每个真实结果与预测结果的差的平方然后这100个平方相加求平均值
# 这样100个训练数据每训练一次得到一个损失值(误差值)
loss = tf.reduce_mean(tf.square(y_true - y_predict))
# 4. 梯度下降优化误差,梯度下降优化器的API的唯一参数就是学习率,一般情况是取0~1的小数,也有取大于1的整数的情况,不过不会太大,学习率相当于学习步长,就是每调整一次参数所调整的幅度
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 初始化变量
init_op = tf.global_variables_initializer()
with tf.Session() as sess:
# 执行初始化变量
sess.run(init_op)
# 循环100次训练,使用同样的100个数据
for i in range(100):
sess.run(train_op)
print("第%d次训练后的权重参数为:%f,偏置参数为:%f" % (i+1, weight.eval(), bias.eval()))
if __name__ == "__main__":
regression()
下面是执行结果:
可以看到第100次的训练结果已经非常接近预设的函数的参数(weight:0.7, bias:0.5)了