初探梯度下降解决线性回归问题

版权声明:如有转载复制请注明出处,博主QQ715608270,欢迎沟通交流! https://blog.csdn.net/qq_41000891/article/details/84501742

线性回归一般用于预测问题,比如股票的涨跌,通过苹果的股票图可以预测其以后的发展。

梯度下降是机器学习中最核心的优化算法。

今天以一个小例子进行一个相对综合的应用,使用梯度下降解决一个线性回归问题,我们使用的是matplotlib这个可视化python包。

此外在学习的过程中,还要注意python2.x和python3.x在一些语法结构上的区别。

 一、TensorFlow中可用的操作


TensorFlow中的基本Operations


 

TensorFlow中的一些等价操作 


查看TensorFlow文档 


 1.可以直接去TensorFlow官网查看文档

 2.可以使用Pyhton自带的help函数,进行解析查看

如下图所示,先引入TensorFlow,然后使用help()

回车后,就会显示出相关的帮助内容: 

二、使用梯度下降解决一个小型线性回归问题 


我们先创建一个LR_using_GD.py文件,并使用Vim进行文件编写。

我们通过以下几步解决线性问题:

  • 1.以y = 0.1 * x + 0.2为初始方程构建经偏差后的随机数据。
  • 2.使用matplotlib将模拟数据进行可视化展示。
  • 3.构建一个线性回归模型。
  • 4.使用梯度下降的优化器优化损失函数,规定学习率为0.5(此处与模型本身有关)
  • 5.创建会话
  • 6.初始化数据流图的所有变量
  • 7.开始训练,规定相关训练步数(20步,由于模型简单,20步就可以的出一个相对不错的训练结果)
  • 8.打印训练后的结果及图像
  • 9.关闭会话(这里可以使用python的上下文管理器with

代码如下,在代码中作了详细的注释:

# -*- coding: UTF-8 -*-
'''
用梯度下降的优化方法来快速解决线性回归问题
'''
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

# 构建数据
points_num = 100
vectors = []
# 用Numpy的正态随机分布函数生成100个点
# 这些带你的(x,y)坐标值对应线性方程 
# 权重(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:展示100个随机数据点
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
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))

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

# 创建会话
sess = tf.Session()

# 初始化数据流图中的所有变量
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:绘制所有的点并且在绘制出最佳拟合的直线
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()

# 关闭会话
sess.close()

运行程序后,首先打印的是第一张图,使我们模拟的数据:

然后打印的是第二张图,可以看到数据和直线进行了很好的拟合:

通过控制台的输出,我们可以看到,模型不断优化的过程:

Weight权重和Bais偏差越来越接近我们的预设函数 y = 0.1 * x + 0.2

这样以来,就完成了模型的训练。

猜你喜欢

转载自blog.csdn.net/qq_41000891/article/details/84501742