1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| def loadDataSet(): postingList=[['my','dog','has','flea','poblems','help','please'],['maybe','not','take','him','to','dog','park','stupid'],['my','dalmation','is','so','cute','I','love','him','my'],['stop','posting','stupid','worthless','garbage'],['mr','licks','ate','my','steak','how','to','stop','to','stop','him'],['quit','buying','worthles','dog','food','stupid']] classVec=[0,1,0,1,0,1] return postingList,classVec #这里postingList,classVec分别为训练集和对应的分类
#编写一个bayes算法类,实现该算法 #默认构造方法 class NBayes(object): def __init__(self): self.vocabulary=[] #词典 self.idf=0 #词典的IDF权值向量 self.tf=0 #训练集中的权值矩阵 self.tdm=0 #P(x|yi) self.Pcates={} #P(yi)是一个类别字典 self.lables=[] #对应每个文本的分类,是一个外部导入的列表 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 i trainset for word in doc] #生成词典 self.vocabulary=list(tempset) self.vocablen=len(self.vocabulary) self.calc_wordfreq(trainset) #计算词频数据集 self.built_tdm() #按分类累计向量空间的每维值P(x|yi)
#cate_prob函数,计算在数据集中每个分类的概率P(yi) def cate_prob(self,classVec): self.lables=classVec labletemps=set(self.lables) #全部分类 for labletemp in labletemps: self.lables.count(labletemp) self.Pcates[labletemp]=float(self.lables.count(labletemp))/float(len(self.lables))
#calc_wordfreq函数,生成普通的词频向量 def calc_wordfreq(self,trainset): 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 for signleword in set(trainset[indx]): self.idf[0,self.vocabulary.index(signleword)]+=1
#built_tdm函数,按分类累计计算向量空间的每维值 def built_tdm(self): self.tdm=np.zeros([len(self.Pcates),self.vocablen]) sumlist=np.zeros([len(self.Pcates),1]) #统计每个分类的总值 for indx in xrange(self.doclength): #将同一类别的词向量空间值相加 self.tdm[self.lables[indx]]+=self.tf[indx] #统计每个分类的总值,它为一个标量 sumlist[self.lables[indx]]=np.sum(self.tdm[self.lables[indx]]) self.tdm=self.tdm/sumlist
#map2vocab函数,将测试集映射到当前词典 def map2vovocab(self,testdata): self.testdata=np.zeros([1,self.vocablen]) for word in testdata: self.testdata[0,self.vocabulary.index(word)]+=1
#predict函数,预测分类结果,输出预测的分类类别 def predict(self,testdata): if np.shape(testdata)[1]!=self.vocablen: #测试集长度与词典长度不相等,则退出 print "Error input" exit(0)
predvalue=0 #初始化类别概率 predclass="" #初始化类别名称 for tdm_vect,keyclass in zip(self.tdm,self.Pcates): temp=np.sum(testset*tdm_vect*self.Pcates[keyclass]) if temp>predvalue: predvalue=temp predclass=keyclass
return predclass
|