python 贝叶斯分类

来源:互联网 发布:青山水利软件价格 编辑:程序博客网 时间:2024/06/05 03:48
#-*- coding: utf-8 -*-from numpy import *import numpy as np def loadDataSet():postingList=[['my','dog','has','flea','problem','help','please'], ['maybe','not','take','him','to','dog','park','stupid'], ['my','dalmation','is','so','cute','I','love','him','my']]classVec =[0,1,0,1,0,1]return postingList,classVecclass NBayes(object):def __init__(self):self.vocabulary =[]  #词典self.idf =0       #词典的IDF权值向量self.tf =0    #训练集的权值矩阵self.tdm =0   #P(x|Yi)self.Pcates ={ } #对应每个文本分类,是一个外部导入的列表self.doclength = 0 #训练集文本数self.vocablen =0   #词典词长self.testset = 0   #测试集def train_set(self,trainset,classVec):'''导入和训练数据集  生成算法必须的参数和数据结构'''self.cate_prob(classVec)   #计算每个分类在数据集中的概率P(Yi)self.doclength = len(trainset)tempset =set()[tempset.add(word) for doc in trainset for word in doc] #生成词典self.vocabulary = list(tempset)self.vocablen =len(self.vocabulary)self.calc_wordfreq(trainset)  #计算词频数据集self.build_tdm()   #按分类累计向量 空间的每维度值 P(x|yi)def cate_prob(self,classVec):'''计算在数据集中每个分类的概率 P(yi)'''self.labels =classVeclabeltemps = set(self.labels)  #获取全部分类for labeltemp in labeltemps:#统计列表中重复的分类:self.labels.count(labeltemp)self.Pcates[labeltemp] = float(self.labels.count(labeltemp))/float(len(self.labels))def calc_wordfreq(self,trainset):'''生成普通的词频向量'''self.idf = np.zeros([1,self.vocablen])   # 1*词典数self.tf = np.zeros([self.doclength,self.vocablen])   #训练集文件数*词典数for indx in xrange(self.doclength):  #遍历所有的文本for word in trainset[indx]:      #遍历文本中的每个词#找到文本的词在字典 中的位置 +1self.tf[indx,self.vocabulary.index(word)] +=1for signleword in set(trainset[indx]):self.idf[0,self.vocabulary.index(signleword)] +=1def build_tdm(self):'''按分类累积计算向量空间的每维值 P(x|yi)'''self.tdm = np.zeros([len(self.Pcates),self.vocablen]) #类别行x词典列sumlist = np.zeros([len(self.Pcates),1])  #统计每个分类的总值for indx in xrange(self.doclength):#将同一类别的词向量空间值 加总self.tdm[self.labels[indx]] +=self.tf[indx]#统计每个分类的总值————是一个标量sumlist[self.labels[indx]] = np.sum(self.tdm[self.labels[indx]])self.tdm =self.tdm/sumlist    #生成 P(x|yi)def map2vocab(self,testdata):'''将测试集映射到当前词典'''self.testset = np.zeros([1,self.vocablen])for  word in testdata:self.testset[0,self.vocabulary.index(word)] +=1def predict(self,testset):'''预测分类结果,输出预测的分类类别'''if np.shape(testset)[1]  != self.vocablen:  #如果测试集长度与词典不相等,则退出程序print ("输入错误")exit(0)predvalue = 0  #初始化类别概率predclass = '' #初始化类别名称for tdm_vect,keyclass in zip(self.tdm,self.Pcates):#P(X|Yi) P(Yi)#变量tdm ,计算最大分类值temp =np.sum(testset*tdm_vect*self.Pcates[keyclass])if temp > predvalue:predvalue = temppredclass = keyclassreturn predclassdef calc_tfidf(self,trainset):'''以 TF-IDF 方式生成向量空间'''self.idf = np.zeros([1,self.vocablen])self.tf = np.zeros([self.doclength,self.vocablen])for indx in xrange(self.doclength):for word in trainset[indx]:self.tf[indx,self.vocabulary.index(word)] +=1#消除不同句 长句导致的偏差self.tf[indx] = self.tf[indx]/float(len(trainset[indx]))for signleword in set(trainset[indx]):self.idf[0,self.vocabulary.indx(signleword)] +=1self.idf = np.log(float(self.doclength)/self.idf)self.tf = np.multiply(self.tf,self.idf)  #矩阵与向量的点乘  TFXIDF
#-*- coding:utf-8 -*-import sysimport osfrom numpy import *import numpy as np from Nbayes_lib import *dataSet,listClasses = loadDataSet()  #导入外部数据集#dataSet: 句子的词向量#listClass 是句子所属的类别 [0,1,0,1,0,1]nb =NBayes()nb.train_set(dataSet,listClasses) #训练数据集nb.map2vocab(dataSet[0])   #随机选一个测试句print (nb.predict(nb.testset))  #输出分类的结果




原创粉丝点击