朴素贝叶斯法(Naive Bayes,NB)

文章目录

    • 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'yY
  • 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=xY=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=xY=ck) 指数级 数量的参数,如果 x(j)x^{(j)}x(j) 的取值有 SjS_jSj 个, j=1,2,...,nj=1,2,...,nj=1,2,...,nYYY 可取值有 KKK 个,总的参数个数为 K∏j=1nSjK \prod_{j=1}^n S_jKj=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=xY=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=ckX=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=ckX=x)=kP(X=xY=ck)P(Y=ck)P(X=xY=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=ckX=x)=kP(Y=ck)jP(X(j)=x(j)Y=ck)P(Y=ck)jP(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)=ckargmaxkP(Y=ck)jP(X(j)=x(j)Y=ck)P(Y=ck)jP(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=ckargmaxP(Y=ck)jP(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))Txi(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)/Nk=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=1nP(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=ckargmaxP(Y=ck)j=1nP(X(j)=x(j)Y=ck)

2.2.1 例题

例题
用下表训练数据学习一个贝叶斯分类器并确定 x=(2,S)Tx=(2,S)^Tx=(2,S)T 的类标记 yyyX(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\}YC={1,1}

训练数据123456789101112131415
X(1)X^{(1)}X(1)111112222233333
X(2)X^{(2)}X(2)SMMSSSMMLLLMMLL
YYY-1-111-1-1-11111111-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)=1Y=1)=92,P(X(1)=2Y=1)=93,P(X(1)=3Y=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)=SY=1)=91,P(X(2)=MY=1)=94,P(X(2)=LY=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)=1Y=1)=63,P(X(1)=2Y=1)=62,P(X(1)=3Y=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)=SY=1)=63,P(X(2)=MY=1)=62,P(X(2)=LY=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)=2Y=1)P(X(2)=SY=1)=1599391=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)=2Y=1)P(X(2)=SY=1)=1566263=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 的类标记 yyyX(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\}YC={1,1}

训练数据123456789101112131415
X(1)X^{(1)}X(1)111112222233333
X(2)X^{(2)}X(2)SMMSSSMMLLLMMLL
YYY-1-111-1-1-11111111-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)=1Y=1)=9+32+1=123,P(X(1)=2Y=1)=9+33+1=124,P(X(1)=3Y=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)=SY=1)=9+31+1=122,P(X(2)=MY=1)=9+34+1=125,P(X(2)=LY=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)=1Y=1)=6+33+1=94,P(X(1)=2Y=1)=6+32+1=93,P(X(1)=3Y=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)=SY=1)=6+33+1=94,P(X(2)=MY=1)=6+32+1=93,P(X(2)=LY=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)=2Y=1)P(X(2)=SY=1)=1710124122=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)=2Y=1)P(X(2)=SY=1)=1779394=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(xiyk)=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]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Easy RL:强化学习教程》出版了!文末送书

作为人工智能里最受关注的领域之一,强化学习的热度一直居高不下,但它的学习难度也同样不低。在学习强化学习的过程中,遇到了有无数资料却难以入门的问题,于是发起了Datawhale强化学习项目,希望自学的同时帮助更多学习者…

Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】

通过上一篇《Spring Cloud构建微服务架构:服务注册与发现》,我们已经成功地将服务提供者:eureka-client或consul-client注册到了Eureka服务注册中心或Consul服务端上了,同时我们也通过DiscoveryClient接口的getServices获取了当前…

论文浅尝 | Temporal Knowledge Graph Completion Using Box Embeddings

笔记整理:杨露露,天津大学硕士论文链接:https://www.aaai.org/AAAI22Papers/AAAI-6210.MessnerJ.pdf动机时态知识图谱补全(TKGC)中的主要挑战是额外学习时间戳嵌入,以便嵌入模型根据关系、实体和时间戳嵌入…

别再无脑wwm了,在下游任务中不一定有效

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

逻辑斯谛回归模型( Logistic Regression,LR) 最大熵模型(Max Entropy,ME)

文章目录1. Logistic Regression 模型1.1 logistic 分布1.2 二项逻辑斯谛回归模型1.3 模型参数估计1.4 多项逻辑斯谛回归1.5 Python代码2. Maximum Entropy 模型2.1 最大熵原理2.2 最大熵模型的定义2.3 最大熵模型的学习2.4 例题3. 模型学习的最优化算法4. 鸢尾花LR分类实践1. …

Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】

已经有非常长的时间没有更新《Spring Cloud构建微服务架构》系列文章了,自从开始写Spring Cloud的专题内容开始就获得了不少的阅读量和认可,当然也有一些批评,其中也不乏一些很中肯的意见和深度的问题,对我来说也是进一步提高的契…

虚拟专辑丨知识图谱

虚 拟 专 辑 “武大学术期刊”的“虚拟专辑” 旨在将已发表在武汉大学科技期刊中心旗下期刊的论文以时下热点领域按主题重新组合,集中推送,以方便不同专业领域的读者集中查阅、追踪最新研究成果。此次推送的“知识图谱”虚拟专辑,为近几年发…

prompt你到底行不行?

文 | 马杀鸡三明治 源 | 知乎 很久之前老板下任务要试试prompt这个大风,但是玩完后发现太菜了所以连文章都没写,刚好今天工作比较闲就来写写了。 先上结论,连续prompt为运用大模型提供了一种思路,其实这种思路早就见过不少了。。。…

LeetCode 1323. 6 和 9 组成的最大数字

1. 题目 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。 请返回你可以得到的最大数字。 示例 1: 输入:num 9669 输出:9969 解释: 改变第一位数字…

Spring Cloud实战小贴士:Zuul统一异常处理(二)

在前几天发布的《Spring Cloud实战小贴士:Zuul统一异常处理(一)》一文中,我们详细说明了当Zuul的过滤器中抛出异常时会发生客户端没有返回任何内容的问题以及针对这个问题的两种解决方案:一种是通过在各个阶段的过滤器…

论文浅尝 | Explainable Link Prediction in Knowledge Hypergraphs

笔记整理:陈子睿,天津大学硕士论文链接:https://dl.acm.org/doi/10.1145/3511808.3557316动机知识超图链接预测已被认为是各种知识使能下游应用的关键问题。然而,大多数现有方法主要以黑盒方式执行链接预测,它们学习实…

吴恩达入驻知乎,涨粉秒过万!知乎首答:如何系统学习机器学习

文 | 卖萌酱大家好,我是卖萌酱。昨天在知乎timeline上刷到一个问题:虽然卖萌酱已经不需要系统学习机器学习了,但无意间发现最高赞的id竟然叫“吴恩达”??好家伙,看了看回答日期,是4月8号。戳进去…

学术会议|第六届知识图谱论坛CNCC-知识图谱赋能大数据大算力

CNCC2022将于12月8日至10日在贵州省贵阳市国际生态会议中心举办,今年CNCC技术论坛数量达到122个,内容涵盖了“计算行业、人工智能、云计算、教育、安全”等30个方向。本文特别介绍将于12月9日举行的【第六届知识图谱论坛-知识图谱赋能大数据大算力】。报…

LeetCode 第 18 场双周赛(188/587,前32%)

文章目录1. 比赛结果2. 题目LeetCode 1331. 数组序号转换 easyLeetCode 1328. 破坏回文串 mediumLeetCode 1329. 将矩阵按对角线排序 mediumLeetCode 1330. 翻转子数组得到最大的数组值 hard1. 比赛结果 做出来了1, 2, 3题,第4题提交超时 2. 题目 LeetCode 1331.…

Spring Cloud实战小贴士:Zuul统一异常处理(一)

在上一篇《Spring Cloud源码分析(四)Zuul:核心过滤器》一文中,我们详细介绍了Spring Cloud Zuul中自己实现的一些核心过滤器,以及这些过滤器在请求生命周期中的不同作用。我们会发现在这些核心过滤器中并没有实现error…

ACL’22 | 为大模型定制的数据增强方法FlipDA,屠榜六大NLU 数据集

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

技术动态 | 面向可解释性的知识图谱推理研究

导读:本次演讲的主题是面向可解释性的知识图谱推理研究,报告分为以下 5 个部分:研究背景前沿进展研究动机近期研究研究展望分享嘉宾|万国佳 武汉大学 计算机学院 博士后编辑整理|xiaomei出品平台|DataFunTa…

LeetCode 1332. 删除回文子序列

1. 题目 给你一个字符串 s,它仅由字母 ‘a’ 和 ‘b’ 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符(字符串为空)的最小删除次数。 「子序列」定义:如果一个字符串可以通过删除原字符…

Spring Cloud源码分析(四)Zuul:核心过滤器

通过之前发布的《Spring Cloud构建微服务架构(五)服务网关》一文,相信大家对于Spring Cloud Zuul已经有了一个基础的认识。通过前文的介绍,我们对于Zuul的第一印象通常是这样的:它包含了对请求的路由和过滤两个功能&am…

预训练再次跨界!百度提出ERNIE-GeoL,地理位置-语言联合预训练!

源 | 百度NLP本文介绍『文心大模型』的一项最新工作:“地理位置-语言”预训练模型ERNIE-GeoL。论文链接:https://arxiv.org/abs/2203.09127实践中的观察近年来,预训练模型在自然语言处理、视觉等多个领域都取得了显著效果。基于预训练模型&am…