一 贝叶斯分类理论
有一个数据集,有两类数据租车给,数据分布如下:
用p1(x,y)表示数据点(x,y)属于类别1,也就是红色表示的类别的概率;
用p2(x,y)表示数据点(x,y)属于类别2,也就是蓝色表示的类别概率;
那么对于新数据点(x,y),可以用下面的规则来判断它的类别:
如果p1(x,y)>p2(x,y),那么类别为1
如果p1(x,y)<p2(x,y),那么类别为2
可以看出来,我们会选择高概率对应的类别,贝叶斯决策理论的核心就是选择最高概率的决策。
二 条件概率
条件概率是指事件A在另外一个事件B已经发生条件下的发生概率,也就是P(A|B)。
事件A发生的概率就是P(A∩B)除以P(B)。
𝑃(𝐴|𝐵)=𝑃(𝐴∩𝐵)/𝑃(𝐵),因此,𝑃(𝐴∩𝐵)=𝑃(𝐴|𝐵)𝑃(𝐵)
𝑃(𝐴∩𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴),即𝑃(𝐴|𝐵)=𝑃(B|A)𝑃(𝐴)/𝑃(𝐵)
这就是条件概率的计算公式。
三 全概率公式
假定样本空间s,是两个事件A和A'的和。
那么事件B可以划分为两个部分。
即:𝑃(𝐵)=𝑃(𝐵∩𝐴)+𝑃(𝐵∩𝐴′)
在上面的推导当中,我们已知𝑃(𝐵∩𝐴)=𝑃(𝐵|𝐴)𝑃(𝐴)
所以𝑃(𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)+𝑃(𝐵|𝐴′)𝑃(𝐴′)
这就是全概率公式。
含义就是,如果A和A‘构成样本空间的一个划分,那么B的改了,就等于A和A'的概率分别乘以B对这两个事件的条件概率之和。
那么条件概率可以变换为:
四 贝叶斯推断
条件概率变形:
P(A)称为"先验概率"(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。
P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。
P(B|A)/P(B)称为"可能性函数"(Likelyhood),调整因子,使得预估概率更接近真实概率。
】条件概率可以理解:后验概率 = 先验概率x调整因子
这就是贝叶斯推断的含义。我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。
五 朴素贝叶斯推断
贝叶斯和朴素贝叶斯的概念是不同的,区别就在于“朴素”二字。朴素贝叶斯对条件概率分布做了条件独立性的假设。
比如下面的公式,假设有n个特征:
根据贝叶斯定理,后验概率 P(a|X) 可以表示为:
其中:
P(X|a) 是给定类别 ( a ) 下观测到特征向量 X=(x_1, x_2, ..., x_n) 的概率;
P(a) 是类别 a 的先验概率;
P(X) 是观测到特征向量 X 的边缘概率,通常作为归一化常数处理。
朴素贝叶斯分类器的关键假设是特征之间的条件独立性,即给定类别 a ,特征 x_i 和 x_j (其中相互独立。)
因此,我们可以将联合概率 P(X|a) 分解为各个特征的概率乘积:
将这个条件独立性假设应用于贝叶斯公式,我们得到:
通过计算每种可能类别的条件概率和先验概率,选择具有最高概率的类别作为预测结果。
六 拉普拉斯平滑系数
因为某些事件或者特征可能从未出现,会导致它们的概率被估计为0。
在实际应用中,即使某个事件或特征没有出现在训练集,也不排除其在以后的样本出现。
而我们的拉普拉斯平滑技术可以避免这种零概率陷阱。
一般我们的α取值为1,m为总的特征的数量。
即使某个特征在训练集指令从未出现,它的概率也不会被估计为0,而是会被赋予一个很小但是非0的值,从而避免了模型在面对新数据时可能出现的过拟合或预测错误。
七 API
sklearn.naive_bayes.MultinomialNB()estimator.fit(x_train, y_train)y_predict = estimator.predict(x_test)
代码实例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
# 1)获取数据
news =load_iris()
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
# 3)特征工程:不用做标准化
# 4)朴素贝叶斯算法预估器流程
estimator = MultinomialNB()
estimator.fit(x_train, y_train)
# 5)模型评估
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
# 6)预测
index=estimator.predict([[2,2,3,1]])
print("预测:\n",index,news.target_names,news.target_names[index])
补充:贝叶斯实现葡萄酒分类