内容来自https://cuijiahua.com/blog/2017/11/ml_4_bayes_1.html这位大佬的博客,我这里记录一些我以开始没有懂得地方和看过的心得
在这不过多介绍朴素贝叶斯的概念,具体可查李航老师的统计学习方法
首先是数据集的分类(文本列表)
postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
classVec = [0,1,0,1,0,1]
可以看到上述一共有6句话,将每句话拆分成一个个单词放在一个数组中,classVec表示的是上述的文本中哪段文本时有恶意和无恶意的(0无,1有)
接下来创建词汇表
def createVocabList(dataSet):
vocabSet = set([]) #创建一个空的不重复列表
for document in dataSet:
vocabSet = vocabSet | set(document) #取并集
return list(vocabSet)
通过创建一个空的列表,向其中添加不重复的词汇,最后得到以下结果,我们就叫他词汇表,
['ate', 'problems', 'how', 'quit', 'help', 'is', 'steak', 'has', 'food', 'dog', 'take', 'buying', 'park', 'love', 'not', 'worthless', 'garbage', 'dalmation', 'to', 'so', 'please', 'my', 'flea', 'maybe', 'him', 'licks', 'stupid', 'cute', 'I', 'stop', 'posting', 'mr']
接下来就是文本列表向词汇表转化,我们叫他(转化表)
def setOfWords2Vec(vocabList, inputSet):
returnVec = [0] * len(vocabList) # 创建一个其中所含元素都为0的向量
for word in inputSet: # 遍历每个词条
if word in vocabList: # 如果词条存在于词汇表中,则置1
returnVec[vocabList.index(word)] = 1
else:
print("the word: %s is not in my Vocabulary!" % word)
return returnVec # 返回文档向量
这段代码的基本意思就是创建一个新的所含元素都为0的向量,然后遍历一段文本,如果文本出现在了词汇表里,那么在词汇表相应的位置将0改成1,这里计算的是单个文本,需要有个函数整合一下。这个转化表在后面的用处很大,他也是最后用到了贝叶斯函数的地方,这个表格最后是这样的
[[0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0],
[1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]
获得转化表之后,我们将利用他计算出每个单词的恶意程度(概率也可以这么说)
接下来我们需要做的就是去将所有没有恶意的转化表向量(转化表和文本表一样,只是换了一种表达方式)加在一起(列表0,2,4行相加)得到总的没有恶意的一个词汇表的内容(我没有整理给大家大概看一下)
p1Num
[0. 0. 0. 0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 1. 1. 0. 0. 3. 1. 2. 1. 1. 0.
0. 0. 1. 2. 0. 0. 1. 1.]
然后算出他的sum(sum是总的没有恶意的词汇的统计数量,就是上述代码中p1Num列表元素的和),总的有恶意的词汇表也同上(列表1,3,5行相加)。
最后用上述的***列表/sum***就能够得到每个单词的恶意与非恶意的概率,进而,进行一个分类。