Python和Numpy构建神经网络模型预测波士顿房价

代码所需文件housing.data
链接:https://pan.baidu.com/s/1oZbuUAtnEFf44w2tkUorpg
提取码:ntr1
构建一个基于下图13个因素进行房价预测的模型
Python和Numpy构建神经网络模型预测波士顿房价_第1张图片

# 导入需要用到的package
import numpy as np
import matplotlib.pyplot as plt


def load_data():
    # 从文件导入数据
    datafile = './housing.data'
    data = np.fromfile(datafile, sep=' ')

    # 每条数据包括14项,其中前面13项是影响因素,第14项是相应的房屋价格中位数
    feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', \
                      'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
    feature_num = len(feature_names)

    # 将原始数据进行Reshape,变成[N, 14]这样的形状
    data = data.reshape([data.shape[0] // feature_num, feature_num])

    # 将原数据集拆分成训练集和测试集
    # 这里使用80%的数据做训练,20%的数据做测试
    # 测试集和训练集必须是没有交集的
    ratio = 0.8
    offset = int(data.shape[0] * ratio)
    training_data = data[:offset]

    # 计算train数据集的最大值,最小值,平均值
    maximums, minimums, avgs = training_data.max(axis=0),\
                               training_data.min(axis=0),\
                               training_data.sum(axis=0) / training_data.shape[0]

    # 对数据进行归一化处理
    for i in range(feature_num):
        #print(maximums[i], minimums[i], avgs[i])
        data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])

    # 训练集和测试集的划分比例
    training_data = data[:offset]
    test_data = data[offset:]
    return training_data, test_data


class Network(object):
    def __init__(self, num_of_weights):
        # 随机产生w的初始值
        # 为了保持程序每次运行结果的一致性,此处设置固定的随机数种子
        # np.random.seed(0)
        self.w = np.random.randn(num_of_weights, 1)
        self.b = 0.

    def forward(self, x):
        z = np.dot(x, self.w) + self.b
        return z

    def loss(self, z, y):
        error = z - y
        num_samples = error.shape[0]
        cost = error * error
        cost = np.sum(cost) / num_samples
        return cost

    def gradient(self, x, y):
        z = self.forward(x)
        N = x.shape[0]
        gradient_w = 1. / N * np.sum((z - y) * x, axis=0)
        gradient_w = gradient_w[:, np.newaxis]
        gradient_b = 1. / N * np.sum(z - y)
        return gradient_w, gradient_b

    def update(self, gradient_w, gradient_b, eta=0.01):
        self.w = self.w - eta * gradient_w
        self.b = self.b - eta * gradient_b

    def train(self, training_data, num_epoches, batch_size=10, eta=0.01):
        n = len(training_data)
        losses = []
        for epoch_id in range(num_epoches):
            # 在每轮迭代开始之前,将训练数据的顺序随机的打乱,
            # 然后再按每次取batch_size条数据的方式取出
            np.random.shuffle(training_data)
            # 将训练数据进行拆分,每个mini_batch包含batch_size条的数据
            mini_batches = [training_data[k:k + batch_size] for k in range(0, n, batch_size)]
            for iter_id, mini_batch in enumerate(mini_batches):
                # print(self.w.shape)
                # print(self.b)
                x = mini_batch[:, :-1]
                y = mini_batch[:, -1:]
                a = self.forward(x)
                loss = self.loss(a, y)
                gradient_w, gradient_b = self.gradient(x, y)
                self.update(gradient_w, gradient_b, eta)
                losses.append(loss)
                print('Epoch {:3d} / iter {:3d}, loss = {:.4f}'.format(epoch_id, iter_id, loss))

        return losses


# 获取数据
train_data, test_data = load_data()

# 创建网络
net = Network(13)
# 启动训练
losses = net.train(train_data, num_epoches=50, batch_size=100, eta=0.1)

# 画出损失函数的变化趋势
plot_x = np.arange(len(losses))
plot_y = np.array(losses)
plt.plot(plot_x, plot_y)
plt.show()

运行结果:
Python和Numpy构建神经网络模型预测波士顿房价_第2张图片

Epoch   0 / iter   0, loss = 0.3777
Epoch   0 / iter   1, loss = 0.3285
Epoch   0 / iter   2, loss = 0.2757
Epoch   0 / iter   3, loss = 0.3729
Epoch   0 / iter   4, loss = 0.1333
Epoch   1 / iter   0, loss = 0.3939
Epoch   1 / iter   1, loss = 0.2654
Epoch   1 / iter   2, loss = 0.2978
Epoch   1 / iter   3, loss = 0.3355
Epoch   1 / iter   4, loss = 0.6185
Epoch   2 / iter   0, loss = 0.4056
Epoch   2 / iter   1, loss = 0.2857
Epoch   2 / iter   2, loss = 0.2786
Epoch   2 / iter   3, loss = 0.2712
Epoch   2 / iter   4, loss = 0.5689
Epoch   3 / iter   0, loss = 0.2229
Epoch   3 / iter   1, loss = 0.3562
Epoch   3 / iter   2, loss = 0.3143
Epoch   3 / iter   3, loss = 0.3225
Epoch   3 / iter   4, loss = 0.0956
Epoch   4 / iter   0, loss = 0.3202
Epoch   4 / iter   1, loss = 0.2770
Epoch   4 / iter   2, loss = 0.3372
Epoch   4 / iter   3, loss = 0.2469
Epoch   4 / iter   4, loss = 0.1560
Epoch   5 / iter   0, loss = 0.2791
Epoch   5 / iter   1, loss = 0.2548
Epoch   5 / iter   2, loss = 0.3007
Epoch   5 / iter   3, loss = 0.3109
Epoch   5 / iter   4, loss = 0.1631
Epoch   6 / iter   0, loss = 0.3691
Epoch   6 / iter   1, loss = 0.3011
Epoch   6 / iter   2, loss = 0.2135
Epoch   6 / iter   3, loss = 0.2157
Epoch   6 / iter   4, loss = 0.4304
Epoch   7 / iter   0, loss = 0.2703
Epoch   7 / iter   1, loss = 0.2913
Epoch   7 / iter   2, loss = 0.2247
Epoch   7 / iter   3, loss = 0.2806
Epoch   7 / iter   4, loss = 0.3282
Epoch   8 / iter   0, loss = 0.2186
Epoch   8 / iter   1, loss = 0.2956
Epoch   8 / iter   2, loss = 0.2893
Epoch   8 / iter   3, loss = 0.2334
Epoch   8 / iter   4, loss = 0.1080
Epoch   9 / iter   0, loss = 0.2720
Epoch   9 / iter   1, loss = 0.2500
Epoch   9 / iter   2, loss = 0.2554
Epoch   9 / iter   3, loss = 0.2230
Epoch   9 / iter   4, loss = 0.3167
Epoch  10 / iter   0, loss = 0.2516
Epoch  10 / iter   1, loss = 0.2183
Epoch  10 / iter   2, loss = 0.2480
Epoch  10 / iter   3, loss = 0.2532
Epoch  10 / iter   4, loss = 0.2529
Epoch  11 / iter   0, loss = 0.2471
Epoch  11 / iter   1, loss = 0.1995
Epoch  11 / iter   2, loss = 0.2431
Epoch  11 / iter   3, loss = 0.2603
Epoch  11 / iter   4, loss = 0.0497
Epoch  12 / iter   0, loss = 0.2953
Epoch  12 / iter   1, loss = 0.2202
Epoch  12 / iter   2, loss = 0.1838
Epoch  12 / iter   3, loss = 0.2122
Epoch  12 / iter   4, loss = 0.4517
Epoch  13 / iter   0, loss = 0.2460
Epoch  13 / iter   1, loss = 0.2652
Epoch  13 / iter   2, loss = 0.1917
Epoch  13 / iter   3, loss = 0.1824
Epoch  13 / iter   4, loss = 0.5421
Epoch  14 / iter   0, loss = 0.2678
Epoch  14 / iter   1, loss = 0.1879
Epoch  14 / iter   2, loss = 0.2311
Epoch  14 / iter   3, loss = 0.1936
Epoch  14 / iter   4, loss = 0.0858
Epoch  15 / iter   0, loss = 0.2504
Epoch  15 / iter   1, loss = 0.2325
Epoch  15 / iter   2, loss = 0.1389
Epoch  15 / iter   3, loss = 0.2258
Epoch  15 / iter   4, loss = 0.3085
Epoch  16 / iter   0, loss = 0.1968
Epoch  16 / iter   1, loss = 0.2143
Epoch  16 / iter   2, loss = 0.1871
Epoch  16 / iter   3, loss = 0.2282
Epoch  16 / iter   4, loss = 0.0626
Epoch  17 / iter   0, loss = 0.2001
Epoch  17 / iter   1, loss = 0.2177
Epoch  17 / iter   2, loss = 0.1988
Epoch  17 / iter   3, loss = 0.1888
Epoch  17 / iter   4, loss = 0.1423
Epoch  18 / iter   0, loss = 0.2279
Epoch  18 / iter   1, loss = 0.2517
Epoch  18 / iter   2, loss = 0.1425
Epoch  18 / iter   3, loss = 0.1638
Epoch  18 / iter   4, loss = 0.1511
Epoch  19 / iter   0, loss = 0.2041
Epoch  19 / iter   1, loss = 0.1792
Epoch  19 / iter   2, loss = 0.1684
Epoch  19 / iter   3, loss = 0.2202
Epoch  19 / iter   4, loss = 0.1024
Epoch  20 / iter   0, loss = 0.1829
Epoch  20 / iter   1, loss = 0.1547
Epoch  20 / iter   2, loss = 0.1689
Epoch  20 / iter   3, loss = 0.2449
Epoch  20 / iter   4, loss = 0.1568
Epoch  21 / iter   0, loss = 0.1654
Epoch  21 / iter   1, loss = 0.1765
Epoch  21 / iter   2, loss = 0.1631
Epoch  21 / iter   3, loss = 0.2279
Epoch  21 / iter   4, loss = 0.1282
Epoch  22 / iter   0, loss = 0.1716
Epoch  22 / iter   1, loss = 0.1853
Epoch  22 / iter   2, loss = 0.2120
Epoch  22 / iter   3, loss = 0.1486
Epoch  22 / iter   4, loss = 0.1048
Epoch  23 / iter   0, loss = 0.1944
Epoch  23 / iter   1, loss = 0.1901
Epoch  23 / iter   2, loss = 0.1447
Epoch  23 / iter   3, loss = 0.1686
Epoch  23 / iter   4, loss = 0.1152
Epoch  24 / iter   0, loss = 0.1904
Epoch  24 / iter   1, loss = 0.1510
Epoch  24 / iter   2, loss = 0.1516
Epoch  24 / iter   3, loss = 0.1830
Epoch  24 / iter   4, loss = 0.4108
Epoch  25 / iter   0, loss = 0.2076
Epoch  25 / iter   1, loss = 0.1427
Epoch  25 / iter   2, loss = 0.2165
Epoch  25 / iter   3, loss = 0.0994
Epoch  25 / iter   4, loss = 0.0347
Epoch  26 / iter   0, loss = 0.1714
Epoch  26 / iter   1, loss = 0.1893
Epoch  26 / iter   2, loss = 0.1221
Epoch  26 / iter   3, loss = 0.1699
Epoch  26 / iter   4, loss = 0.0563
Epoch  27 / iter   0, loss = 0.2228
Epoch  27 / iter   1, loss = 0.1105
Epoch  27 / iter   2, loss = 0.1266
Epoch  27 / iter   3, loss = 0.1767
Epoch  27 / iter   4, loss = 0.1282
Epoch  28 / iter   0, loss = 0.1914
Epoch  28 / iter   1, loss = 0.1426
Epoch  28 / iter   2, loss = 0.1306
Epoch  28 / iter   3, loss = 0.1622
Epoch  28 / iter   4, loss = 0.0444
Epoch  29 / iter   0, loss = 0.1888
Epoch  29 / iter   1, loss = 0.1400
Epoch  29 / iter   2, loss = 0.1674
Epoch  29 / iter   3, loss = 0.1185
Epoch  29 / iter   4, loss = 0.0511
Epoch  30 / iter   0, loss = 0.1351
Epoch  30 / iter   1, loss = 0.1429
Epoch  30 / iter   2, loss = 0.1674
Epoch  30 / iter   3, loss = 0.1355
Epoch  30 / iter   4, loss = 0.6274
Epoch  31 / iter   0, loss = 0.1871
Epoch  31 / iter   1, loss = 0.1476
Epoch  31 / iter   2, loss = 0.1210
Epoch  31 / iter   3, loss = 0.1181
Epoch  31 / iter   4, loss = 0.2849
Epoch  32 / iter   0, loss = 0.1416
Epoch  32 / iter   1, loss = 0.1233
Epoch  32 / iter   2, loss = 0.1400
Epoch  32 / iter   3, loss = 0.1589
Epoch  32 / iter   4, loss = 0.2137
Epoch  33 / iter   0, loss = 0.1274
Epoch  33 / iter   1, loss = 0.1675
Epoch  33 / iter   2, loss = 0.1450
Epoch  33 / iter   3, loss = 0.1224
Epoch  33 / iter   4, loss = 0.1024
Epoch  34 / iter   0, loss = 0.1329
Epoch  34 / iter   1, loss = 0.1472
Epoch  34 / iter   2, loss = 0.1628
Epoch  34 / iter   3, loss = 0.0992
Epoch  34 / iter   4, loss = 0.3712
Epoch  35 / iter   0, loss = 0.1419
Epoch  35 / iter   1, loss = 0.1507
Epoch  35 / iter   2, loss = 0.1386
Epoch  35 / iter   3, loss = 0.1102
Epoch  35 / iter   4, loss = 0.0792
Epoch  36 / iter   0, loss = 0.1259
Epoch  36 / iter   1, loss = 0.1685
Epoch  36 / iter   2, loss = 0.1326
Epoch  36 / iter   3, loss = 0.0859
Epoch  36 / iter   4, loss = 0.4206
Epoch  37 / iter   0, loss = 0.1141
Epoch  37 / iter   1, loss = 0.1527
Epoch  37 / iter   2, loss = 0.1300
Epoch  37 / iter   3, loss = 0.1128
Epoch  37 / iter   4, loss = 0.0758
Epoch  38 / iter   0, loss = 0.1438
Epoch  38 / iter   1, loss = 0.1239
Epoch  38 / iter   2, loss = 0.0929
Epoch  38 / iter   3, loss = 0.1391
Epoch  38 / iter   4, loss = 0.1156
Epoch  39 / iter   0, loss = 0.1265
Epoch  39 / iter   1, loss = 0.0943
Epoch  39 / iter   2, loss = 0.1143
Epoch  39 / iter   3, loss = 0.1518
Epoch  39 / iter   4, loss = 0.1370
Epoch  40 / iter   0, loss = 0.1220
Epoch  40 / iter   1, loss = 0.1379
Epoch  40 / iter   2, loss = 0.1167
Epoch  40 / iter   3, loss = 0.1046
Epoch  40 / iter   4, loss = 0.0347
Epoch  41 / iter   0, loss = 0.1424
Epoch  41 / iter   1, loss = 0.1198
Epoch  41 / iter   2, loss = 0.0876
Epoch  41 / iter   3, loss = 0.1216
Epoch  41 / iter   4, loss = 0.0984
Epoch  42 / iter   0, loss = 0.1110
Epoch  42 / iter   1, loss = 0.0929
Epoch  42 / iter   2, loss = 0.1213
Epoch  42 / iter   3, loss = 0.1384
Epoch  42 / iter   4, loss = 0.0717
Epoch  43 / iter   0, loss = 0.1180
Epoch  43 / iter   1, loss = 0.1312
Epoch  43 / iter   2, loss = 0.0810
Epoch  43 / iter   3, loss = 0.1263
Epoch  43 / iter   4, loss = 0.0319
Epoch  44 / iter   0, loss = 0.1297
Epoch  44 / iter   1, loss = 0.1299
Epoch  44 / iter   2, loss = 0.0984
Epoch  44 / iter   3, loss = 0.0881
Epoch  44 / iter   4, loss = 0.0838
Epoch  45 / iter   0, loss = 0.1049
Epoch  45 / iter   1, loss = 0.1272
Epoch  45 / iter   2, loss = 0.0955
Epoch  45 / iter   3, loss = 0.1153
Epoch  45 / iter   4, loss = 0.0400
Epoch  46 / iter   0, loss = 0.1068
Epoch  46 / iter   1, loss = 0.0776
Epoch  46 / iter   2, loss = 0.1252
Epoch  46 / iter   3, loss = 0.1186
Epoch  46 / iter   4, loss = 0.1686
Epoch  47 / iter   0, loss = 0.0918
Epoch  47 / iter   1, loss = 0.1058
Epoch  47 / iter   2, loss = 0.1187
Epoch  47 / iter   3, loss = 0.1058
Epoch  47 / iter   4, loss = 0.0958
Epoch  48 / iter   0, loss = 0.0771
Epoch  48 / iter   1, loss = 0.0963
Epoch  48 / iter   2, loss = 0.1055
Epoch  48 / iter   3, loss = 0.1288
Epoch  48 / iter   4, loss = 0.2914
Epoch  49 / iter   0, loss = 0.1209
Epoch  49 / iter   1, loss = 0.0658
Epoch  49 / iter   2, loss = 0.1141
Epoch  49 / iter   3, loss = 0.0974
Epoch  49 / iter   4, loss = 0.2922

你可能感兴趣的:(知识增加,深度学习,机器学习)