朴素贝叶斯分类器

来源:互联网 发布:淘宝冲洗胶卷 编辑:程序博客网 时间:2024/05/17 01:52
#coding=utf-8from numpy import *def load_data():    #创建样本数据    data=[    ['my','dog','has','flea','problems','help','please'],    ['maybe','not','take','him','to','dog','park','stupid'],    ['my','dalmation','is','so','cute','I','love','him'],    ['stop','posting','stupid','worthless','garbage'],    ['mr','licks','ate','my','steak','how','to','stop','him'],    ['quit','buying','worthless','dog','food','stupid']    ]    labels=[0,1,0,1,0,1]#1 Y  0 N    return data,labelsdef create_vocabulary(data):    #创建词汇表    vocabulary=set([])    #初始化一个空集    for w in data:        vocabulary=vocabulary | set(w)        #把数据中各列表进行并集操作         # 符号 ‘|’ type‘set’类型才支持,也就是并集中所有元素都是唯一 的     vocabulary=list(vocabulary)    return vocabularydef vocabulary_count(vocabulary,exmaple):    #对样本中出现在词汇表中的单词进行计数    return_vec=[0]*len(vocabulary)    #在保持列表中元素个数不变的情况下将列表中各元素变为0    for w in exmaple:        #遍历例子中的单词        if w in vocabulary:            return_vec[vocabulary.index(w)]+=1            #如果单词在词汇表里,则使词汇表中这个位置的0变为出现的次数        else:            print 'the word: %s is not in my vocabulary'%w            #单词不在词汇表的情况    return return_vec#def create_train(): #   """创建训练样本""" #   data,labels=load_data()  #  vocabulary=create_vocabulary(data)   # train_matrix=[]    #创建一个训练矩阵,这个可以单独拿出来创建    #for a in data:     #   train_matrix.append(vocabulary_count(vocabulary,a))        #每个样本在词汇表中的出现情况    #return train_matrix,labelsdef train_bayes(train_matrix,train_category):    """训练贝叶斯分类器  即根据样本计算出一个适当的概率,当实例满足某一类别的概率    则该实例就属于这一类别"""    num_train=len(train_matrix)    #有几组训练数据    num_words=len(train_matrix[0])    #这些训练数据所组成的词汇表的单词量    p_abusive=sum(train_category)/float(num_train)    #3/6 侮辱性种类和/数据总量    p0_num=ones(num_words)    #初始化词汇表,使各项计数为1 ones(32) 防止一个为0乘积全为0的情况    p1_num=ones(num_words)    #同上    p0_denom=2.0    p1_denom=2.0    #初始化条件概率的分母    for i in range(num_train):        if train_category[i]==1:            #判断第i个类别下的语句是不是侮辱性            p1_num+=train_matrix[i]            #此语句中所出现的各词汇在词汇表中进行计数            p1_denom+=sum(train_matrix[i])            #对此类型句子的总词数进行统计        else:            p0_num+=train_matrix[i]            p0_denom+=sum(train_matrix[i])            #同上正常词的累计    p1_vect=log(p1_num/p1_denom)    #在侮辱性样本中,各词汇出现的频数/出现的总次数。使用log是为了防止下溢    p0_vect=log(p0_num/p0_denom)    #同上正常的    return p0_vect,p1_vect,p_abusive    #p1_vect即侮辱性语句中各词汇的频率def bayes_split(train_matrix,p0_vect,p1_vect,p_abusive):    """贝叶斯分类器"""    p1=sum(train_matrix*p1_vect)+log(p_abusive)    #各语句乘以侮辱性概率。    p0=sum(train_matrix*p0_vect)+log(1.0-p_abusive)    #各语句乘以正常的概率    if p1>p0:        return 1    #概率比较,哪个大就是哪类    else:        return 0def test_bayes():    """测试贝叶斯分类器"""    data,labels=load_data()    vocabulary=create_vocabulary(data)    train_matrix=[]    #创建一个训练矩阵,这个可以单独拿出来创建    for a in data:        train_matrix.append(vocabulary_count(vocabulary,a))        #每个样本在词汇表中的出现情况    p0_vect,p1_vect,p_abusive=train_bayes(train_matrix,labels)    result=bayes_split(train_matrix[0],p0_vect,p1_vect,p_abusive)    #这步train_matrix是所有样本,单判断某一样本可以写成train_matrix[0] 或 [1]...    return result

基本思想就是:

给定各类别一个概率,用样本乘以概率哪个大就是哪个类别。


样本 a 下各元素在样本总数下的概率分布为[x,0,y,0],其类别是Y。

样本 b 下各元素在样本总数下的概率分布为[0,0,m,n],其类别是N。

上面就是训练得到的结果。下面判断实例 c 属于哪一类,就是以 c  的分布频数分别乘以两个类别的概率,哪个概率大就是哪个类别。





0 0
原创粉丝点击