一、贝叶斯算法原理
1.条件概率公式
根据文氏图,可以看到在事件B发生的情况下,事件A发生的概率为:
即为条件概率公式。
2.全概率公式
如果事件B1,B2,B3,…,Bn 构成一个完备事件组,即它们两两互不相容,其和为全集;并且P(Bi)大于0,则对任一事件A有:
3.贝叶斯定理
贝叶斯定理是关于随机事件A和B的条件概率(或边缘概率)的一则定理。其中P(A|B)是在B发生的情况下A发生的可能性。
举个例子:一个鸢尾花数据有四个特征,其特征分别为:sepal length、sepal width、petal length、petal width,三个类别,分别为:Iris Setosa、Iris Versicolour、Iris Virginica,现在有一组鸢尾花数据:5.5,2.6,4.4,1.2,判断此鸢尾花属于哪种。
由贝叶斯定理我们可以计算此条件下属于各个类别的概率,
同理,依次可以计算属于类别 Versicolour、Virginica的概率。概率最大的类别即为最有可能的鸢尾花类别。
但是,可以看到并不好计算,此时,我们可以将鸢尾花数据的四个特征看作相互独立(即朴素贝叶斯的核心),所以有:
4.高斯分布
上述例子中,sepal length、sepal width、petal length、petal width等特征均为连续变量,该如何计算?我们可以假设在setosa的条件下,sepallen服从高斯分布(正态分布)。根据正态分布的概率密度函数即可计算出
,公式如下:
二、朴素贝叶斯处理过程
三、朴素贝叶斯分类实现
1.数据集说明
朴素贝叶斯分类实现鸢尾花数据分类,数据集来源:https://archive.ics.uci.edu/ml/datasets/iris。算法实现之前,按照8:2的比例将原始数据集分为训练数据集和测试数据集,原始数据集中每个类别抽取10个样本组成一个总共30个样本的测试数据集。
数据集说明:
Attribute Information:
- sepal length in cm
- sepal width in cm
- petal length in cm
- petal width in cm
- class:
— Iris Setosa
— Iris Versicolour
— Iris Virginica
2.加载数据集
1 | """ |
3.计算训练集均值
1 | def get_mean(x,lable): |
4.计算训练集方差
1 | def get_var(x,mean,label): |
5.计算先验概率
1 | def get_prior(x,label): |
6.计算后验概率
1 | def get_postpro(mean,var,xi): |
7.计算似然度
1 | def get_likelihood(mean,var,x): |
8.训练模型
1 | def fit_model(x): |
9.预测类别
1 | def predict(x): |
10.效果评估
对于运算结果,在此只截取了一部分,可以看到总准确率为100%,朴素贝叶斯得到的各个类别的相对概率值差别很大,结果显而易见。这个结果并不能说明朴素贝叶斯的分类效果特别好,只是这个鸢尾花测试数据集数据太理想,没有一点误差,数据集很干净。
通过散点图同时展示该测试数据集的四个不同维度:图中的(x, y)位置代表每个样本的花萼的长度和宽度(sepal length、sepal width),散点的大小代表每个样本的花瓣的长度(petal length),而散点的颜色代表一种特定的鸢尾花类型。
四、附录
load_data.py文件,实现数据载入。
1 | """ |
naive_bayes.py文件,实现贝叶斯模型训练,测试数据集分类。
1 | import numpy as np |