文章目录
- 1. 朴素贝叶斯法的学习与分类
- 1.1 基本方法
- 2. 参数估计
- 2.1 极大似然估计
- 2.2 学习与分类算法
- 2.2.1 例题
- 2.2.2 例题代码
- 2.3 贝叶斯估计(平滑)
- 2.3.1 例题
- 2.3.2 例题代码
- 3. 自编程实现NB
- 4. sklearn.naive_bayes
1. 朴素贝叶斯法的学习与分类
1.1 基本方法
- 输入空间 χ⊆Rn\chi \subseteq R^nχ⊆Rn , n维向量的集合
- 输出空间:类标记集合 Y′={c1,c2,...ck}Y'=\{c_1,c_2,...c_k\}Y′={c1,c2,...ck}
- 输入:特征向量 x∈χx \in \chix∈χ
- 输出:类标记 y∈Y′y \in Y'y∈Y′
- XXX 是空间 χ\chiχ 上的随机向量
- YYY 是输出空间 Y′Y'Y′ 上的随机变量
- 训练数据集 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)} 由 P(X,Y)P(X,Y)P(X,Y)联合概率分布 独立同分布产生
目标 :通过训练数据集学习 联合概率分布 P(X,Y)P(X,Y)P(X,Y)
- 先验概率分布: P(Y=ck),k=1,2,...,KP(Y=c_k), k=1,2,...,KP(Y=ck),k=1,2,...,K
- 条件概率分布:P(X=x∣Y=ck)=P(X(1)=x(1),...,X(n)=x(n)∣Y=ck),k=1,2,...,KP(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},...,X^{(n)}=x^{(n)}|Y=c_k), k=1,2,...,KP(X=x∣Y=ck)=P(X(1)=x(1),...,X(n)=x(n)∣Y=ck),k=1,2,...,K
上面两项相乘即可得到联合概率 P(X,Y)P(X,Y)P(X,Y)
但是 P(X=x∣Y=ck)P(X=x|Y=c_k)P(X=x∣Y=ck) 有 指数级 数量的参数,如果 x(j)x^{(j)}x(j) 的取值有 SjS_jSj 个, j=1,2,...,nj=1,2,...,nj=1,2,...,n, YYY 可取值有 KKK 个,总的参数个数为 K∏j=1nSjK \prod_{j=1}^n S_jK∏j=1nSj, 不可行
做出 条件独立性假设 :X(j)X^{(j)}X(j) 之间独立
P(X=x∣Y=ck)=P(X(1)=x(1),...,X(n)=x(n)∣Y=ck)=∏j=1nP(X(j)=x(j)∣Y=ck)(1)P(X=x|Y=c_k)=P(X^{(1)}=x^{(1)},...,X^{(n)}=x^{(n)}|Y=c_k)=\prod_{j=1}^nP(X^{(j)}=x^{(j)}|Y=c_k) \quad\quad (1)P(X=x∣Y=ck)=P(X(1)=x(1),...,X(n)=x(n)∣Y=ck)=∏j=1nP(X(j)=x(j)∣Y=ck)(1)
朴素贝叶斯法实际上学习到生成数据的机制,所以属于生成模型。条件独立假设等于是说用于分类的特征在类确定的条件下都是条件独立的。这一假设使朴素贝叶斯法变得简单,但有时会牺牲一定的分类准确率。
朴素贝叶斯法分类时,对给定的输入 xxx,通过学习到的模型计算后验概率分布P(Y=ck∣X=x)P(Y=c_k | X=x)P(Y=ck∣X=x),将后验概率最大的类作为 xxx 的类输出。
推导 :
P(Y=ck∣X=x)=P(X=x∣Y=ck)P(Y=ck)∑kP(X=x∣Y=ck)P(Y=ck)(2)P(Y=c_k | X=x) = \frac {P(X=x|Y=c_k)P(Y=c_k)}{\sum\limits_k P(X=x|Y=c_k)P(Y=c_k)} \quad\quad (2)P(Y=ck∣X=x)=k∑P(X=x∣Y=ck)P(Y=ck)P(X=x∣Y=ck)P(Y=ck)(2) 贝叶斯定理
将(1)代入(2)有:
P(Y=ck∣X=x)=P(Y=ck)∏jP(X(j)=x(j)∣Y=ck)∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck),k=1,2,...,KP(Y=c_k | X=x) = \frac {P(Y=c_k)\prod\limits_{j}P(X^{(j)}=x^{(j)}|Y=c_k)}{\sum\limits_k P(Y=c_k)\prod\limits_{j}P(X^{(j)}=x^{(j)}|Y=c_k)}, k=1,2,...,K \quad\quadP(Y=ck∣X=x)=k∑P(Y=ck)j∏P(X(j)=x(j)∣Y=ck)P(Y=ck)j∏P(X(j)=x(j)∣Y=ck),k=1,2,...,K
所以 朴素贝叶斯分类器表示为:
y=f(x)=arg maxckP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)\color{red} y=f(x)=\argmax\limits_{c_k} \frac {P(Y=c_k)\prod\limits_{j}P(X^{(j)}=x^{(j)}|Y=c_k)}{\sum\limits_k P(Y=c_k)\prod\limits_{j}P(X^{(j)}=x^{(j)}|Y=c_k)}y=f(x)=ckargmaxk∑P(Y=ck)j∏P(X(j)=x(j)∣Y=ck)P(Y=ck)j∏P(X(j)=x(j)∣Y=ck)
上式中,分母对所有的 ckc_kck 都是相同的,所以
y=arg maxckP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)\color{red} y=\argmax\limits_{c_k} P(Y=c_k) \prod\limits_{j} P(X^{(j)}=x^{(j)}|Y=c_k)y=ckargmaxP(Y=ck)j∏P(X(j)=x(j)∣Y=ck)
2. 参数估计
2.1 极大似然估计
- 先验概率: P(Y=ck)=(yi=ck的样本数)/NP(Y=c_k)=(y_i=c_k的样本数)/NP(Y=ck)=(yi=ck的样本数)/N
- 条件概率分布:P(X(j)=x(j)∣Y=ck)P(X^{(j)}=x^{(j)}|Y=c_k)P(X(j)=x(j)∣Y=ck)
设第 jjj 个特征 x(j)x^{(j)}x(j) 可能的取值为 {aj1,aj2,...,ajSj}\{a_{j1},a_{j2},...,a_{jSj}\}{aj1,aj2,...,ajSj}, 条件概率的极大似然估计为:
xi(j)x_i^{(j)}xi(j) 是第 iii 个样本的第 jjj 个特征; ajla_{jl}ajl 是第 jjj 个特征可能的第 lll 个值,III 是指示函数
2.2 学习与分类算法
朴素贝叶斯算法:
输入:
- 训练数据 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))Tx_i=(x_i^{(1)},x_i^{(2)},...,x_i^{(n)})^Txi=(xi(1),xi(2),...,xi(n))T,xi(j)x_i^{(j)}xi(j) 是第 iii 个样本的第 jjj 个特征
- xi(j)∈{aj1,aj2,...,ajSj}x_i^{(j)} \in \{a_{j1},a_{j2},...,a_{jSj}\}xi(j)∈{aj1,aj2,...,ajSj}, ajla_{jl}ajl 是第 jjj 个特征可能的第 lll 个值, j=1,2,...,n;l=1,2,...,Sjj=1,2,...,n; l=1,2,...,S_jj=1,2,...,n;l=1,2,...,Sj
- yi∈{c1,c2,...ck}y_i \in \{c_1,c_2,...c_k\}yi∈{c1,c2,...ck}
- 实例 xxx
输出:
- 实例 xxx 的分类
步骤:
- 计算先验概率及条件概率
P(Y=ck)=(yi=ck的样本数)/N,k=1,2,...,KP(Y=c_k)=(y_i=c_k的样本数)/N, k=1,2,...,KP(Y=ck)=(yi=ck的样本数)/N,k=1,2,...,K
- 对于给定的实例 x=(x(1),x(2),...,x(n))Tx=(x^{(1)},x^{(2)},...,x^{(n)})^Tx=(x(1),x(2),...,x(n))T, 计算
P(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck),k=1,2,...,KP(Y=c_k) \prod\limits_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k), k=1,2,...,KP(Y=ck)j=1∏nP(X(j)=x(j)∣Y=ck),k=1,2,...,K - 确定实例 xxx 的类
y=arg maxckP(Y=ck)∏j=1nP(X(j)=x(j)∣Y=ck)y=\argmax\limits_{c_k} P(Y=c_k) \prod\limits_{j=1}^n P(X^{(j)}=x^{(j)}|Y=c_k)y=ckargmaxP(Y=ck)j=1∏nP(X(j)=x(j)∣Y=ck)
2.2.1 例题
例题:
用下表训练数据学习一个贝叶斯分类器并确定 x=(2,S)Tx=(2,S)^Tx=(2,S)T 的类标记 yyy。X(1),X(2)X^{(1)},X^{(2)}X(1),X(2) 为特征,取值的集合分别为 A1={1,2,3},A2={S,M,L}A_1=\{1,2,3\}, A_2=\{S,M,L\}A1={1,2,3},A2={S,M,L}, YYY 为类标记,Y∈C={1,−1}Y \in C=\{1,-1\}Y∈C={1,−1}。
训练数据 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X(1)X^{(1)}X(1) | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 |
X(2)X^{(2)}X(2) | S | M | M | S | S | S | M | M | L | L | L | M | M | L | L |
YYY | -1 | -1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 |
解:
先验概率 P(Y=1)=915,P(Y=−1)=615P(Y=1)=\frac {9}{15},P(Y=-1)=\frac {6}{15}P(Y=1)=159,P(Y=−1)=156
条件概率
P(X(1)=1∣Y=1)=29,P(X(1)=2∣Y=1)=39,P(X(1)=3∣Y=1)=49P(X^{(1)}=1|Y=1)= \frac{2}{9},P(X^{(1)}=2|Y=1)= \frac{3}{9},P(X^{(1)}=3|Y=1)= \frac{4}{9}P(X(1)=1∣Y=1)=92,P(X(1)=2∣Y=1)=93,P(X(1)=3∣Y=1)=94
P(X(2)=S∣Y=1)=19,P(X(2)=M∣Y=1)=49,P(X(2)=L∣Y=1)=49P(X^{(2)}=S|Y=1)= \frac{1}{9},P(X^{(2)}=M|Y=1)= \frac{4}{9},P(X^{(2)}=L|Y=1)= \frac{4}{9}P(X(2)=S∣Y=1)=91,P(X(2)=M∣Y=1)=94,P(X(2)=L∣Y=1)=94
P(X(1)=1∣Y=−1)=36,P(X(1)=2∣Y=−1)=26,P(X(1)=3∣Y=−1)=16P(X^{(1)}=1|Y=-1)= \frac{3}{6},P(X^{(1)}=2|Y=-1)= \frac{2}{6},P(X^{(1)}=3|Y=-1)= \frac{1}{6}P(X(1)=1∣Y=−1)=63,P(X(1)=2∣Y=−1)=62,P(X(1)=3∣Y=−1)=61
P(X(2)=S∣Y=−1)=36,P(X(2)=M∣Y=−1)=26,P(X(2)=L∣Y=−1)=16P(X^{(2)}=S|Y=-1)= \frac{3}{6},P(X^{(2)}=M|Y=-1)= \frac{2}{6},P(X^{(2)}=L|Y=-1)= \frac{1}{6}P(X(2)=S∣Y=−1)=63,P(X(2)=M∣Y=−1)=62,P(X(2)=L∣Y=−1)=61
对给定的 x=(2,S)Tx=(2,S)^Tx=(2,S)T 计算:
Y=1Y=1Y=1 时:
P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=915∗39∗19=145\quad \quad\ \quad P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{9}{15} * \frac{3}{9} * \frac{1}{9} = \frac{1}{45} P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=159∗93∗91=451
Y=−1Y=-1Y=−1 时:
P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=615∗26∗36=115\quad \quad\ \quad P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{6}{15} * \frac{2}{6} * \frac{3}{6} = \frac{1}{15} P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=156∗62∗63=151
Y=−1Y=-1Y=−1 时的概率最大,所以 y=−1y=-1y=−1。
2.2.2 例题代码
# -*- coding:utf-8 -*-
# Python 3.7
# @Time: 2020/1/19 22:08
# @Author: Michael Ming
# @Website: https://michael.blog.csdn.net/
# @File: naiveBayes.pyimport numpy as np
data = [[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],['S', 'M', 'M', 'S', 'S', 'S', 'M', 'M', 'L', 'L', 'L', 'M', 'M', 'L', 'L'],[-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]]
X1 = []
X2 = []
Y = []
for i in range(len(data[0])): # 统计数据种类if data[0][i] not in X1:X1.append(data[0][i])if data[1][i] not in X2:X2.append(data[1][i])if data[2][i] not in Y:Y.append(data[2][i])
nY = [0] * len(Y)
for i in range(len(data[0])): # 统计Yi的数量nY[Y.index(data[2][i])] += 1
PY = [0.0] * len(Y)
for i in range(len(Y)):PY[i] = nY[i] / len(data[0]) # Yi的概率
PX1_Y = np.zeros((len(X1), len(Y))) # 条件概率
PX2_Y = np.zeros((len(X2), len(Y)))for i in range(len(data[0])):PX1_Y[X1.index(data[0][i])][Y.index(data[2][i])] += 1 # 统计频数PX2_Y[X2.index(data[1][i])][Y.index(data[2][i])] += 1
for i in range(len(Y)):PX1_Y[:, i] /= nY[i] # 转成条件概率PX2_Y[:, i] /= nY[i]
x = [2, 'S']
PX_Y = [PX1_Y, PX2_Y]
X = [X1, X2]
ProbY = [0.0] * len(Y)
for i in range(len(Y)):ProbY[i] = PY[i]for j in range(len(x)):ProbY[i] *= PX_Y[j][X[j].index(x[j])][i]
maxProb = -1
idx = -1
for i in range(len(Y)): # 取最大的概率if ProbY[i] > maxProb:maxProb = ProbY[i]idx = i
print(Y)
print(ProbY)
print(x, ", 最有可能对应的贝叶斯估计 y = %d" % (Y[idx]))
# 运行结果
[-1, 1]
[0.06666666666666667, 0.02222222222222222]
[2, 'S'] , 最有可能对应的贝叶斯估计 y = -1
2.3 贝叶斯估计(平滑)
用极大似然估计可能会出现所要估计的概率值为0的情况。会影响到后验概率的计算结果,使分类产生偏差。解决方法是采用贝叶斯估计。
条件概率的贝叶斯估计:
式中 λ≥0\lambda \geq 0λ≥0, 取 0 时,就是极大似然估计;
取正数,对随机变量各个取值的频数上赋予一个正数;
常取 λ=1\lambda = 1λ=1,这时称为 拉普拉斯平滑(Laplacian smoothing)
先验概率的贝叶斯估计:
2.3.1 例题
例题:(与上面一致,采用拉普拉斯平滑估计概率,取 λ=1\lambda=1λ=1)
用下表训练数据学习一个贝叶斯分类器并确定 x=(2,S)Tx=(2,S)^Tx=(2,S)T 的类标记 yyy。X(1),X(2)X^{(1)},X^{(2)}X(1),X(2) 为特征,取值的集合分别为 A1={1,2,3},A2={S,M,L}A_1=\{1,2,3\}, A_2=\{S,M,L\}A1={1,2,3},A2={S,M,L}, YYY 为类标记,Y∈C={1,−1}Y \in C=\{1,-1\}Y∈C={1,−1}。
训练数据 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X(1)X^{(1)}X(1) | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 |
X(2)X^{(2)}X(2) | S | M | M | S | S | S | M | M | L | L | L | M | M | L | L |
YYY | -1 | -1 | 1 | 1 | -1 | -1 | -1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | -1 |
解:
先验概率 P(Y=1)=9+115+2=1017,P(Y=−1)=6+115+2=717P(Y=1)=\frac {9+1}{15+2}=\frac{10}{17},P(Y=-1)=\frac {6+1}{15+2}=\frac{7}{17}P(Y=1)=15+29+1=1710,P(Y=−1)=15+26+1=177
条件概率
P(X(1)=1∣Y=1)=2+19+3=312,P(X(1)=2∣Y=1)=3+19+3=412,P(X(1)=3∣Y=1)=4+19+3=512P(X^{(1)}=1|Y=1)= \frac{2+1}{9+3}=\frac{3}{12},P(X^{(1)}=2|Y=1)= \frac{3+1}{9+3}=\frac{4}{12},P(X^{(1)}=3|Y=1)= \frac{4+1}{9+3}=\frac{5}{12}P(X(1)=1∣Y=1)=9+32+1=123,P(X(1)=2∣Y=1)=9+33+1=124,P(X(1)=3∣Y=1)=9+34+1=125
P(X(2)=S∣Y=1)=1+19+3=212,P(X(2)=M∣Y=1)=4+19+3=512,P(X(2)=L∣Y=1)=4+19+3=512P(X^{(2)}=S|Y=1)= \frac{1+1}{9+3}=\frac{2}{12},P(X^{(2)}=M|Y=1)= \frac{4+1}{9+3}=\frac{5}{12},P(X^{(2)}=L|Y=1)= \frac{4+1}{9+3}=\frac{5}{12}P(X(2)=S∣Y=1)=9+31+1=122,P(X(2)=M∣Y=1)=9+34+1=125,P(X(2)=L∣Y=1)=9+34+1=125
P(X(1)=1∣Y=−1)=3+16+3=49,P(X(1)=2∣Y=−1)=2+16+3=39,P(X(1)=3∣Y=−1)=1+16+3=29P(X^{(1)}=1|Y=-1)= \frac{3+1}{6+3}=\frac{4}{9},P(X^{(1)}=2|Y=-1)= \frac{2+1}{6+3}=\frac{3}{9},P(X^{(1)}=3|Y=-1)= \frac{1+1}{6+3}=\frac{2}{9}P(X(1)=1∣Y=−1)=6+33+1=94,P(X(1)=2∣Y=−1)=6+32+1=93,P(X(1)=3∣Y=−1)=6+31+1=92
P(X(2)=S∣Y=−1)=3+16+3=49,P(X(2)=M∣Y=−1)=2+16+3=39,P(X(2)=L∣Y=−1)=1+16+3=29P(X^{(2)}=S|Y=-1)= \frac{3+1}{6+3}=\frac{4}{9},P(X^{(2)}=M|Y=-1)= \frac{2+1}{6+3}=\frac{3}{9},P(X^{(2)}=L|Y=-1)= \frac{1+1}{6+3}=\frac{2}{9}P(X(2)=S∣Y=−1)=6+33+1=94,P(X(2)=M∣Y=−1)=6+32+1=93,P(X(2)=L∣Y=−1)=6+31+1=92
对给定的 x=(2,S)Tx=(2,S)^Tx=(2,S)T 计算:
Y=1Y=1Y=1 时:
P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=1017∗412∗212=5153=0.0327\quad \quad\ \quad P(Y=1)P(X^{(1)}=2|Y=1)P(X^{(2)}=S|Y=1)=\frac{10}{17} * \frac{4}{12} * \frac{2}{12} = \frac{5}{153}=0.0327 P(Y=1)P(X(1)=2∣Y=1)P(X(2)=S∣Y=1)=1710∗124∗122=1535=0.0327
Y=−1Y=-1Y=−1 时:
P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=717∗39∗49=28459=0.0610\quad \quad\ \quad P(Y=-1)P(X^{(1)}=2|Y=-1)P(X^{(2)}=S|Y=-1)=\frac{7}{17} * \frac{3}{9} * \frac{4}{9} = \frac{28}{459}=0.0610 P(Y=−1)P(X(1)=2∣Y=−1)P(X(2)=S∣Y=−1)=177∗93∗94=45928=0.0610
Y=−1Y=-1Y=−1 时的概率最大,所以 y=−1y=-1y=−1。
2.3.2 例题代码
# -*- coding:utf-8 -*-
# Python 3.7
# @Time: 2020/1/19 22:08
# @Author: Michael Ming
# @Website: https://michael.blog.csdn.net/
# @File: naiveBayes.pyimport numpy as npdata = [[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],['S', 'M', 'M', 'S', 'S', 'S', 'M', 'M', 'L', 'L', 'L', 'M', 'M', 'L', 'L'],[-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]]
X1 = []
X2 = []
Y = []
for i in range(len(data[0])): # 统计数据种类if data[0][i] not in X1:X1.append(data[0][i])if data[1][i] not in X2:X2.append(data[1][i])if data[2][i] not in Y:Y.append(data[2][i])
nY = [0] * len(Y)
for i in range(len(data[0])): # 统计Yi的数量nY[Y.index(data[2][i])] += 1
PY = [0.0] * len(Y)
for i in range(len(Y)):PY[i] = (nY[i]+1) / (len(data[0])+len(Y)) # Yi的概率,+1为平滑
PX1_Y = np.zeros((len(X1), len(Y))) # 条件概率
PX2_Y = np.zeros((len(X2), len(Y)))for i in range(len(data[0])):PX1_Y[X1.index(data[0][i])][Y.index(data[2][i])] += 1 # 统计频数PX2_Y[X2.index(data[1][i])][Y.index(data[2][i])] += 1
for i in range(len(Y)):PX1_Y[:, i] = (PX1_Y[:, i] + 1)/(nY[i]+len(X1)) # 转成条件概率,带平滑PX2_Y[:, i] = (PX2_Y[:, i] + 1)/(nY[i]+len(X2))
x = [2, 'S']
PX_Y = [PX1_Y, PX2_Y]
X = [X1, X2]
ProbY = [0.0] * len(Y)
for i in range(len(Y)):ProbY[i] = PY[i]for j in range(len(x)):ProbY[i] *= PX_Y[j][X[j].index(x[j])][i]
maxProb = -1
idx = -1
for i in range(len(Y)): # 取最大的概率if ProbY[i] > maxProb:maxProb = ProbY[i]idx = i
print(Y)
print(ProbY)
print(x, ", 最有可能对应的贝叶斯估计 y = %d" % (Y[idx]))
# 运行结果
[-1, 1]
[0.06100217864923746, 0.0326797385620915]
[2, 'S'] , 最有可能对应的贝叶斯估计 y = -1
3. 自编程实现NB
特征的概率分布假设为高斯分布
概率密度函数:
P(xi∣yk)=12πσyk2exp(−(xi−μyk)22σyk2)P(x_i | y_k)=\frac{1}{\sqrt{2\pi\sigma^2_{y_k}}}exp(-\frac{(x_i-\mu_{y_k})^2}{2\sigma^2_{y_k}})P(xi∣yk)=2πσyk21exp(−2σyk2(xi−μyk)2)
数学期望(mean):μ\muμ,方差:σ2=∑(X−μ)2N\sigma^2=\frac{\sum(X-\mu)^2}{N}σ2=N∑(X−μ)2
抄自:https://github.com/fengdu78/lihang-code,并修复其中一个Bug
import mathclass GausNB():def __init__(self):self.model = None@staticmethoddef mean(X): # 均值return sum(X) / float(len(X))def std(self, X): # 标准差avg = self.mean(X)return np.sqrt(sum([pow(x - avg, 2) for x in X]) / float(len(X)))def gaus_prob(self, x, mean, std): # 高斯概率密度exponent = math.exp(-(math.pow(x - mean, 2) / (2 * math.pow(std, 2))))return (1 / (math.sqrt(2 * math.pi) * std)) * exponentdef summarize(self, train_data):summaries = [(self.mean(i), self.std(i)) for i in zip(*train_data)]return summaries # 返回 [(各特征的均值,标准差),(),()...]]def fit(self, X, y):labels = list(set(y))data = {label: [] for label in labels}for x, label in zip(X, y):data[label].append(x)self.model = {label: [len(data[label]) / float(len(X)), self.summarize(value)]for label, value in data.items()} # model写入字典 label : [[label概率],[(各特征的均值,标准差),(),()...]]return 'GuassNB train Done !'def cal_prob(self, input_data):prob = {}for label, value in self.model.items():prob[label] = value[0] # P(Y=Ck), 此处修正了原作者的初始概率均等问题for i in range(len(value[1])):mean, std = value[1][i]prob[label] *= self.gaus_prob(input_data[i], mean, std)# 分类器概率公式return probdef predict(self, X_test):label = sorted(self.cal_prob(X_test).items(), key=lambda x: x[-1])[-1][0]# {label : prob},按照概率排序,取最后(最大)的【0】标签return labeldef predict_prob(self, X_test):prob = sorted(self.cal_prob(X_test).items(), key=lambda x: x[-1])[-1][1]s = sum(i for i in self.cal_prob(X_test).values())return prob / s # 预测概率def score(self, X_test, y_test):right = 0for X, y in zip(X_test, y_test):label = self.predict(X)if label == y:right += 1return right / float(len(X_test))clf = GausNB()
clf.fit(X_train, y_train)
x = [2, ord('S')]
print(x, "自编程高斯贝叶斯预测", clf.predict(x), clf.predict_prob(x))
[2, 83] 自编程高斯贝叶斯预测 -1 0.9221912681158962
4. sklearn.naive_bayes
import pandas as pd
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import BernoulliNB
from sklearn.naive_bayes import MultinomialNBfor i in range(len(data[0])):data[1][i] = ord(data[1][i]) # 将字符转成ASCII数字
data = np.array(pd.DataFrame(data).T)
X_train, y_train = data[:, :-1], data[:, -1]clf = GaussianNB()
clf.fit(X_train, y_train)
print(x, "的高斯贝叶斯预测是", clf.predict([[2, ord('S')]]), clf.predict_proba([[2, ord('S')]]))clf = BernoulliNB()
clf.fit(X_train, y_train)
print(x, "的伯努利贝叶斯预测是", clf.predict([[2, ord('S')]]), clf.predict_proba([[2, ord('S')]]))clf = MultinomialNB()
clf.fit(X_train, y_train)
print(x, "的多项式贝叶斯预测是", clf.predict([[2, ord('S')]]), clf.predict_proba([[2, ord('S')]]))
[2, 'S'] 的高斯贝叶斯预测是 [-1] [[0.92219127 0.07780873]]
[2, 'S'] 的伯努利贝叶斯预测是 [1] [[0.38180179 0.61819821]]
[2, 'S'] 的多项式贝叶斯预测是 [1] [[0.41221915 0.58778085]]