用Python手写一个朴素贝叶斯算法(带案例)

首先介绍以下贝叶斯公式:

这个是什么意思呢?该如何用呢?相信大家有一定的概率知识基础的同学,对先验概率及条件概率都比较清楚,在这里简单的说一下这条公式的含义:

1、首先代表的意思就是在B条件发生的情况下,Ai发生的概率

2、这公式代表的意思就是,在所有A类的结果中,B发生的概率之和,也就是B的概率

3、所以在这个公式,表达的意思就是(B条件发生的情况下,Ai发生的概率=Ai与B同时发生的概率占整个B的概率的多少)

 于是这个公式就可以转化为,P(A_{i}|B)=P(B|A_{i})*P(A_{i})/P(B)=P(A_{i}B)/P(B)(加上后面这个公式,是为了让同学们更好的理解,实际上的使用,一般只用第一个等式的公式)

4、因此,由于P(B)是固定得,所以发生得概率与分子相关,也就是分子越大,概率越高

仔细品了一下这个公式,也确实发现其很适合用在分类的算法中;对于这个贝叶斯公式来说,就像是求B属于Ai的概率,运用在分类中,就得先求出B属于每一类中的可能,找出最大的,这就是朴素贝叶斯的算法思路。

由此得到朴素贝叶斯分类算法流程:

1、利用贝叶斯公式,求出预测得结果属于每一种类别得可能

2、找出最大值

 

代码流程:

1、先将样本数据处理成字典,并统计每一类发生得个数(第一个函数)

2、将待预测得样本写入,并根据之前得样本数据,对分类结果进行求概率,得出最大概率得分类结果

#k代表分类的结果
#将数据处理成字典,用于保存样本数据中得类别数据存储情况
def chuli(data_1,k):
    dict_1={}
    col_num=data_1.columns.tolist()
    col_num_1=col_num[1:-1]
    all_number=len(data_1)
    #all_result为分类的结果类型
    all_result=dict(data_1.iloc[:,k-1].value_counts())
    all_result_1=list(dict(data_1.iloc[:,k-1].value_counts()).keys())
    #将每个结果写入
    for result in all_result_1:
        if result not in dict_1:
            dict_1.setdefault(result,{})
        for col in col_num_1:
            if col not in dict_1[result]:
                dict_1[result].setdefault(col,{})
            all_result_2=data_1[col].value_counts().index.tolist()
            for result_1 in all_result_2:
                number_1=len(data_1.loc[(data_1[col_num[k-1]]==result) & (data_1[col]==result_1)])
                if result_1 not in dict_1[result][col]:
                    dict_1[result][col].setdefault(result_1,number_1)
    return dict_1,all_result

#对每待预测得结果进行贝叶斯公式得计算,并得出预测类别与概率
def jisuan(dict_1,dict_2,need_data_1):
    new_col=need_data_1.columns.tolist()
    new_list_5=[]
    for i in range(len(need_data_1)):
        all_result_2=dict_1.keys()
        dict_4={}
        for i1 in all_result_2:
            new_list=[]
            for col in range(len(new_col)):
                number_1=dict_1[i1][new_col[col]][need_data_1.iloc[i,col]]/dict_2[i1]
                new_list.append(number_1)
                #print(dict_4)
            all_sum=dict_2[i1]/sum(list(dict_2.values()))
            for i2 in new_list:
                all_sum=all_sum*i2
            dict_4.setdefault(i1,all_sum)
        #print(dict_4)
        max_str=max(dict_4,key=dict_4.get)
        max_value=dict_4[max_str]
        new_list_5.append([max_str,max_value])
    return new_list_5

这里放出一个我写过得案例:

用Python手写一个朴素贝叶斯算法(带案例)_第1张图片

待预测数据:

返回得两个存储字典:

对待预测样本进行预测:

 

根据自已手写得计算结果:P(No)*P(有房=是|No)*P(婚姻状况=已婚|No)=7/10*3/7*4/7=0.1714285714285714

而P(Yes)*P(有房=是|Yes)*P(婚姻状况=已婚|Yes)=3/10*0*0=0

 

所以得出结果为NO,概率为0.1714

 

你可能感兴趣的:(用Python手写一个朴素贝叶斯算法(带案例))