所有贝叶斯分类都是基于贝叶斯定理,朴素贝叶斯分类是贝叶斯分类中运用广泛简单的一种,另外,它还基于特征条件独立假设。
贝叶斯定理是计算条件概率的公式,条件概率即是事件B发生的前提下事件A发生的概率,记作
公式为:
公式大致推导:
如图,有
同样,也有
于是,
得到,
另外,根据全概率公式还有
所以公式还可以写成:
样本集(X,Y),每个样本x有n维特征,即
此时为求最大的后验概率,根据贝叶斯定理和全概率公式有,
对于
为降低参数规模,提出特征条件独立假设,它假设了n维特征
基于特征条件独立假设,对给定的训练样本集来学习输入输出的联合概率分布,得到一个模型,然后给定一个输入x,利用贝叶斯定理求出后验概率最大的输出y。
即对于一个输入x,根据概率角度就是求x属于哪个类别的概率最大,也就是说
在特征条件独立假设下,有
其中分母对于所有分类
反应到期望风险上就是:将输入实例分配到后验概率最大的类中就是期望风险最小化。
对于训练样本,朴素贝叶斯法的学习其实就是估计先验概率和条件概率。极大似然估计是一种参数估计的方法,根据训练样本推算出参数的大概值,因为在极大似然估计的思想看来,某个参数能使样本出现的概率最大,那就把这个参数作为真实值。
由于极大似然估计可能会出现概率值为0的情况,这会影响到后验概率的计算结果,为解决这个问题引入贝叶斯估计,即在计算先验概率时在分子加一个
from numpy import *
dataSet = [[0,0],[0,0],[0,0],[0,0],[1,0],[0,0],[1,0],[0,0],[1,0],[1,0],[1,1],[1,0],[1,1],[1,1],[1,1],[1,1],[1,1],[1,1]]
ySet = [0,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
def train():
dataNum = len(dataSet)
featureNum = len(dataSet[0])
p0Num = ones(featureNum)
p1Num = ones(featureNum)
p0Denom = 2.0
p1Denom = 2.0
p0 = 0
for i in range(dataNum):
if ySet[i] == 1:
p1Num += dataSet[i]
p1Denom += sum(dataSet[i])
else:
p0 += 1
p0Num += dataSet[i]
p0Denom += sum(dataSet[i])
p0Rate = p0 / dataNum
p0Vec = log(p0Num / p0Denom)
p1Vec = log(p1Num / p1Denom)
return p0Rate, p0Vec, p1Vec
p0Rate, p0Vec, p1Vec = train()
test = [1,0]
p1 = sum(test * p1Vec) + log(1.0 - p0Rate)
p0 = sum(test * p0Vec) + log(p0Rate)
if p1 > p0:
print(1)
else:
print(0)
欢迎关注:
原文:http://blog.csdn.net/wangyangzhizhou/article/details/70122534