鱼C论坛

 找回密码
 立即注册
查看: 2149|回复: 9

[技术交流] python实现朴素贝叶斯

[复制链接]
发表于 2020-11-6 22:38:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖逗 于 2020-11-7 08:54 编辑

参考书籍:《机器学习实战》

  1. import numpy as np

  2. #获得词典
  3. def createVocabList(dataSet):
  4.     vocabSet = set()
  5.     for document in dataSet:
  6.         #求两个集合的全集
  7.         vocabSet = vocabSet | set(document)#按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。
  8.     return list(vocabSet)

  9. #将输入根据已有的词典转换为向量
  10. def setOfWords2Vec(vocabList, inputSet):
  11.     returnVec = [0] * len(vocabList)
  12.     for word in inputSet:
  13.         if word in vocabList:
  14.             returnVec[vocabList.index(word)] = 1
  15.         else:
  16.             print("the word: %s is not in my Vocabulary!" % word)
  17.     return returnVec

  18. def trainNB0(trainMatrix, trainCategory):
  19.     numTrainDocs = len(trainMatrix)
  20.     numWords = len(trainMatrix[0])
  21.     pAbusive = sum(trainCategory) / float(numTrainDocs)#训练的样本中属于正样本的占比
  22.     p0Num = np.ones(numWords)#为了避免概率连乘时,其中一个概率为0,导致总体成绩为0
  23.     p1Num = np.ones(numWords)
  24.     p0Denom = 2#为了避免概率连乘时,其中一个概率为0,导致总体成绩为0
  25.     p1Denom = 2
  26.     for i in range(numTrainDocs):
  27.         if trainCategory[i] == 1:
  28.             p1Num += trainMatrix[i]
  29.             p1Denom += sum(trainMatrix[i])
  30.         else:
  31.             p0Num += trainMatrix[i]
  32.             p0Denom += sum(trainMatrix[i])
  33.     p1Vect = np.log(p1Num / p1Denom)#正分类样本中,某一个单词数占所有正样本单词数的比值
  34.     p0Vect = np.log(p0Num / p0Denom)#防止下溢
  35.     return p0Vect, p1Vect, pAbusive

  36. def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
  37.     p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)
  38.     p0 = sum(vec2Classify * p0Vec) + np.log(1 - pClass1)
  39.     if p1 > p0:
  40.         return 1
  41.     else:
  42.         return 0
  43.    
  44. def testingNB(testEntry, listOPosts, listClasses):
  45.     myVocabList = createVocabList(listOPosts)#创建词典
  46.     trainMat = []
  47.     for postinDoc in listOPosts:
  48.         trainMat.append(setOfWords2Vec(myVocabList, postinDoc))#将训练数据变为二维矩阵形式
  49.     p0V, p1V, pAb = trainNB0(np.array(trainMat), np.array(listClasses))
  50.     thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry))
  51.     print(testEntry, "classified as:", classifyNB(thisDoc, p0V, p1V, pAb))
  52.    
  53.    
  54. if __name__ == "__main__":
  55.     postingList = [["my", "dog", "has", "flea","problems", "help", "please"],
  56.                    ["maybe", "not", "take", "him", "to", "dog", "park", "stupid"],
  57.                    ["my", "dalmation", "is", "so", "cute", "I", "love", "him"],
  58.                    ["stop", "posting", "stupid", "worthless", "garbage"],
  59.                    ["mr", "licks", "ate", "my", "steak", "how", "to", "stop", "him"],
  60.                    ["quit", "buying", "worthless", "dog", "food", "stupid"]]
  61.     classVec = [0, 1, 0, 1, 0, 1]
  62.     testEntry = ["love", "my", "dalmation"]
  63.     testingNB(testEntry, postingList, classVec)
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-11-6 22:38:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-6 23:08:03 | 显示全部楼层
建议把 set([]) 改为 set() 。

#按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。
这个是并集吧……只有 int 才是按位或。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-7 08:55:26 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-11-6 23:08
建议把 set([]) 改为 set() 。

#按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。

set已改谢谢
另一个问题:
  1. set(["a", "b"]) | set(["a"])
  2. Out: {'a', 'b'}
复制代码

所以我怎么觉得还是全集呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 11:32:35 | 显示全部楼层
糖逗 发表于 2020-11-7 08:55
set已改谢谢
另一个问题:

set 的创建一般不这么写……
  1. {"a", "b"} | {"a"}
  2. Out: {'a', 'b'}
复制代码


这里全集和并集有区别么……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-7 14:15:11 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-11-7 11:32
set 的创建一般不这么写……

这里全集和并集有区别么……

vocabSet就是想根据所有set()里的每个词条,得到一个没有重复的总词条库。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 17:36:34 | 显示全部楼层
糖逗 发表于 2020-11-7 14:15
vocabSet就是想根据所有set()里的每个词条,得到一个没有重复的总词条库。

我是说 | 是并集运算符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-7 19:47:35 | 显示全部楼层

{"a", "b"} | {"a"}
Out: {'a', 'b'}

如果并集的话,不就返回了 {'a'}了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-8 14:18:44 | 显示全部楼层
糖逗 发表于 2020-11-7 19:47
{"a", "b"} | {"a"}
Out: {'a', 'b'}

你说的那叫交集

  1. >>> {"a", "b"} | {"a"}
  2. {'a', 'b'}
  3. >>> {"a", "b"} & {"a"}
  4. {'a'}
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-8 15:24:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 05:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表