TensorFlow实现波士顿房价多元线性回归
一、代码
# coding=utf-8
"""
CRIM 城镇人均犯罪率
ZN 占地25000平方英尺以上的住宅用地比例
INDUS 每个城镇的非零售商业用地比例
CHAS 查尔斯河(Charles River)变量(若土地位于河流边界,则为 1;否则为 0)
NOX 一氧化氮浓度(每千万)
RM 每个寓所的平均房间数量
AGE 1940 年以前建成的自住单元比例
DIS 到5个波士顿就业中心的加权距离
RAD 径向高速公路可达性指数
TAX 每万美元的全价值物业税税率
PTRATIO 镇小学老师比例
B 1000(Bk-0.63)²,其中 Bk 是城镇黑人的比例
LSTAT 低地位人口的百分比
MEDV 1000美元自有住房的中位值
"""
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
def normalize(X):
"""
归一化输入数据
"""
mean = np.mean(X, axis=0) # 均值
std = np.std(X, axis=0) # 标准差
X = (X - mean) / std # Z-Score归一化,符合正态分布
return X
# 读取数据集
boston = tf.contrib.learn.datasets.load_dataset('boston')# 使用Tensorflow contrib数据集加载
X_train, Y_train = boston.data, boston.target
X_train = normalize(X_train) # 进行归一化
m = len(X_train) # 样本数量
n = 13 # 特征数
X = tf.placeholder(tf.float32, name='X', shape=[m,n]) # 占位符
Y = tf.placeholder(tf.float32, name='Y')
b = tf.Variable(0.0) # 偏置
w = tf.Variable(tf.random_normal([n,1])) # 权重,用随机数初始化
Y_hat = tf.matmul(X, w) + b # 线性回归模型(矩阵乘法)
loss = tf.reduce_mean(tf.square(Y - Y_hat, name='loss')) + 0.6 * tf.nn.l2_loss(w) # 定义损失函数
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(loss) # 简单梯度下降算法优化器,学习速率0.01
# 训练
init = tf.global_variables_initializer() # 初始化变量
total = []
with tf.Session() as sess:
sess.run(init)
# 迭代100次
for i in range(100):
_, l = sess.run([optimizer, loss], feed_dict={X: X_train, Y: Y_train})
total.append(l)
print('Epoch {0}: Loss {1}'.format(i, l))
b_value, w_value = sess.run([b, w]) # 计算偏置与权值
# 评估
N = 500
X_new = X_train [N,:]
Y_pred = (np.matmul(X_new, w_value) + b_value).round(1)
print('Predicted value: ${0} Actual value: ${1}'.format(Y_pred[0]*1000, Y_train[N]*1000) , '\nDone')
plt.plot(total)
plt.show()
Predicted value: $22600.0 Actual value: $16800.0