首先介绍以下贝叶斯公式:
这个是什么意思呢?该如何用呢?相信大家有一定的概率知识基础的同学,对先验概率及条件概率都比较清楚,在这里简单的说一下这条公式的含义:
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