4-2 朴素贝叶斯分类器训练函数
输入参数:
文档矩阵trainMatrix
每篇文档构成的向量trainCategory
返回值:
两个向量和一个概率
算法思路:
(1)计算出训练文档的数目numTrainDocs(文档矩阵的行数),每篇文档的词条数numWords(文档矩阵一行的数据个数)。
(2)计算侮辱性数据的比例。思想:侮辱性中类别数据为1,非侮辱性为0。通过数据中所有值的和除以数据的数目即可得到侮辱性数据的比例(用浮点型计算)。
(3)初始化概率:构造两个和词条数长度相同的零矩阵,分别计算文档属于侮辱性/非侮辱性文档的概率。思想:若数据属于侮辱性文档,则将这组文档矩阵加到属于侮辱性文档的初始化矩阵中,然后计算每个数据属于侮辱性文档的概率值。
代码:
# 训练模型:计算各特征在不同的类别下的条件概率
def trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix) # 计算训练的文档数目
numWords = len(trainMatrix[0]) # 计算每篇文档的词条数
pAbusive = sum(trainCategory) / float(numTrainDocs) # 文档属于侮辱类的概率
p0Num = np.zeros(numWords)
p1Num = np.zeros(numWords) # 创建numpy.zeros数组,词条出现数初始化为0
p0Denom = 0.0
p1Denom = 0.0 # 分母初始化为0
for i in range(numTrainDocs):
if trainCategory[i] == 1: # 统计属于侮辱类的条件概率所需的数据,即P(w0|1),P(w1|1),P(w2|1)···
p1Num += trainMatrix[i]
p1Denom += sum(trainMatrix[i])
else: # 统计属于非侮辱类的条件概率所需的数据,即P(w0|0),P(w1|0),P(w2|0)···
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
p1Vect = p1Num / p1Denom # 如[1, 3, 4, 2, 0] / 2 = [0.5, 1.5, 2.0, 1.0, 0.0]
p0Vect = p0Num / p0Denom
return p0Vect, p1Vect, pAbusive # 返回属于侮辱类的条件概率数组,属于非侮辱类的条件概率数组,文档属于侮辱类的概率