梯度下降法解决线性回归

'''
用梯度下降的优化方法来快速解决线性回归问题
'''

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 构建数据
points_num = 100
vectors = []
# 用numpy的正态随机分布函数生成100个点,这些点的(x,y)坐标值对应线性方程y = 0.1*x + 0.2
# 权重(Weight)是0.1,偏差(Bias)是0.2
for i in range(points_num):
    x1 = np.random.normal(0.0, 0.66)
    y1 = 0.1 * x1 + 0.2 + np.random.normal(0.0, 0.04)
    vectors.append([x1,y1])

x_data = [v[0] for v in vectors]  # 真实的点的x坐标
y_data = [v[1] for v in vectors]  # 真实的点的y坐标
# 图像1 :展示所有的随机数据点
plt.plot(x_data, y_data, 'r*', label="Original data")
plt.title("Linear Regression using Gradient Descent")
plt.legend()
plt.show()

# 构建线性回归模型
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))  # 初始化Weight
# tf.random_uniform((4, 4), minval=low, maxval=high)返回4*4的矩阵,产生于low和high之间,产生的值是均匀分布的。

b = tf.Variable(tf.zeros([1]))  # 初始化Bias
y = W * x_data + b  # 模型计算出的y

# 定义 loss function(损失函数) 或 cost function(代价函数)
# 对 Tensor 的所有维度 计算((y - y_data)^2)之和 / N
loss = tf.reduce_mean(tf.square(y - y_data))
# tf.reduce_mean 计算所有维度的平均值

# 用梯度下降的优化器来优化 loss function
optimizer = tf.train.GradientDescentOptimizer(0.5)  # 设置学习率 0.5
train = optimizer.minimize(loss)

# 创建会话
with tf.Session() as sess:
    init = tf.global_variables_initializer()  # 初始化数据流图中的所有变量
    sess.run(init)
    # 训练20步
    for step in range(20):
        sess.run(train)  # 优化每一步
        print("Step=%d, Loss=%f, [Weight=%f Bias=%f]" % (step, sess.run(loss), sess.run(W), sess.run(b)))
    # 图像2: 绘制所有的点并且绘制出最佳拟合的直线
    x_data = [v[0] for v in vectors]  # 真实的点的x坐标
    y_data = [v[1] for v in vectors]  # 真实的点的y坐标
    # 图像1 :展示所有的随机数据点
    plt.plot(x_data, y_data, 'r*', label="Original data")
    plt.title("Linear Regression using Gradient Descent")
    plt.plot(x_data, sess.run(W) * x_data + sess.run(b), label="Fitted line")
    plt.legend()
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()

猜你喜欢

转载自blog.csdn.net/zhaohaibo_/article/details/80629304