朴素贝叶斯分类器(Python实现)
来源:互联网 发布:php下载系统源码 编辑:程序博客网 时间:2024/05/17 04:21
基本思想:
朴素贝叶斯分类器,在当给出了特征向量w情况下,分类为ci的条件概率p(ci | w)。
利用贝叶斯公式:p(ci | w) = p(w | ci) * p(ci) / p(w),可以完成转化,观察公式可以发现分母p(w)都一样,所以只要比较分子的大小即可。
其中,p(ci)概率很容易求出;而对于条件概率p(w | ci),利用假设各个特征之间相互独立,因此,由w = {w1, w2, …, wn),即可以得出p(w | ci) = p(w1 | ci) * p(w2 | ci) * … * p(wn | ci),这也是朴素贝叶斯中“朴素”的意义。
利用python中的NumPy实现起来很简单,但是要注意的是这里为了防止下溢出(乘积较小)的情况发生,这里需要改为求log(p(ci | w))。
代码:
# coding=utf-8# python 2.7# 朴素贝叶斯分类器实现from numpy import *def loadDataSet(): 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] return postingList, classVecdef createVocabList(dataSet): vacabList = set([]) for doc in dataSet: vacabList = vacabList | set(doc) # 集合求并集运算 return list(vacabList) # 注意要转化成列表# 将文章转化成词向量def wordToVec(list, doc): vec = [0] * len(list) for word in doc: if word in list: vec[list.index(word)] = 1 else : print 'thr word: %s is not in my vocabulary!' % word return vec# 训练函数,通过贝叶斯公式计算出特征概率向量def trainNB(mat, cate): docNum = len(mat) wordNum = len(mat[0]) pAb = sum(cate) * 1.0 / docNum p1Vec = ones(wordNum); p0Vec = ones(wordNum) # 对数转化处理 p1Denom = 2.0; p0Denom = 2.0 for i in range(docNum): if cate[i] == 1: p1Vec += mat[i] p1Denom += sum(mat[i]) else : p0Vec += mat[i] p0Denom += sum(mat[i]) p1Vec = log(p1Vec / p1Denom) # 对数转化处理 p0Vec = log(p0Vec / p0Denom) return p0Vec, p1Vec, pAb # p0Vec是特征在0分类下的概率向量,p1Vec是特征在1分类下的概率向量,pAb是取得1分类的概率# 分类函数def classfyNB(testVec, p0Vec, p1Vec, pAb): p0 = sum(testVec * p0Vec) + log(1 - pAb) # 这里sum(testVec * p0Vec)可以理解为p0Vec中出现的特征对数求和,也就是取对数之前的求乘积 p1 = sum(testVec * p1Vec) + log(pAb) if p0 > p1: return 0 else: return 1def testingNB(): postData, listClasses = loadDataSet() vocabList = createVocabList(postData) trainMat = [] for doc in postData: trainMat.append(wordToVec(vocabList, doc)) p0Vec, p1Vec, pAb = trainNB(trainMat, listClasses) doc = ['love', 'my', 'dalmation'] testVec = array(wordToVec(vocabList, doc)) print doc, 'classfied as: ', classfyNB(testVec, p0Vec, p1Vec, pAb) doc = ['stupid', 'garbage'] testVec = array(wordToVec(vocabList, doc)) print doc, 'classfied as: ', classfyNB(testVec, p0Vec, p1Vec, pAb)testingNB()
阅读全文
0 0
- 朴素贝叶斯分类器(Python实现)
- Python实现朴素贝叶斯分类器
- python实现一个朴素贝叶斯分类器
- 朴素贝叶斯分类器的python实现
- 朴素贝叶斯分类器及Python实现
- 朴素贝叶斯分类算法的Python实现
- 朴素贝叶斯分类文本 python实现
- 朴素贝叶斯分类的Python实现
- 朴素贝叶斯分类算法python实现
- 朴素贝叶斯分类原理及Python实现简单文本分类
- 用Python学习朴素贝叶斯分类器
- Python 朴素贝叶斯(Naive Bayes)分类
- 《机器学习实战》基于朴素贝叶斯分类算法构建文本分类器的Python实现
- 模式识别(七):MATLAB 实现朴素贝叶斯分类器
- 朴素贝叶斯分类器 C++ STL 实现
- 朴素贝叶斯分类器:R语言实现
- 朴素贝叶斯分类器:MATLAB工具箱实现
- Java实现朴素贝叶斯分类器
- TCP 心跳 侧重于服务端分析
- 二叉树
- 水印动态时间
- Hibernate (一)
- 讨论构造、拷贝构造的N种调用情况
- 朴素贝叶斯分类器(Python实现)
- PAT a1010题解
- 关于Java中SQL语句拼写小问题(换行时缺少空格)
- POJ 3119 Friends or Enemies? 笔记
- Android服务
- 网络编程之java.net.SocketException: Connection reset异常问题(二)
- 腾讯2017秋招笔试编程题--编码
- 引水入城
- 网易云课堂Java进阶学习笔记系列01 -- 第3周 对象容器