# classification_BPNeuralNetwork
> 本文介绍了通过Python实现BP神经网络分类算法,对不同半径的圆进行多分类(3分类),特征即为圆的半径。
> 输入层12节点,一个6节点的隐藏层,输出层3个节点。
## 1.目标
通过BP算法实现对不同半径的圆的分类。
## 2.开发环境
IDE:PyCharm 2018.3.3(Community Edition)
Python及相关库的版本号如下图所示:
![版本号](https://img-blog.csdnimg.cn/20191226150201533.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21pY2hhZWxfZjIwMDg=,size_16,color_FFFFFF,t_70)
## 3.准备数据
**目的:** 生成3类圆在第一象限内的坐标(圆心都是原点)
第1类:半径范围为1~10,分类标识为‘0’
第2类:半径范围为10~20,分类标识为‘1’
第3类:半径范围为20~30,分类标识为‘2’
代码如下:`data_generate.py`
```python
import numpy as np
import math
import random
import csv
# 只生成第一象限内的坐标即可。每个圆生成12个坐标(x,y),相当于12个特征维度
def generate_circle(lower, upper):
# 圆在第一象限内的坐标
data_ur = np.zeros(shape=(12, 2))
# 在上下限范围内,随机产生一个值作为半径
radius = random.randint(int(lower), int(upper))
# 在0~90度内,每隔7.5度取一次坐标,正好取12次
angles = np.arange(0, 0.5 * np.pi, 1 / 24 * np.pi)
for i in range(12):
temp_ur = np.zeros(2)
x = round(radius * math.cos(angles[i]), 2)
y = round(radius * math.sin(angles[i]), 2)
temp_ur[0] = x
temp_ur[1] = y
data_ur[i] = temp_ur
return data_ur, label
# 将坐标保存到CSV文件中
def save2csv(data, batch, label):
out = open("D:\\circles.csv", 'a', newline='')
csv_write = csv.writer(out, dialect='excel')
length = int(data.size / 2)
for i in range(length):
string = str(data[i][0]) + ',' + str(data[i][1]) + ',' + str(batch) + ',' + str(label)
temp = string.split(',')
csv_write.writerow(temp)
out.close()
if __name__ == "__main__":
'''
生成3类圆,标签(label)分别为:0、1、2
第1类圆的半径下限为1,上限为10
第2类圆的半径下限为10,上限为20
第3类圆的半径下限为20,上限为30
圆心都为原点
'''
lower = [1, 10, 20] # 半径随机值的下限
upper = [10, 20, 30] # 半径随机值的上限
label = ['0', '1', '2'] # 种类的标签
for i in range(len(label)):
# 每类数据生成50组
for j in range(50):
data, label = generate_circle(lower[i], upper[i])
batch = 50 * i + j + 1 # 数据的批次,用来区分每个坐标是属于哪个圆的
save2csv(data, batch, label[i])
```
共3类圆,每类生成50个圆,每个圆有12个坐标,因此在输出文件`D:\circles.csv`中总共有3×50×12=1800行数据:
![circles.csv文件](https://img-blog.csdnimg.cn/20191226154520930.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21pY2hhZWxfZjIwMDg=,size_16,color_FFFFFF,t_70)
通过生成的坐标绘制散点图如下:
![圆的散点图](https://img-blog.csdnimg.cn/2019122615475623.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21pY2hhZWxfZjIwMDg=,size_16,color_FFFFFF,t_70)
图中蓝色的点是label为0的圆,绿色的点是label为1的圆,红色的点是label为2的圆。
## 4.处理数据
**目标:** 根据第3步获得的坐标,计算每个圆的半径(勾股定理)作为神经网络的输入。
代码如下:`data_process.py`
```python
import csv
import math
def process(file_name):
# 要读取的CSV文件
csv_file = csv.reader(open(file_name, encoding='utf-8'))
# 要生成的CSV文件
out_file = open("D:\\circles_data.csv", 'a', newline='')
csv_write = csv.writer(out_file, dialect='excel')
# 将csv_file每一行的圆坐标取出,如果是同一批次的(同一个圆),则写入到out_file的一行中
rows = [row for row in csv_file]
current_batch = 'unknown'
current_label = 'unknown'
data_list = []
for r in rows:
# 将无关字符都替换为空格
temp_string = str(r).replace('[', '').replace(']', '').replace('\'', '')
# 将字符串以逗号分隔
item = str(temp_string).split(',')
# 分别取出x轴坐标、y轴坐标、批次、标签
x = float(item[0])
y = float(item[1])
batch = item[2]
label = item[3]
# 如果是同一批次(同一个圆),则都放入data_list中
if current_batch == batch:
# 根据勾股定理计算半径
distance = math.sqrt(pow(x, 2) + pow(y, 2))
data_list.append(distance)
# 如果不是同一批次(同一个圆),则在末尾加上标签后,作为一行写入输出文件
else:
if len(data_list) != 0:
# 这个地方需注意一下,最后的标签用3列来表示,而不是一列
if label.strip() == '0':
data_list.append(1)
data_list.append(0)
data_list.append(0)
elif label.strip() == '1':
data_list.append(0)
data_list.append(1)
data_list.append(0)
else:
data_list.append(0)
data_list.append(0)
data_list.append(1)
result_string = str(data_list).replace('[', '').replace(']', '').replace('\'', '').strip()
csv_write.writerow(result_string.split(','))
# 清空data_list,继续写入下一个批次
data_list.clear()
distance = math.sqrt(pow(x, 2) + pow(y, 2))
data_list.append(distance)
current_batch = batch
current_label = label
# 确保最后一个批次的数据能写入
if current_label.strip() == '0':
data_list.append(1)
data_list.append(0)
data_list.append(0)
elif current_label.strip() == '1':
data_list.append(0)
data_list.append(1)
data_list.append(0)
else:
data_list.append(0)
data_list.append(0)
data_list.append(1)
result_string = str(data_list).replace('[', '').replace(']', '').replace('\'', '').strip()
csv_write.writerow(result_string.split(','))
# 关闭输出文件
out_file.close()
if __name__ == "__main__":
process('D:\\circles.csv')
```
需要注意的是,生成的CSV文件共有15列,前12列为坐标对应的半径值,最后三列组合起来表示分类(label):
![circles_data.csv文件](https://img-blog.csdnimg.cn/20191226164449424.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L21pY2hhZWxfZjIwMDg=,size_16,color_FFFFFF,t_70)
(1,0,0)表示类型为“0”的圆,(0,1,0)表示类型为“1”的圆,(0,0,1)表示类型为“2”的圆,这样做的目的是为了下一步使用神经网络时处理起来方便。
## 5.构建BP神经网络
上一步处理好的数据可以作为训练数据,命名为:`circles_data_training.csv`
重复第3步和第4步,可以生成另一批数据作为测试数据,命名为:`circles_data_test.csv`
当然,也可以手动划分出训练数据和测试数据。
训练数据和测试数据在输入时,做了矩阵的转置,将列转置为行。
代码如下:`data_analysis_bpnn.py`
```python
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.01
b1 = np.zeros(shape=(n_h, 1))
w2 = np.random.ran
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【作品名称】:基于Python BP神经网络实现不同直径圆的分类 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 通过Python实现BP神经网络分类算法,对不同半径的圆进行多分类(3分类),特征即为圆的半径。 输入层12节点,一个6节点的隐藏层,输出层3个节点。 1.目标 通过BP算法实现对不同半径的圆的分类。 2.开发环境 IDE:PyCharm 2018.3.3(Community Edition) Python 代码中需要注意的几个关键参数: learning_rate=0.0075,学习率(可调) n_h=6,隐藏层节点数(可调) n_input=12,输入层节点数 n_output=3,输出层节点数 num_iterations=10000,迭代次数(可调) 另外,对于predict(param 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。
资源推荐
资源详情
资源评论
收起资源包目录
classification_BPNeuralNetwork-master.zip (12个子文件)
classification_BPNeuralNetwork-master
circles.csv 28KB
screenshots
4圆的半径.png 125KB
5结果.png 96KB
3散点图.png 107KB
1版本号.png 87KB
2圆的坐标.png 97KB
data_generate.py 2KB
circles_data_test.csv 2KB
circles_data_training.csv 20KB
data_analysis_bpnn.py 6KB
README.md 15KB
data_process.py 3KB
共 12 条
- 1
资源评论
小英子架构
- 粉丝: 1010
- 资源: 4052
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功