赞
踩
贝叶斯公式是条件概率中最经典的公式,表示为
P ( y ∣ x 1 , ⋯ , x n ) = P ( y ) P ( x 1 , ⋯ , x n ∣ y ) P ( x 1 , ⋯ , x n ) 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)表示在 y y y已经发生的情况下 x x x发生的概率。
这个公式非常适合分类,假定某物有 x 1 , ⋯ , x n x_1,\cdots,x_n x1,⋯,xn个特征,每个特征都有不同的表现,记作 x n j x_n^j xnj。现有的 M M M个样本,总共分为 Y Y Y类,记某一类为 y k y_k yk。
那么现在又来了一个新成员,这个新成员的特征是 x 1 ∗ , ⋯ , x n ∗ x^*_1,\cdots,x^*_n x1∗,⋯,xn∗,如果每个特征之间是互不相关的,则
P ( x 1 ∗ , ⋯ , x n ∗ ) = P ( x 1 ∗ ) P ( x 2 ∗ ) ⋯ P ( x n ∗ ) 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 ( x i ∗ ) P(x^*_i) P(xi∗)就是样本中 x i ∗ x^*_i xi∗出现的次数除以样本数。
相应地 P ( x 1 ∗ , ⋯ , x n ∗ ∣ y k ) = P ( x 1 ∗ ∣ y k ) ⋯ P ( x n ∗ ∣ y k ) 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 ( x n ∗ ∣ y k ) P(x_n^*|y_k) P(xn∗∣yk)表示在 y k y_k yk类中, x n ∗ x_n^* xn∗这个特征所占的比例。
这样一来,对于这个新样本来说,其属于第 y k y_k yk类的概率就是
P ( y k ∣ x 1 ∗ , ⋯ , x n ∗ ) = P ( y k ) P ( x 1 ∗ ∣ y k ) ⋯ P ( x n ∗ ∣ y k ) P ( x 1 ∗ ) ⋯ P ( x n ∗ ) 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])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。