多层神经网络BP算法 文本垃圾分类

本篇文章主要介绍了如何用多层神经网络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。总的来说还是可以的。

你可能感兴趣的:(神经网络,神经网络分类源代码,文本分类,算法,python)