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

二、效果

TensorFlow实现波士顿房价多元线性回归