朴素贝叶斯代码中的一个问题,个人看法。
mike96265 opened this issue · 1 comments
mike96265 commented
作者在文中提到,将w展开为一个个独立特征,那么就可以将p(w/ci)展开为p(w0, w1, ... | ci)。那么在整个数据集中,应该有 p(w0_0) + p(w0_1) = 1。
但是在实际代码中,计算不同类别 p(w0) 处分母时,却加上了该数据行中单词出现的总次数,这里应该是有误的。如果将每个特征看做独立,这里应该只需要加1。
def trainNB0(trainMatrix, trainCategory):
nTrainDocs = len(trainMatrix)
nWords = len(trainMatrix[0])
pAbusive = sum(trainCategory) / float(nTrainDocs)
p0Num = np.zeros(nWords)
p1Num = np.zeros(nWords)
p0Denom = 0
p1Denom = 1
for i in range(nTrainDocs):
if trainCategory[i] == 1:
p1Num += trainMatrix[i]
# 此处将分母加上了所有单词出现的次数
# p1Denom += sum(trainMatrix[i])
p1Denom += 1
else:
p0Num += trainMatrix[i]
# p0Denom += sum(trainMatrix[i])
p0Denom += 1
p1Vect = p1Num / p1Denom
p0Vect = p0Num / p0Denom
return p0Vect, p1Vect, pAbusive
lingjjcn commented
这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。