参考:https://blog.csdn.net/michael_f2008/article/details/103715699

https://developer.aliyun.com/article/614411

import pandas as pd
import numpy as np
import datetime
from sklearn.utils import shuffle# 1.初始化参数
def initialize_parameters(n_x, n_h, n_y):np.random.seed(2)# 权重和偏置矩阵w1 = np.random.randn(n_h, n_x) * 0.01b1 = np.zeros(shape=(n_h, 1))w2 = np.random.randn(n_y, n_h) * 0.01b2 = np.zeros(shape=(n_y, 1))# 通过字典存储参数parameters = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}return parameters# 2.前向传播
def forward_propagation(X, parameters):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']# 通过前向传播来计算a2z1 = np.dot(w1, X) + b1     # 这个地方需注意矩阵加法:虽然(w1*X)和b1的维度不同,但可以相加a1 = np.tanh(z1)            # 使用tanh作为第一层的激活函数z2 = np.dot(w2, a1) + b2a2 = 1 / (1 + np.exp(-z2))  # 使用sigmoid作为第二层的激活函数# 通过字典存储参数cache = {'z1': z1, 'a1': a1, 'z2': z2, 'a2': a2}return a2, cache# 3.计算代价函数
def compute_cost(a2, Y, parameters):m = Y.shape[1]      # Y的列数即为总的样本数# 采用交叉熵(cross-entropy)作为代价函数logprobs = np.multiply(np.log(a2), Y) + np.multiply((1 - Y), np.log(1 - a2))cost = - np.sum(logprobs) / mreturn cost# 4.反向传播(计算代价函数的导数)
def backward_propagation(parameters, cache, X, Y):m = Y.shape[1]w2 = parameters['w2']a1 = cache['a1']a2 = cache['a2']# 反向传播,计算dw1、db1、dw2、db2dz2 = a2 - Ydw2 = (1 / m) * np.dot(dz2, a1.T)db2 = (1 / m) * np.sum(dz2, axis=1, keepdims=True)dz1 = np.multiply(np.dot(w2.T, dz2), 1 - np.power(a1, 2))dw1 = (1 / m) * np.dot(dz1, X.T)db1 = (1 / m) * np.sum(dz1, axis=1, keepdims=True)grads = {'dw1': dw1, 'db1': db1, 'dw2': dw2, 'db2': db2}return grads# 5.更新参数
def update_parameters(parameters, grads, learning_rate=0.0075):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']dw1 = grads['dw1']db1 = grads['db1']dw2 = grads['dw2']db2 = grads['db2']# 更新参数w1 = w1 - dw1 * learning_rateb1 = b1 - db1 * learning_ratew2 = w2 - dw2 * learning_rateb2 = b2 - db2 * learning_rateparameters = {'w1': w1, 'b1': b1, 'w2': w2, 'b2': b2}return parameters# 建立神经网络
def nn_model(X, Y, n_h, n_input, n_output, num_iterations=10000, print_cost=False):np.random.seed(3)n_x = n_input           # 输入层节点数n_y = n_output          # 输出层节点数# 1.初始化参数parameters = initialize_parameters(n_x, n_h, n_y)# 梯度下降循环for i in range(0, num_iterations):# 2.前向传播a2, cache = forward_propagation(X, parameters)# 3.计算代价函数cost = compute_cost(a2, Y, parameters)# 4.反向传播grads = backward_propagation(parameters, cache, X, Y)# 5.更新参数parameters = update_parameters(parameters, grads)# 每1000次迭代,输出一次代价函数if print_cost and i % 1000 == 0:print('迭代第%i次,代价函数为:%f' % (i, cost))return parameters# 对模型进行测试
def predict(parameters, x_test, y_test):w1 = parameters['w1']b1 = parameters['b1']w2 = parameters['w2']b2 = parameters['b2']z1 = np.dot(w1, x_test) + b1a1 = np.tanh(z1)z2 = np.dot(w2, a1) + b2a2 = 1 / (1 + np.exp(-z2))# 结果的维度n_rows = y_test.shape[0]n_cols = y_test.shape[1]# 预测值结果存储output = np.empty(shape=(n_rows, n_cols), dtype=int)# 取出每条测试数据的预测结果for i in range(n_cols):# 将每条测试数据的预测结果(概率)存为一个行向量temp = np.zeros(shape=n_rows)for j in range(n_rows):temp[j] = a2[j][i]# 将每条结果(概率)从小到大排序,并获得相应下标sorted_dist = np.argsort(temp)length = len(sorted_dist)# 将概率最大的置为1,其它置为0for k in range(length):if k == sorted_dist[length - 1]:output[k][i] = 1else:output[k][i] = 0print('预测结果:')print(output)print('真实结果:')print(y_test)count = 0for k in range(0, n_cols):if output[0][k] == y_test[0][k] and output[1][k] == y_test[1][k] and output[2][k] == y_test[2][k]:count = count + 1acc = count / int(y_test.shape[1]) * 100print('准确率:%.2f%%' % acc)if __name__ == "__main__":# 读取数据data_set = pd.read_csv('D:\\circles_data_training.csv', header=None)data_set = shuffle(data_set)            # 打乱数据的输入顺序# 取出“特征”和“标签”,并做了转置,将列转置为行X = data_set.ix[:, 0:11].values.T       # 前12列是特征Y = data_set.ix[:, 12:14].values.T      # 后3列是标签Y = Y.astype('uint8')# 开始训练start_time = datetime.datetime.now()# 输入12个节点,隐层6个节点,输出3个节点,迭代10000次parameters = nn_model(X, Y, n_h=6, n_input=12, n_output=3, num_iterations=10000, print_cost=True)end_time = datetime.datetime.now()print("用时:" + str((end_time - start_time).seconds) + 's' + str(round((end_time - start_time).microseconds / 1000)) + 'ms')# 对模型进行测试data_test = pd.read_csv('D:\\circles_data_test.csv', header=None)x_test = data_test.ix[:, 0:11].values.Ty_test = data_test.ix[:, 12:14].values.Ty_test = y_test.astype('uint8')predict(parameters, x_test, y_test)

【机器学习】——纯Python建立BP模型相关推荐

  1. Python建立线性回归模型进行房价预测

    Python建立线性回归模型进行房价预测 前期准备 多因子房价预测 实战流程 1.数据加载 2.数据可视化 3.数据预处理 4.模型建立与训练 5.模型预测 6.模型评估 7.房价预测 数据与代码 前 ...

  2. Python建立ARIMA模型

    Python建立ARIMA模型 ARIMA(p,d,q)模型:AR是自回归,p为自回归项:MA为移动平均,q为移动平均项数:d为时间序列成为平稳时所做的差分次数. 原理:将非平稳时间序列转化为平稳时间 ...

  3. python建立回归模型_简单线性回归的Python建模方法

    简单线性回归,就是两个随机变量存在一定大小的相关系数的前提下,结合散点图观察,采用最小二乘OLS方法,尝试建立一条回归直线,使得误差平方和SSE最小.OLS是一种参数方法,通过确定直线的斜率b和截距a ...

  4. python bp神经网络 隐含层神经元数_【机器学习】python实现BP神经网络实战

    概述: 人工神经网络是一种经典的机器学习模型,随着深度学习的发展神经网络模型日益完善.联想大家熟悉的回归问题, 神经网络模型实际上是根据训练样本创造出一个多维输入多维输出的函数, 并使用该函数进行预测 ...

  5. 怎么用python进行回归预测_使用Python训练回归模型并进行预测

    摘要:本篇文章将介绍在python中使用机器学习库sklearn建立简单回归模型的过程. 回归分析是一种常见的统计方法,用于确定不同变量间的相互关系.在Excel中可以通过数据分析菜单中的回归功能快速 ...

  6. 简单数据预测—使用Python训练回归模型并进行预测(转自蓝鲸网站分析博客)

     使用Python训练回归模型并进行预测 回归分析是一种常见的统计方法,用于确定不同变量间的相互关系.在Excel中可以通过数据分析菜单中的回归功能快速完成.本篇文章将介绍在python中使用机器 ...

  7. python给用户打标签_用Python实现RFM模型——互联网产品用户分层必备技巧

    1.前言 RFM模型即"R"--Recency(最近一次消费时间)."F"--Frequency(一段时间内消费频次)."M"--(一段时间 ...

  8. 【机器学习基础】数学推导+纯Python实现机器学习算法24:HMM隐马尔可夫模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab HMM(Hidden Markov Model)也就是隐马尔可夫模型,是一种由隐藏的马尔可夫链随机 ...

  9. 【机器学习基础】数学推导+纯Python实现机器学习算法22:最大熵模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab 最大熵原理(Maximum Entropy Principle)是一种基于信息熵理论的一般原理,在 ...

最新文章

  1. Spring Boot集成持久化Quartz定时任务管理
  2. mysql 拷贝数据库 表存在却打不开_mysql数据库文件复制后表打不开
  3. 广东发展银行系统分析师面试问题
  4. Fabricjs在Canvas上使用路径Path绘制不规则图形
  5. Spring Session实战4
  6. Win7 Ubuntu13.04互通(win7下用vbox安装Ubuntu)
  7. jvm 错误_JVM因“ OutOfMemory”错误而关闭-我该怎么办?
  8. Git----分支管理之分支管理策略04
  9. SpringFox swagger2 and SpringFox swagger2 UI 接口文档生成与查看
  10. 【编程题目】给你 10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数...
  11. 1.4编程基础之逻辑表达式与条件分支 18 点和正方形的关系
  12. LFS-构建自己的linux
  13. [原]问题解决办法:there are offline or missing virtual drivers with preserved cache
  14. C++_public、private、protected权限介绍
  15. 【C语言】18-变量类型
  16. Unity开发——CPU优化篇
  17. 如何进行软件需求分析
  18. 基础篇:6.4)形位公差-符号 Symbol
  19. 标定方法——张正友标定法
  20. 清远机器人编程_清远宇舵机器人告诉你为什么少年儿童要学习机器人编程?

热门文章

  1. Combine two strings into one.
  2. 在bootstrap table中使用Tooltip
  3. 微软最爽命令行工具发布!
  4. jQuery导入代码片段并绑定事件
  5. 20145227鄢曼君《网络对抗》Web安全基础实践
  6. 服务核心 - 工具类
  7. php归档函数(按时间)实现
  8. XAML 编码规范 (思考)
  9. 初学者应该了解的一些SQL语句及hr 用户解锁相关
  10. Linux操作系统定时任务系统 Cron