本篇文章主要介绍了如何用多层神经网络BP算法做文本垃圾分类。
在多层神经网络BP算法里面,最核心的部分其实就是梯度下降。梯度下降的方法有很多种,这里使用的是感知机(Perceptions);当然还有其它的一些方法,例如RBF和Adaline两个梯度下降的方法。
之后我会写出两个python的脚本,一个是模块脚本,用来被调用的;另外一个是测试脚本,用来训练和测试用的。
这个部分是nn.py的模块,之后会调用里面的方程。
# -*- coding: utf-8 -*-
"""
Created on Sat Aug 19 17:14:07 2017
@author: CHEN Ming
"""
from numpy import tanh,multiply,unique,zeros,sign
def mlp_test(x,W1,W2):
z = tanh(W1*(x.T))
y = tanh(W2*z)
return y,z
def errorSample(yd,y):
err = (yd-y)
return err
# 梯度下降
def backprop(W1,W2,err,x,yp,z,eta):
delta2 = multiply(-err,(1-multiply(yp,yp)))
delta1 = multiply( (W2*(delta2.tolist()[0][0])).T,(1-multiply(z,z)) )
W2 = W2-eta*delta2*(z.T)
W1 = W1-eta*delta1*x;
return W1,W2
# 只设置最大循环次数
def mlp(W1,W2,x,y,eta,maxIter):
nbIter = 0
while nbIter1
for i in range(0,len(x)):
ya,za = mlp_test(x[i,:],W1,W2)
err = errorSample(y[i],ya)
W1,W2 = backprop(W1,W2,err,x[i,:],ya,za,eta)
taux = "%.2f%%" % ((i+1)/len(x))
print('\033[1;35m','第',str(nbIter),'次循环',' 完成',taux,'\033[0m!')
ya,za = mlp_test(x,W1,W2)
return W1,W2
def performance(ypred,y):
perf=0
for i in range(len(y)):
if y[i]==ypred[i]:
perf=perf + 1/len(y)
else:
perf=perf
return perf
# 设置最大循环次数和容错率
def mlp02(W1,W2,x,y,eta,maxIter,errApp):
nbIter = 0
errMAX=1
error02=0
while nbIteror errMAX>errApp:
nbIter = nbIter+1
for i in range(0,len(x)):
ya,za = mlp_test(x[i,:],W1,W2)
err = errorSample(y[i],ya)
W1,W2 = backprop(W1,W2,err,x[i,:],ya,za,eta)
taux = "%.2f%%" % (100*(i+1)/len(x))
print('\033[1;35m','第',str(nbIter),'次循环',' 完成',taux,'\033[0m!')
ya,za = mlp_test(x,W1,W2)
error01 = error02
#error02 = len(sign(ya!=y))/len(y);
error02 = 1 - performance(sign(ya.tolist()[0]),y)
errMAX = abs(error02-error01)
return W1,W2
# 读取词袋和标签数据
def readVectors():
f='C:\\Users\\CHEN Ming\\stage\\prepareData\\vectors.txt'
fp=open(f);lines=fp.readlines()
lines_new=[]
for line in lines:
lines_new.append(list( map(int,line.split()) ))
return(lines_new)
def setLabels():
file_types='C:\\Users\\CHEN Ming\\stage\\prepareData\\types.txt'
fp=open(file_types,encoding='utf-8')
lines=fp.readlines()
types=[]
for i in range(len(lines)):
types.append(int(''.join(lines[i])))#int(lines[i])
return types
现在我给大家介绍第二个脚本t_nn.py
# -*- coding: utf-8 -*-
"""
Created on Sat Aug 19 17:14:38 2017
@author: CHEN Ming
"""
import sys
sys.path.append('C:\\Users\\CHEN Ming\\stage\\NN\\')
import nn
#加载数据
from numpy import mat,random,sign,zeros,append
classLabels=nn.setLabels(); a=mat(classLabels).T; a[a==0]=-1
classLabels=a.T.tolist()[0]
dataMatIn=nn.readVectors02()
#dataMat=mat(dataMatIn)
dataMat=zeros((len(dataMatIn),len(dataMatIn[0])+1))
for i in range(len(dataMatIn)):
dataMat[i,:] = append(dataMatIn[i],1)
#
dataMat=mat(dataMat)
##training
J=dataMat.shape[1] -1
E=dataMat.shape[1]
S=1
W1 = random.randn(J,E)
W2 = random.randn(S,J)
eta = 0.05
maxIter = 20
#train data
x = dataMat[0:2000,:]
y = classLabels[0:2000]
W1,W2 = nn.mlp(W1,W2,x,y,eta,maxIter)
#test data
xt = dataMat[2000:2100,:]
yt = classLabels[2000:2100]
#
ypreda,zpreda = nn.mlp_test(x,W1,W2)
ypred,zpred = nn.mlp_test(xt,W1,W2)
#
nn.performance(sign(ypreda.tolist()[0]),y)
nn.performance(sign(ypred.tolist()[0]),yt)
#
print(perf_train)
print(perf_test)
由于神经网络算法的速度很慢,这里我只选择了2000个训练集和100个测试集。
最终训练和测试的结果如下:
0.02
0.1
最终训练的错误率未0.02,测试的错误率为0.1。总的来说还是可以的。