超级简单的神经网络——训练数据分类(python语言)

news/2025/2/9 1:40:37/

需要kddtrain2018.txt和kddtest2018.txt的盆友,请下载我上传的资源:神经网络训练数据分类_kdd

内容:

根据给定数据集创建分类器。
训练数据集(kddtrain2018.txt):100 predictive attributes A1,A2,...,A100和一个类标C,每一个属性是介于0~1之间的浮点数,类标C有三个可能的{0,1,2},给定的数据文件有101列,6270行。
测试数据集(kddtest2018.txt):500行

处理过程:

1.将两个txt文件转换成excel,得到6270*101、500*100(test2018.xlsx)的两个.xlsx表格。

2.将训练文件6270*101分成两个表格:6000*101和270*101,得到train2018.xlsx文件和val2018.xlsx文件。

3.用train2018.xlsx代码训练

4.用val2018.xlsx验证,得到准确率96.7%

5.可以预测test结果,但是没有标签,所以不知道正确率......此步略:)

神经网络设计:

原则:简单点,写代码的方式简单点

三层网络,输入层,隐含层,输出层。

n_x=6000(6000个训练样本),n_h=32(32个神经元,也可以是别的数字),n_y=3(3类)

训练代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltdef initialize_parameters(n_x, n_h, n_y):W1 = np.random.randn(n_h,n_x) * 0.01b1 = np.zeros((n_h,1))W2 = np.random.randn(n_y,n_h) * 0.01b2 = np.zeros((n_y,1))assert (W1.shape == (n_h, n_x))assert (b1.shape == (n_h, 1))assert (W2.shape == (n_y, n_h))assert (b2.shape == (n_y, 1))parameters = {"W1": W1,"b1": b1,"W2": W2,"b2": b2}return parametersdef forward_propagation(X, parameters):W1 = parameters["W1"]b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]# Implement Forward Propagation to calculate A2 (probabilities)Z1 = np.dot(W1,X)+b1A1 = np.tanh(Z1)Z2 = np.dot(W2,A1)+b2A2 = sigmoid(Z2)#print(W2.shape)#print(A2.shape)cache = {"Z1": Z1,"A1": A1,"Z2": Z2,"A2": A2}return A2, cachedef compute_cost(A2, Y, parameters):#计算损失时,用的是转换之后的标签#m = Y.shape[1] # number of example# Compute the cross-entropy costlogprobs = -np.multiply(np.log(A2),Y)cost = np.sum(logprobs)/A2.shape[1]#print(logprobs.shape)#print(cost.shape)return costdef backward_propagation(parameters, cache, X, Y):#反向传播时,用的也是转换之后的标签Y->label_trainm = X.shape[1]W1 = parameters["W1"]W2 = parameters["W2"]A1 = cache["A1"]A2 = cache["A2"]# Backward propagation: calculate dW1, db1, dW2, db2. dZ2 = A2-YdW2 = np.dot(dZ2,A1.T)/mdb2 = np.sum(dZ2,axis=1,keepdims=True)/mdZ1 = np.dot(W2.T,dZ2)*(1 - np.power(A1, 2))dW1 =  np.dot(dZ1,X.T)/mdb1 = np.sum(dZ1,axis=1,keepdims=True)/mgrads = {"dW1": dW1,"db1": db1,"dW2": dW2,"db2": db2}return grads# GRADED FUNCTION: update_parametersdef update_parameters(parameters, grads, learning_rate = 1.2):W1 = parameters["W1"]b1 = parameters["b1"]W2 = parameters["W2"]b2 = parameters["b2"]dW1 = grads["dW1"]db1 = grads["db1"]dW2 = grads["dW2"]db2 = grads["db2"]# Update rule for each parameterW1 = W1-learning_rate*dW1b1 = b1-learning_rate*db1W2 = W2-learning_rate*dW2b2 = b2-learning_rate*db2parameters = {"W1": W1,"b1": b1,"W2": W2,"b2": b2}return parameters#softmax函数定义
def softmax(x):exp_scores = np.exp(x)probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)return probs
def sigmoid(x):s=1/(1+np.exp(-x))return sdata = pd.read_excel('train2018.xlsx',header = None)
train = np.array(data)X = train[:,0:100]
Y = train[:,100]
Y = Y.reshape((Y.shape[0],1))
#print(X.shape)
#print(X)
#print(Y.shape) # 1*6100
#print(Y)X = X.T
Y = Y.T
n_x = X.shape[0]
n_h = 32
n_y = 3parameters = initialize_parameters(n_x, n_h, n_y)num_iterations = 30000
nuber = Y.shape[1]
label_train=np.zeros((3,nuber))
#根据Y值,转换分类标签,这里有三类输出:{0,1,2}
#Y为1*6100,转换之后为3*6000
for k in range(nuber):if Y[0][k] == 0:label_train[0][k] = 1if Y[0][k] == 1:label_train[1][k] = 1if Y[0][k] == 2:label_train[2][k] = 1#label_train[int(Y[0][i])][i]=1#print(label_train.shape)
#print(label_train)
for i in range(0, num_iterations):learning_rate=0.05#if i>1000:# learning_rate=learning_rate*0.999# Forward propagation. Inputs: "X, parameters". Outputs: "A2, cache".A2, cache = forward_propagation(X, parameters)pre_model = softmax(A2)#pre_model = A2# Cost function. Inputs: "A2, Y, parameters". Outputs: "cost".cost = compute_cost(pre_model, label_train, parameters)# Backpropagation. Inputs: "parameters, cache, X, Y". Outputs: "grads".grads = backward_propagation(parameters, cache, X, label_train)# Gradient descent parameter update. Inputs: "parameters, grads". Outputs: "parameters".parameters = update_parameters(parameters, grads, learning_rate)  # Print the cost every 1000 iterationsif i % 1000 == 0:print ("Cost after iteration %i: %f" %(i, cost))plt.plot(i, cost, 'ro')

训练结果: 

验证代码:

data = pd.read_excel('val2018.xlsx',header = None)
test = np.array(data)X_test = test[:,0:100]
Y_label = test[:,100]
Y_label = Y_label.reshape((Y_label.shape[0],1))X_test = X_test.T
Y_label = Y_label.T
count = 0
a2,xxx=forward_propagation(X_test,parameters)for j in range(Y_label.shape[1]):#np.argmax返回最大值的索引predict_value=np.argmax(a2[:,j])#在val上计算准确度if predict_value==int(Y_label[:,j]):count=count+1
print(np.divide(count,Y_label.shape[1]))

验证结果:

输出:0.9666666666666667

总结:

1.多分类与二分类的损失函数(交叉熵)不一样了!

2.交叉熵刻画的是两个概率分布之间的距离,但神经网络的输出不一定是概率分布,很多情况下是实数。Softmax可以将神经网络前向传播得到的结果变成概率分布。

3.要做分类,得有标签。K分类,标签为K*1维向量

参考:

详解numpy的argmax:https://blog.csdn.net/oHongHong/article/details/72772459

神经网络多分类任务的损失函数——交叉熵:https://blog.csdn.net/lvchunyang66/article/details/80076959

用python的numpy实现神经网络 实现手写数字识别:https://blog.csdn.net/weixin_39504048/article/details/79115437


http://www.ppmy.cn/news/170685.html

相关文章

MT7603/MT7610/MT7612/MT7632/MT7662/RT3070 WiFi模块选型参考

MT7603/MT7610/MT7612/MT7632/MT7662/RT3070/rt5572系列wifi模块选型参考 RT3070是2.4G单通道,最大传输速率可以150Mbps,目前基本上是一些dongle类产品,同时最主要的是还是RT3070PA的架构,早期的万能网卡常用。 MT760UN1是2.4G单…

Kali Linux 2018.2 修复mt7601u驱动

Kali Linux 2018.2 修复mt7601u驱动 最新Kali下载 https://www.kali.org/downloads/ 下载需要的版本,本人测试vbox和原生iso均OK 下载可以用BT文件,利用百度网盘秒下,在利用百度网盘下载(利用工具可以达到线速)--具…

dell c6220II lsi阵列卡

1.如果在lsi阵列卡上有多个raid,那么需要在第一个创建的raid上装系统,或者说先创建装系统的raid,否则可能报 hard disk error(centos 6.6) 2.热插拔的后果:如果硬盘没有出现故障,raid也正常,在系统运行状态…

mt7620a上带机量的提高(三)

提高带机量的方案设计 针对影响带机量提高的因素,在长时间的测试中找到了两条应对策略。第一是降频,减少被其他信道干扰的可能,提高信噪比,从而增加有效带宽。第二是跟进RSSI来划定连接范围,净化无线环境,…

mt7620a上带机量的提高(一)

常用路由器带机量分析 目前,常见的家用路由器的带机量一般在十个左右,有些能到十几个,有些可能都不到十个,也就是说一台路由器可以接入的手机和电脑数量在十几个左右。目前市场上的智能路由器宣传的带机量多是在30台左右&#xf…

【Kafka】kafka消费组查看lag

文章目录 1.概述2.使用命令2.java 代码2.1 0.10版本2.x版本3. jmx1.概述 kafka 如何查看lag 2.使用命令 [root@1 kafka]# bin/kafka-consumer-groups

PCIE AER Linux 驱动详解

文章目录 Abstract1. Introduction2. PCIe Advanced Error Reportion Driver2.1 PCIe AER Topology2.2 PCIe AER Driver Architecture2.2.1 PCIe Error Introduction2.2.2 PCI Express AER Driver Designed To Handle PCI Express Errors2.2.2.1 AER Initialization Procedures…

java转移目录下某些文件到另一目录 renameTo使用

前言: 转移文件看到一csdn博文的fileMove类,直接拿来用了。因网页清除历史记录,暂时无法找到原博主的博文及这一方法类来源。 注:本文引用其博文fileMove类。 正文: 文件目录如下: oricah:原文…