东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1094|回复: 0
打印 上一主题 下一主题

[课堂笔记] 29、神经网络之BP算法_实战预测案例_笔记

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14437
QQ
跳转到指定楼层
楼主
发表于 2018-12-14 17:18:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


29、神经网络之BP算法_实战预测案例_笔记


使用Python实现BP神经网络实现对公路客运量公路货运量预测案例

  1. # -*- coding: utf-8 -*-
  2. __author__ = 'dongfangyao'
  3. __date__ = '2018/12/14 上午11:01'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'tf22'

  6. import numpy as np
  7. import matplotlib as mpl
  8. import matplotlib.pyplot as plt
  9. from sklearn.preprocessing import MinMaxScaler
  10. import pandas as pd

  11. ## 设置字符集,防止中文乱码
  12. mpl.rcParams['font.sans-serif'] = [u'simHei']
  13. mpl.rcParams['axes.unicode_minus'] = False

  14. # 1. 读取数据
  15. df = pd.read_csv('traffic_data.csv', encoding='utf-8')
  16. print(df.head())

  17. # 2. 读取特征属性X 与 目标属性Y
  18. x = df[['人口数', '机动车数', '公路面积']]
  19. y = df[['客运量', '货运量']]

  20. # 3. 因为x和y的数据取值范围太大了,防止梯度爆炸,所以做一个归一化操作(使用区间缩放法)
  21. x_scaler = MinMaxScaler(feature_range=(-1, 1))
  22. y_scaler = MinMaxScaler(feature_range=(-1, 1))
  23. x = x_scaler.fit_transform(x)
  24. y = y_scaler.fit_transform(y)

  25. # 为了后面和w进行矩阵的乘法操作
  26. # 神经网络中 同一层之间的神经元没有关系
  27. sample_in = x.T
  28. sample_out = y.T
  29. # sample_in 3*20
  30. # sample_out 2*20

  31. # 超参数
  32. max_epochs = 60000
  33. learn_rate = 0.035
  34. mse_final = 6.5e-4
  35. sample_number = x.shape[0]
  36. input_number = 3
  37. out_number = 2
  38. hidden_unit_number = 8

  39. # 网络参数
  40. # 8*3的矩阵
  41. w1 = 0.5 * np.random.rand(hidden_unit_number, input_number) - 0.1
  42. # 8*1的矩阵
  43. b1 = 0.5 * np.random.rand(hidden_unit_number, 1) - 0.1
  44. # 2*8的矩阵
  45. w2 = 0.5 * np.random.rand(out_number, hidden_unit_number) - 0.1
  46. # 2*1的矩阵
  47. b2 = 0.5 * np.random.rand(out_number, 1) - 0.1


  48. def sigmoid(z):
  49.     return 1.0 / (1 + np.exp(-z))


  50. mse_history = []
  51. # BP的计算
  52. for i in range(max_epochs):
  53.     # FP过程
  54.     # 隐藏层的输出(8*20)
  55.     hidden_out = sigmoid(np.dot(w1, sample_in) + b1)
  56.     # 输出层的输出(为了简化我们的写法,输出层不进行sigmoid激活)(2*20)
  57.     network_out = np.dot(w2, hidden_out) + b2

  58.     # 错误 误差
  59.     # 2*20
  60.     err = sample_out - network_out
  61.     mse = np.average(np.square(err))
  62.     mse_history.append(mse)
  63.     if mse < mse_final:
  64.         break

  65.     # BP过程
  66.     # delta2: 2*20
  67.     # 隐层与输出层之间的 2*20
  68.     delta2 = -err
  69.     # 输入层与隐层之间的
  70.     delta1 = np.dot(w2.transpose(), delta2) * hidden_out * (1 - hidden_out)
  71.     # w2的导数 2*8
  72.     delta_w2 = np.dot(delta2, hidden_out.transpose())
  73.     # b2的导数 2*1
  74.     delta_b2 = np.dot(delta2, np.ones((sample_number, 1)))
  75.     # w1的导数
  76.     delta_w1 = np.dot(delta1, sample_in.transpose())
  77.     # b1的导数
  78.     delta_b1 = np.dot(delta1, np.ones((sample_number, 1)))
  79.     # w2: 2*8的矩阵, 那也就是要求delta_w2必须是2*8的一个矩阵
  80.     w2 -= learn_rate * delta_w2
  81.     b2 -= learn_rate * delta_b2
  82.     w1 -= learn_rate * delta_w1
  83.     b1 -= learn_rate * delta_b1

  84. # print('看误差是否在降低:', mse_history)

  85. # 误差曲线图
  86. mse_history10 = np.log10(mse_history)
  87. min_mse = min(mse_history10)
  88. plt.plot(mse_history10)
  89. plt.plot([0, len(mse_history10)], [min_mse, min_mse])
  90. ax = plt.gca()
  91. ax.set_yticks([-2, -1, 0, 1, 2, min_mse])
  92. ax.set_xlabel('iteration')
  93. ax.set_ylabel('MSE')
  94. ax.set_title('Log10 MSE History 东方耀 微信:dfy_88888', fontdict={'fontsize': 18, 'color': 'red'})
  95. plt.show()

  96. # 仿真输出和实际输出对比图
  97. # 隐藏层输出
  98. hidden_out = sigmoid((np.dot(w1, sample_in) + b1))
  99. # 输出层输出
  100. network_out = np.dot(w2, hidden_out) + b2
  101. # 反转获取实际值
  102. network_out = y_scaler.inverse_transform(network_out.T)
  103. sample_out = y_scaler.inverse_transform(y)

  104. fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(12, 10))
  105. line1, = axes[0].plot(network_out[:, 0], 'k', marker='o')
  106. line2, = axes[0].plot(sample_out[:, 0], 'r', markeredgecolor='b', marker='*', markersize=9)
  107. axes[0].legend((line1, line2), ('预测值', '实际值'), loc='upper left')
  108. axes[0].set_title('客流量模拟 东方耀 微信:dfy_88888', fontdict={'fontsize': 18, 'color': 'red'})
  109. line3, = axes[1].plot(network_out[:, 1], 'k', marker='o')
  110. line4, = axes[1].plot(sample_out[:, 1], 'r', markeredgecolor='b', marker='*', markersize=9)
  111. axes[1].legend((line3, line4), ('预测值', '实际值'), loc='upper left')
  112. axes[1].set_title('货流量模拟 东方耀 微信:dfy_88888', fontdict={'fontsize': 18, 'color': 'red'})
  113. plt.show()
复制代码

  1. # 误差曲线图
  2. mse_history10 = np.log10(mse_history)
  3. min_mse = min(mse_history10)
  4. plt.plot(mse_history10)
  5. plt.plot([0, len(mse_history10)], [min_mse, min_mse])
  6. ax = plt.gca()
  7. ax.set_yticks([-2, -1, 0, 1, 2, min_mse])
  8. ax.set_xlabel('iteration')
  9. ax.set_ylabel('MSE')
  10. ax.set_title('Log10 MSE History 东方耀 微信:dfy_88888', fontdict={'fontsize': 18, 'color': 'red'})
  11. plt.show()

  12. # 仿真输出和实际输出对比图
  13. # 隐藏层输出
  14. hidden_out = sigmoid((np.dot(w1, sample_in) + b1))
  15. # 输出层输出
  16. network_out = np.dot(w2, hidden_out) + b2
  17. # 反转获取实际值
  18. network_out = y_scaler.inverse_transform(network_out.T)
  19. sample_out = y_scaler.inverse_transform(y)

  20. fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(12, 10))
  21. line1, = axes[0].plot(network_out[:, 0], 'k', marker='o')
  22. line2, = axes[0].plot(sample_out[:, 0], 'r', markeredgecolor='b', marker='*', markersize=9)
  23. axes[0].legend((line1, line2), ('预测值', '实际值'), loc='upper left')
  24. axes[0].set_title('客流量模拟 东方耀 微信:dfy_88888', fontdict={'fontsize': 18, 'color': 'red'})
  25. line3, = axes[1].plot(network_out[:, 1], 'k', marker='o')
  26. line4, = axes[1].plot(sample_out[:, 1], 'r', markeredgecolor='b', marker='*', markersize=9)
  27. axes[1].legend((line3, line4), ('预测值', '实际值'), loc='upper left')
  28. axes[1].set_title('货流量模拟 东方耀 微信:dfy_88888', fontdict={'fontsize': 18, 'color': 'red'})
  29. plt.show()
复制代码


mse_history.png (22.11 KB, 下载次数: 96)

mse_history.png

moni_predict.png (87.2 KB, 下载次数: 91)

moni_predict.png

画板 1.png (1.24 MB, 下载次数: 94)

画板 1.png

traffic_data.csv

691 Bytes, 下载次数: 199

让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-5-5 09:07 , Processed in 0.182399 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表