python实现朴素贝叶斯算法_用python编写的朴素贝叶斯算法(附case),Python,手写,一个,带,案例...

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

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

1、首先

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

2、

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

3、所以在这个公式,表达的意思就是(B条件发生的情况下,Ai发生的概率=Ai与B同时发生的概率占整个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

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

待预测数据:

返回得两个存储字典:

对待预测样本进行预测:

根据自已手写得计算结果: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实现朴素贝叶斯算法)