文章目录

  • 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)

  1. 先验概率分布: P(Y=ck),k=1,2,...,KP(Y=c_k), k=1,2,...,KP(Y=ck​),k=1,2,...,K
  2. 条件概率分布: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=1n​Sj​, 不可行

做出 条件独立性假设 :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=1n​P(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 max⁡ckP(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)=ck​argmax​k∑​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 max⁡ckP(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=ck​argmax​P(Y=ck​)j∏​P(X(j)=x(j)∣Y=ck​)

2. 参数估计

2.1 极大似然估计

  1. 先验概率: P(Y=ck)=(yi=ck的样本数)/NP(Y=c_k)=(y_i=c_k的样本数)/NP(Y=ck​)=(yi​=ck​的样本数)/N
  2. 条件概率分布: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 的分类

步骤

  1. 计算先验概率及条件概率
    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
  2. 对于给定的实例 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∏n​P(X(j)=x(j)∣Y=ck​),k=1,2,...,K
  3. 确定实例 xxx 的类
    y=arg max⁡ckP(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=ck​argmax​P(Y=ck​)j=1∏n​P(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πσyk​2​​1​exp(−2σyk​2​(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]]

朴素贝叶斯法(Naive Bayes,NB)相关推荐

  1. 朴素贝叶斯(naive bayes)原理小结

    朴素贝叶斯(naive bayes)原理小结 1. 朴素贝叶斯的学习 1.1 基本假设:条件独立性 1.2 朴素贝叶斯分类器 1.3 后验概率的含义 2. 参数估计 2.1 极大似然估计 2.2 贝叶 ...

  2. python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估(完整代码+实现效果)

    实现功能: python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估. 实现代码: # 导入需要的库 from warnings import simplefilter simplef ...

  3. 朴素贝叶斯(naive bayes)分类

    1. 概念回顾 1.1 条件概率公式 条件概率是指在事件B发生的条件下,事件A发生的概率.条件概率表示为P(A∣B)P(A|B)P(A∣B),读作"A在B发生的条件下发生的概率". ...

  4. 朴素贝叶斯(Naive Bayes)分类和Gaussian naive Bayes

    朴素贝叶斯(Naive Bayes)   参考资料:https://www.cnblogs.com/pinard/p/6069267.html   朴素贝叶斯最关键的就是 (强制认为每种指标都是独立的 ...

  5. 【机器学习sklearn】高斯朴素贝叶斯 Gaussian naive bayes

    贝叶斯Bayes - Thomas Bayes 前言 一.贝叶斯决策论(Bayesian decision theory) 二.实例:高斯朴素贝叶斯 Gaussian Naive Bayes (Gau ...

  6. 朴素贝叶斯(Naive Bayes):鸢尾花分类项目(不调库,手工推)

    一.数据来源 1.数据来源:kaggle 2.数据样式 通过对数据"萼片.花瓣的长度.宽度(sepal_length.sepal_width.petal_length.petal_width ...

  7. 朴素贝叶斯(Naive Bayes)(原理+Python实现)

    朴素贝叶斯(Naive Bayes)(原理+Python实现) 创作背景 算法分类 生成类算法 判别类算法 区别 知识补充 朴素贝叶斯算法 举个栗子 求解思路 求解过程(数学计算) 代码实现 自己实现 ...

  8. python贝叶斯模型_【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)...

    目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...

  9. 机器学习——朴素贝叶斯(Naive Bayes)详解及其python仿真

    参考视频与文献: https://www.bilibili.com/video/BV1oX4y137p9?spm_id_from=333.999.0.0&vd_source=77c874a50 ...

  10. 朴素贝叶斯(Naive Bayes)详解

    朴素贝叶斯是贝叶斯分类器中的一种模型,用已知类别的数据集训练模型,从而实现对未知类别数据的类别判断.其理论基础是贝叶斯决策论(Bayesian decision theory). 一:基础知识 (1) ...

最新文章

  1. 2022-2028年中国高纯铜市场研究及前瞻分析报告
  2. 1.5s~0.02s,期间我们可以做些什么?
  3. 操作系统实验之作业调度算法
  4. 学习JNI一些基础知识
  5. Android GIF 编解码
  6. mysql 存储过程循环一张表的所有记录_MySQL数据库知识汇总
  7. Metal之MTLBuffer批量加载顶点数量较多的图形渲染
  8. servlet的线程安全性问题
  9. 香辣弹簧:自动接线的不同方法
  10. 【萌味】小夕说,不了解动态空间增长的程序喵都是假喵(中)
  11. 【10.23头条】阿里云存储负责人吴结生:安全可靠是云存储立身之本, 智能技术将激活存储技术新变革...
  12. python time模块和random 模块
  13. 设置mybatis 的sql 打印
  14. 在线答题java背景_答题功能java
  15. Android3D相册项目,Android Gallery实现3D相册(附效果图+Demo源码)
  16. opencv svm 多分类问题
  17. 如何正确的寻找电影资源
  18. java 正则表达式匹配_Java 正则表达式匹配
  19. Android 视频录制工具类VideoRecordUtil
  20. 中兴阅读在期刊杂志数字化、移动化上的探索

热门文章

  1. virtual析构函数的作用?
  2. php判断电脑浏览器模拟手机访问网页,在PC上测试移动端网站和模拟手机浏览器的5大方法...
  3. elementui的css文件没有引入_Python中引入模块详细介绍,使用模块的过程中注意事项教程...
  4. [New Portal]Windows Azure Virtual Machine (17) Virtual Machine成本分析
  5. Node.js mimimn图片批量下载爬虫 1.00
  6. JavaScript中本地对象、内置对象和宿主对象
  7. Spring总结四:IOC和DI 注解方式
  8. java基础-public/private/protected的具体区别
  9. 如果程序跑着跑着就崩溃了,查看内存
  10. InterDev 调试错误信息: Unable to set server into correct debugging state automatically....的解决办法...