700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 《统计学习方法》—— 朴素贝叶斯方法 详细推导及其python3实现(二)

《统计学习方法》—— 朴素贝叶斯方法 详细推导及其python3实现(二)

时间:2019-01-22 11:29:47

相关推荐

《统计学习方法》—— 朴素贝叶斯方法 详细推导及其python3实现(二)

前言

在上一篇博客中,我们介绍了朴素贝叶斯方法以及详细推导。在这篇博客中,我们将介绍朴素贝叶斯的python3实现代码。

这里,我们将算法复述如下:

输入:数据集 T={(x1,y1),(x2,y2),...,(xN,yN)}T=\{(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)\}T={(x1​,y1​),(x2​,y2​),...,(xN​,yN​)},其中,xi=(xi(1),xi(2),...,xi(n))x_i=(x_i^{(1)}, x_i^{(2)}, ..., x_i^{(n)})xi​=(xi(1)​,xi(2)​,...,xi(n)​),xi(j)x_i^{(j)}xi(j)​是xix_ixi​的第jjj个特征, xi(j)∈{aj1,aj2,...,ajSj}x_i^{(j)}\in\{a_{j1}, a_{j2}, ..., a_{jS_j}\}xi(j)​∈{aj1​,aj2​,...,ajSj​​},yi∈{c1,c2,...,cK}y_i\in\{c_1, c_2, ..., c_K\}yi​∈{c1​,c2​,...,cK​};实例 xxx输出:实例 xxx 的分类 yyy

(1) 先验概率及条件概率

P(Y=ck)=∑i=1NI(yi=ck)NP(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)}{N}P(Y=ck​)=N∑i=1N​I(yi​=ck​)​

P(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)∑i=1NI(yi=ck)P(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum_{i=1}^NI(x_i^{(j)}=a_{jl}, y_i=c_k)}{\sum_{i=1}^NI(y_i=c_k)}P(X(j)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)∑i=1N​I(xi(j)​=ajl​,yi​=ck​)​

(2) 对于给定的 x=(x(1),x(2),...,x(n))x=(x^{(1)}, x^{(2)}, ..., x^{(n)})x=(x(1),x(2),...,x(n)),计算

P(Y=ck)Πj=1nP(X(j)=x(j)∣Y=ck)P(Y=c_k)\Pi_{j=1}^{n} P(X^{(j)}=x^{(j)}|Y=c_k)P(Y=ck​)Πj=1n​P(X(j)=x(j)∣Y=ck​)

(3) 确定实例 xxx 的类

y=arg max⁡ckP(Y=ck)Πj=1nP(X(j)=x(j)∣Y=ck)y=\argmax_{c_k}P(Y=c_k)\Pi_{j=1}^{n} P(X^{(j)}=x^{(j)}|Y=c_k)y=ck​argmax​P(Y=ck​)Πj=1n​P(X(j)=x(j)∣Y=ck​)

3. 贝叶斯估计

从上述算法的步骤(1)和步骤(2),可以看到,计算概率的分子分母可能为0。比如,计算先验概率的时候,假设类别有100种,但是我们只有50个数据,此时,必然出现某些类别出现的概率为0;再比如,计算条件概率时,相亲对象数据特征有 高矮 和 胖瘦 这两个维度,如果我们只取了高个子数据,就会导致 P(xi(1)=矮子,yi=ck)P(x_i^{(1)}=矮子, y_i=c_k)P(xi(1)​=矮子,yi​=ck​) 恒为0。

为了避免上述的计算概率为0的情况,我们在分子分母上分别加上一个正数 λ\lambdaλ:

P(Y=ck)=∑i=1NI(yi=ck)+λN+K⋅λP(Y=c_k)=\frac{\sum_{i=1}^NI(y_i=c_k)+\lambda}{N+K\cdot \lambda}P(Y=ck​)=N+K⋅λ∑i=1N​I(yi​=ck​)+λ​

P(X(j)=ajl∣Y=ck)=∑i=1NI(xi(j)=ajl,yi=ck)+λ∑i=1NI(yi=ck)+Sj⋅λP(X^{(j)}=a_{jl}|Y=c_k)=\frac{\sum_{i=1}^NI(x_i^{(j)}=a_{jl}, y_i=c_k)+\lambda}{\sum_{i=1}^NI(y_i=c_k)+S_j\cdot \lambda}P(X(j)=ajl​∣Y=ck​)=∑i=1N​I(yi​=ck​)+Sj​⋅λ∑i=1N​I(xi(j)​=ajl​,yi​=ck​)+λ​

可以简单验证,上面的表达式依然是概率。

4. 代码实现

注意:此处可以参考@miangangzhen的代码。这里,我们将用非常简单的代码来实现该问题的预测功能。

import pandas as pdimport numpy as np# 载入数据def load_data(file):data = pd.read_csv(file, header=None, names=['data1', 'data2', 'label'], sep=' ')return datax_y_data = load_data('D:/pycharm/myproject/data.txt')# 数据数量N, _ = x_y_data.shape############################### 类别及其数量categories = x_y_data['label'].value_counts()print('类别及其数量为\n', categories)# 先验概率pre_possibility = categories / Nprint('先验概率为\n', pre_possibility)############################### 同时限定某维度的值和类别时,数据的数量counts以及条件概率# 维度1dim1_cate = x_y_data.groupby(['data1', 'label']).count()dim1_cate = dim1_cate.reset_index().rename(columns={'data2': 'counts'})dim1_cate['possibilities'] = dim1_cate.apply(lambda x: x.counts / categories[x.label], axis=1)print('维度1+类别+条件概率:\n', dim1_cate)# 维度2dim2_cate = x_y_data.groupby(['data2', 'label']).count()dim2_cate = dim2_cate.reset_index().rename(columns={'data1': 'counts'})dim2_cate['possibilities'] = dim2_cate.apply(lambda x: x.counts / categories[x.label], axis=1)print('维度2+类别+条件概率:\n', dim2_cate)############################### 计算 x=(2, S)的类标记x = (2, 'S')res = []for label in list(categories.index): # 遍历类别#print('label=', label)# 计算该类别下的后验概率post_possibility = pre_possibility[label]# 遍历特征dim1_con_pos = dim1_cate[(dim1_cate['label'] == label) & (dim1_cate['data1'] == x[0])].iloc[0, 3]#print(dim1_con_pos)dim2_con_pos = dim2_cate[(dim2_cate['label'] == label) & (dim2_cate['data2'] == x[1])].iloc[0, 3]#print(dim2_con_pos)post_possibility *= dim1_con_pos * dim2_con_posres.append((label, post_possibility))#print('label=', label, ' post=', post_possibility)print('类标记及其对应后验概率为')print(res)

结果为

类别及其数量为1 9-1 6Name: label, dtype: int64先验概率为1 0.6-1 0.4Name: label, dtype: float64维度1+类别+条件概率:data1 label counts possibilities01-1 3 0.500000111 2 0.22222222-1 2 0.333333321 3 0.33333343-1 1 0.166667531 4 0.444444维度2+类别+条件概率:data2 label counts possibilities0L-1 1 0.1666671L1 4 0.4444442M-1 2 0.3333333M1 4 0.4444444S-1 3 0.5000005S1 1 0.111111类标记及其对应后验概率为[(1, 0.02222222222222222), (-1, 0.06666666666666667)]

可见,我们应该选取-1作为 xxx的类标记。

在下一篇博客中,我们将介绍决策树算法。

数据:数据来源为《统计学习方法》第二版的例4.1。复制保存为.txt文件。

1 S -11 M -11 M 11 S 11 S -12 S -12 M -12 M 1 2 L 12 L 13 L 13 M 13 M 13 L 1 3 L -1

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。