朴素贝叶斯算法基于贝叶斯定理和特征条件独立假设。
详细案例
算法杂货铺——分类算法之朴素贝叶斯分类
http://uml.org.cn/sjjmwj/201310221.asp
实战项目代码下载:
关注微信公众号 datanlp 然后回复 贝叶斯 即可获取下载链接。
class NaiveBayesBase(object):
def __init__(self):
pass
def fit(self, trainMatrix, trainCategory):
'''
朴素贝叶斯分类器训练函数,求:p(Ci),基于词汇表的p(w|Ci)
Args:
trainMatrix : 训练矩阵,即向量化表示后的文档(词条集合)
trainCategory : 文档中每个词条的列表标注
Return:
p0Vect : 属于0类别的概率向量(p(w1|C0),p(w2|C0),...,p(wn|C0))
p1Vect : 属于1类别的概率向量(p(w1|C1),p(w2|C1),...,p(wn|C1))
pAbusive : 属于1类别文档的概率
'''
numTrainDocs = len(trainMatrix)
# 长度为词汇表长度
numWords = len(trainMatrix[0])
# p(ci)
self.pAbusive = sum(trainCategory) / float(numTrainDocs)
# 由于后期要计算p(w|Ci)=p(w1|Ci)*p(w2|Ci)*...*p(wn|Ci),若wj未出现,则p(wj|Ci)=0,因此p(w|Ci)=0,这样显然是不对的
# 故在初始化时,将所有词的出现数初始化为1,分母即出现词条总数初始化为2
p0Num = np.ones(numWords)
p1Num = np.ones(numWords)
p0Denom = 2.0
p1Denom = 2.0
for i in range(numTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else:
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
# p(wi | c1)
# 为了避免下溢出(当所有的p都很小时,再相乘会得到0.0,使用log则会避免得到0.0)
self.p1Vect = np.log(p1Num / p1Denom)
# p(wi | c2)
self.p0Vect = np.log(p0Num / p0Denom)
return self