贝叶斯公式是条件概率中最经典的公式,表示为
P(y∣x1,⋯,xn)=P(y)P(x1,⋯,xn∣y)P(x1,⋯,xn)P(y|x_1,\cdots,x_n)=\frac{P(y)P(x_1,\cdots,x_n|y)}{P(x_1,\cdots,x_n)} P(y∣x1,⋯,xn)=P(x1,⋯,xn)P(y)P(x1,⋯,xn∣y)
P(x∣y)P(x|y)P(x∣y)表示在yyy已经发生的情况下xxx发生的概率。
这个公式非常适合分类,假定某物有x1,⋯,xnx_1,\cdots,x_nx1,⋯,xn个特征,每个特征都有不同的表现,记作xnjx_n^jxnj。现有的MMM个样本,总共分为YYY类,记某一类为yky_kyk。
那么现在又来了一个新成员,这个新成员的特征是x1∗,⋯,xn∗x^*_1,\cdots,x^*_nx1∗,⋯,xn∗,如果每个特征之间是互不相关的,则
P(x1∗,⋯,xn∗)=P(x1∗)P(x2∗)⋯P(xn∗)P(x^*_1,\cdots,x^*_n)=P(x^*_1)P(x^*_2)\cdots P(x^*_n)P(x1∗,⋯,xn∗)=P(x1∗)P(x2∗)⋯P(xn∗)
且P(xi∗)P(x^*_i)P(xi∗)就是样本中xi∗x^*_ixi∗出现的次数除以样本数。
相应地P(x1∗,⋯,xn∗∣yk)=P(x1∗∣yk)⋯P(xn∗∣yk)P(x_1^*,\cdots,x_n^*|y_k)=P(x_1^*|y_k)\cdots P(x_n^*|y_k)P(x1∗,⋯,xn∗∣yk)=P(x1∗∣yk)⋯P(xn∗∣yk),其中P(xn∗∣yk)P(x_n^*|y_k)P(xn∗∣yk)表示在yky_kyk类中,xn∗x_n^*xn∗这个特征所占的比例。
这样一来,对于这个新样本来说,其属于第yky_kyk类的概率就是
P(yk∣x1∗,⋯,xn∗)=P(yk)P(x1∗∣yk)⋯P(xn∗∣yk)P(x1∗)⋯P(xn∗)P(y_k|x^*_1,\cdots,x^*_n)=\frac{P(y_k)P(x^*_1|y_k)\cdots P(x^*_n|y_k)}{P(x^*_1)\cdots P(x^*_n)} P(yk∣x1∗,⋯,xn∗)=P(x1∗)⋯P(xn∗)P(yk)P(x1∗∣yk)⋯P(xn∗∣yk)
在sklearn中提供了naive_bayes模块,其中的CategoricalNB是基于现有数据集特征的朴素贝叶斯分类器,其构造函数为
CategoricalNB(alpha=1.0, fit_prior=True, class_prior=None, min_categories=None)
其个参数含义为
alpha 为平滑参数,设为0时表示不平滑fit_prior 为True时,学习先验概率class_prior fit_prior为True时学习的先验概率min_categories 每个特征的最小分类数接下来验证一下这个类,简单起见,考虑到现在考研比较内卷,那么假设用三个指标评价是否录取,即本科是否为985;考研分数A(前10%),B(10%-30%),C(30%-60%),D(后40%)四档;本科发文章A(Nature级别), B(SCI),C(其他期刊),D(无期刊),假设有下面的一份以往录取表
| 985 | 分数 | 文章 | 录取 |
|---|---|---|---|
| 1 | 3 | 3 | ✅ |
| 1 | 2 | 3 | ✅ |
| 1 | 3 | 2 | ✅ |
| 1 | 2 | 2 | ✅ |
| 1 | 1 | 2 | ✅ |
| 1 | 1 | 1 | ✅ |
| 1 | 1 | 1 | ✅ |
| 1 | 0 | 1 | ✅ |
| 1 | 0 | 0 | ✅ |
| 1 | 0 | 1 | ✅ |
| 1 | 0 | 0 | ❌ |
| 1 | 0 | 0 | ✅ |
| 1 | 0 | 0 | ❌ |
| 0 | 3 | 2 | ✅ |
| 0 | 3 | 1 | ✅ |
| 0 | 3 | 1 | ✅ |
| 0 | 3 | 0 | ✅ |
| 0 | 3 | 0 | ✅ |
| 0 | 3 | 0 | ❌ |
| 0 | 2 | 2 | ✅ |
| 0 | 2 | 1 | ✅ |
| 0 | 2 | 1 | ❌ |
| 0 | 2 | 0 | ❌ |
| 0 | 2 | 0 | ❌ |
| 0 | 2 | 0 | ❌ |
| 0 | 1 | 2 | ✅ |
| 0 | 1 | 2 | ❌ |
| 0 | 1 | 1 | ❌ |
| 0 | 1 | 1 | ❌ |
| 0 | 1 | 0 | ❌ |
| 0 | 0 | 0 | ❌ |
| 0 | 0 | 0 | ❌ |
| 0 | 0 | 0 | ❌ |
将其写为代码的形式为
X = [
[1,3,3],[1,2,3],[1,3,2],[1,2,2],
[1,1,2],[1,1,1],[1,1,1],[1,0,1],
[1,0,0],[1,0,1],[1,0,0],[1,0,0],
[1,0,0],[0,3,2],[0,3,1],[0,3,1],
[0,3,0],[0,3,0],[0,3,0],[0,2,2],
[0,2,1],[0,2,1],[0,2,0],[0,2,0],
[0,2,0],[0,1,2],[0,1,2],[0,1,1],
[0,1,1],[0,1,0],[0,0,0],[0,0,0],
[0,0,0]]y = [ 1,1,1,1,1,1,1,1,1,1,0,1,0,1,
1,1,1,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0]import numpy as np
rng = np.random.RandomState(1)
from sklearn.naive_bayes import CategoricalNB
clf = CategoricalNB() # 创建朴素贝叶斯类
clf.fit(X, y) # 载入数据
接下来,如果你是985的学生,同时考研成绩大概排在50%,但本科并没有发过什么文章,那么我猜你考研一定能被录取
>>> clf.predict([[1,1,0]])
array([1])