Python实现朴素贝叶斯(NB)

      这篇文章主要关于朴素贝叶斯算法的用python具体实现,网上关于NB算法的文章很多,大多围绕着《机器学习实战》这本书来着。在此,对于NB算法的原理我大概介绍一下。

贝叶斯定理:

    已知某条件概率,如何得到两个条件交换后的概率。即:已知 求


假设 A,B独立 P(A,B)=P(A)*P(B)

 

朴素贝叶斯原理:

对于给定的待分类像项,求解在此基础上每个类别出现的概率,最大的即作为最终分类的类别。

步骤:

1、 设为待分类项,ai为每个待分类属性

2、 类别集合为

3、 计算的概率

4、 取第3步骤概率值最大的为待分类项的类别。

具体实现步骤:

把上述第3步骤转化成求每个特征的条件概率。

因为最终考虑的是在每个类别中概率值的大小,所以去掉除数x,不影响最终分类结果。

 

1、 即转化成

2、 假设各个特征相互独立,则


========================================================

代码:

1、首先实现计算每个类别的概率

2、计算每个特征在不同类下的条件概率(每个特征出现的次数/类别下特征的总个数)

3、计算 

4.判断大小                      

具体代码如下:

# -*- coding: utf-8 -*-
import numpy as np
import glob    
def load_data():
    text=[]
    y=[1,0,1,1,1,0,1]
    with open('e:/a/ceshi.txt','r',encoding='utf-8') as infile:
        for line in infile:
            line=line.strip()
            text.append(line)   
    return text,y

def cteat_dit(alltext):
    term_dict={}
    for doc in alltext:
        for term in doc.split():
            term_dict[term]=1
    term_dict=dict(zip(term_dict.keys(),range(len(term_dict)) ))
    return term_dict
def  get_vec(term_dict,input_data):
    #将词汇转化成向量,简单的词袋模型
    vec=[0]*len(term_dict)
    for i in input_data.split():
        if i in term_dict:
            vec[term_dict[i]]=1
    return vec

def train_NB(text,y,term_dict):
    #===================================================
    #1.  计算y的概率
    
    class_set=sorted(list(set(y)))
    class_dict=dict(zip(class_set,range(len(class_set))))
   # print(class_dict){0: 0, 1: 1}
    class_prob=[0]*len(class_dict)
    class_count=[0]*len(class_dict)
    for i in y:
        class_count[class_dict[i]]+=1
    class_prob=[i/len(y) for i in class_count]
    #==================================================
    # 2. 计算每个词在不同类别下出现的次数 
    term_calss_df=np.zeros((len(term_dict),len(class_dict)))  
    
    for i in  range(len(y)):
        class_index=class_dict[y[i]]
        for term in text[i].split():#针对每一个文档
            term_index=term_dict[term]
            term_calss_df[term_index][class_index]+=1
    tf=term_calss_df
    #避免某一个概率值为0,所有词出现数+1
    tfg=tf+1
    sumh=np.sum(tf,axis=0)
    prob=tfg/sumh
    
    
    return prob,class_prob
def classifyNB(test,prob,class_prob,term_dict):
    '''
    分类函数
    '''
    datavec=[]
    for line in test:
        vec=get_vec(term_dict,line)
        datavec.append(vec)  
    #===================================================
    prob=np.log(prob)#避免下溢,不影响最终分类结果
    class_result=[]
    for i in datavec:
        
        i=np.array(i)
        i=i.reshape(-1,1)
        C_prob=prob*i
        print('############')
        all_prob=np.sum(C_prob,0)+np.log(class_prob)
        class_result.append(all_prob)
    return class_result
        
        
#=========================
#加载测试集

def load():
    text=[]
    with open('e:/a/1.txt','r',encoding='utf-8') as infile:
        for line in infile:
            line=line.strip()
            text.append(line)
    return text

def testNB():
    
    text, y=load_data()
    term_dict=cteat_dit(text)
    
    prob,class_prob =train_NB(text,y,term_dict)
    test=load()
    class_result=classifyNB(test,prob,class_prob,term_dict)
    for all_prob in class_result:
        if all_prob[1] >all_prob[0]:
            print('1') #分类结果
        else: 
            print('0') 
            
if __name__=='__main__':
    
    testNB()


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值