TensorFlow实践(5)——多元线性回归模型

(一)前 言

一元线性回归是一个主要影响因素作为自变量来解释因变量的变化,但在现实问题中,因变量的变化往往受到多个重要因素的影响,这时就需要两个或两个以上的影响因素作为自变量来解释因变量的变化,这便是多元回归,而当多个自变量与因变量之间是线性关系时,所进行的回归分析就是多元线性回归。多元线性回归的一般形式为:
TensorFlow实践(5)——多元线性回归模型
同一元线性回归一样,我们要在误差平方和最小的情况下,使用最小二乘法求解参数,下面我们通过一个预测房屋租赁价格的实例来透彻理解多元线性回归模型。

(二)数据展示

在此例中房屋租赁价格为因变量,房屋面积和房屋数量为自变量,由4.1可知,此处我们要建立一个二元线性回归模型,首先构建训练数据集,并对其进行可视化。

构建数据集
x1_data = np.random.randn(100).astype(np.float32)# 生成100个[0,1)间的随机数
x2_data = np.random.randn(100).astype(np.float32)# 房屋面积
y_data = x1_data * 2 + x2_data * 3 + 1.5 # 房屋价格

TensorFlow实践(5)——多元线性回归模型
绘图代码:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# 导入3D绘图库
x1_data = np.random.randn(100).astype(np.float32)# 生成100个[0,1)间的随机数
x2_data = np.random.randn(100).astype(np.float32)
y_data = x1_data+ x2_data + 1.5 
x, y, z = x1_data, x2_data, y_data
ax = plt.subplot(111, projection='3d')# 创建一个三维的绘图工程
# 将数据点分成三部分画,在颜色上有区分度
ax.scatter(x[:30], y[:30], z[:30], c='g',s = 125)  # 绘制数据点
ax.scatter(x[30:60], y[30:60], z[30:60], c='r',s = 125)
ax.scatter(x[60:100], y[60:100], z[60:100], c='b',s = 125)
ax.set_zlabel('Price')# 设置坐标轴
ax.set_ylabel('Square')
ax.set_xlabel('Amount')
plt.show()

(三)模型的TensorFlow实现

(1)模型参数设置

# 设置学习率
learning_rate = 0.01
# 设置最小误差
threshold = 0.01

(2)输入数据

# 构造训练数据
x1_data = np.random.randn(100).astype(np.float32)
x2_data = np.random.randn(100).astype(np.float32)
y_data = 2 * x1_data + 3 * x2_data + 1

(3)构建模型

weight1 = tf.Variable(1.)
weight2 = tf.Variable(1.)
bias = tf.Variable(1.)
x1_ = tf.placeholder(tf.float32)
x2_ = tf.placeholder(tf.float32)
y_ = tf.placeholder(tf.float32)
# 构建模型Y = weight1 * X1 + weight2 * X2 + Bias
y_model = tf.add(tf.add(tf.multiply(weight1, x1_), tf.multiply(weight2, x2_)), bias)

(4)定义损失函数

# 采用均方差做为损失函数
loss = tf.reduce_mean(tf.pow((y_model - y_), 2))

(5)选择优化器及定义训练操作

# 使用随机梯度下降算法
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

(6)创建会话进行训练

with tf.Session() ,as ,sess:
# 参数初始化
    sess.run(tf.global_variables_initializer())
# 开始训练
    print("Start training!")
    flag = 1
    while(flag):
# 使用zip进行嵌套,表示三个参数
         for (x,y) in zip(zip(x1_data, x2_data), y_data):
              sess.run(train_op, feed_dict = {x1_ : x[0],x2_ : x[1],y_ : y})
# 当训练损失低于threshold时停止训练
              if sess.run(loss, feed_dict = {x1_ : x[0],x2_ : x[1],y_ : y}) < threshold:
                  flag = 0
	w1 = sess.run(weight1)
	w2 = sess.run(weight2)
	b = sess.run(bias)
	print('n')
	print('线性回归方程为:')
	print("Y = %f * X1 + %f * X2 + %f " % (w1, w2, b))
	print('n')
	# 绘制模型图
	fig = plt.figure()
	ax = Axes3D(fig)
	X, Y = np.meshgrid(x1_data, x2_data)
	Z = sess.run(weight1) * (X) + sess.run(weight2) * (Y) + sess.run(bias)
	ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = plt.cm.hot)
	ax.contourf(X, Y, Z, zdir = 'z', offset = -1, camp = plt.cm.hot)
	ax.set_title('analysis')
	ax.set_ylabel('salary')
	ax.set_xlabel('age')
	ax.set_zlabel('amount')
	ax.set_zlim(-1, 1)
	plt.show()

(7)训练结果

在学习率为0.01时,经过若干次迭代后,总体误差小于0.01,最终得到的模型为:

Y = 1.894042 * X1 + 2.866999 * X2 + 1.003049

实际模型为:

Y = 2 * X1 + 3 * X2 + 1

进行可视化,得:
TensorFlow实践(5)——多元线性回归模型

(8)完整代码

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D#调用matplotlib的3D绘图功能
# 设置学习率
learning_rate = 0.01
# 设置最小误差
threshold = 0.01
# 构造训练数据
x1_data = np.random.randn(100).astype(np.float32)
x2_data = np.random.randn(100).astype(np.float32)
y_data = 2 * x1_data + 3 * x2_data + 1
# 构建模型
weight1 = tf.Variable(1.)
weight2 = tf.Variable(1.)
bias = tf.Variable(1.)
x1_ = tf.placeholder(tf.float32)
x2_ = tf.placeholder(tf.float32)
y_ = tf.placeholder(tf.float32)
# 构建模型Y = weight1 * X1 + weight2 * X2 + Bias
y_model = tf.add(tf.add(tf.multiply(weight1, x1_), tf.multiply(weight2, x2_)), bias)
# 采用均方差做为损失函数
loss = tf.reduce_mean(tf.pow((y_model - y_), 2))
# 使用随机梯度下降算法
train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
with tf.Session() as sess:
# 参数初始化
    sess.run(tf.global_variables_initializer())
# 开始训练
    print("Start training!")
    flag = 1
    while(flag):
# 使用zip进行嵌套,表示三个参数
         for (x,y) in zip(zip(x1_data, x2_data), y_data):
              sess.run(train_op, feed_dict = {x1_ : x[0],x2_ : x[1],y_ : y})
# 当训练损失低于threshold时停止训练
              if sess.run(loss, feed_dict = {x1_ : x[0],x2_ : x[1],y_ : y}) < threshold:
                  flag = 0
	w1 = sess.run(weight1)
	w2 = sess.run(weight2)
	b = sess.run(bias)
	print('n')
	print('线性回归方程为:')
	print("Y = %f * X1 + %f * X2 + %f " % (w1, w2, b))
	print('n')
	# 绘制模型图
	fig = plt.figure()
	ax = Axes3D(fig)
	X, Y = np.meshgrid(x1_data, x2_data)
	Z = sess.run(weight1) * (X) + sess.run(weight2) * (Y) + sess.run(bias)
	ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = plt.cm.hot)
	ax.contourf(X, Y, Z, zdir = 'z', offset = -1, camp = plt.cm.hot)
	ax.set_title('analysis')
	ax.set_ylabel('salary')
	ax.set_xlabel('age')
	ax.set_zlabel('amount')
	ax.set_zlim(-1, 1)
	plt.show()

(四)总 结

本文通过建立二元线性回归模型解决了房屋租赁价格的问题,给出了使用TensorFlow建立多元线性回归模型的一般方法,读者遇到其他需要多元线性回归模型解决的问题时,可仿照上述过程进行代码修改即可,有任何疑问请在评论区留言,我会尽快回复,谢谢支持!
下一节:TensorFlow实践(6)——线性回归模型项目实践