使 用 朴 素 贝 叶 斯 进 行 文 档 分 类

朴素贝叶斯分类法,主要是通过训练学习联合概率分布。具体是学习先验概率和条件概率。 朴素贝叶斯法将实例分到后验概率最大分类中,实际上等价于期望风险最小化
朴素贝叶斯的参数估计有两种方式,一种是极大似然估计,另外一种是使用贝叶斯估计

数据集处理函数 词 表 到 向 暈 的 转 换 函 数

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]    #1 为侮辱,0 位不侮辱
        return postingList,classVec

数据去重函数 将重复数据去除

def creatVocabList(dataSet):
    Set=set([])#创建一个空表
    for file in dataSet:
        Set =Set | set(file) #合并两个表
    return list(Set)

遍 历 文 档 中 的 所有 单 词 , 如果 出 现 了 词 汇 表 中 的 单 词 , 则 将 输 出 的 文 档 向 量 中 的 对 应值 设 为 1 每 当 遇 到 一 个 单 词 时 , 它 会 增 加 词 向 量 中 的 对 应值 , 而 不 只 是 将 对 应的数 值 设 为 1

def setofWord(vocablist,inputSet):
    returnVec=[0]*len(vocablist)
    for word in inputSet:
        if word in vocablist:
                returnVec[vocablist.index(word)]+=1
    return returnVec
训练函数  trainMatrix训练数据  trainlib 训练数据类别
def trainbayes(trainMatrix,trainlib):
    numTrainDocs = len(trainMatrix)  # 数据集的长度
    numWords = len(trainMatrix[0])
    PaA= sum(trainlib)/float(numTrainDocs)
    p0num=ones(numWords);p1num=ones(numWords)
    p0Denom=2.0;p1Denom=2.0
    for i in range(numTrainDocs):  # 遍历所有的数据集
        if trainlib[i] == 1:
            p1num +=trainMatrix[i]  #出现侮辱性词语 ,个数加1
            p1Denom += sum(trainMatrix[i])  # 总词数加1
        else:
            p0num +=trainMatrix[i]  # 对于没有侮辱词语 个数加一
            p0Denom += sum(trainMatrix[i])
    p1v = log(p1num/p1Denom) # 计侮辱性词语出现的概率
    p0v = log(p0num/p0Denom)
    return p0v,p1v,PaA

分类函数 如果 概率p1 >p2 就是侮辱性词语

def classifyB(needclassify,p0v,p1v,pclass):
    p1=sum(needclassify * p1v) + log(pclass)
    p0 = sum(needclassify * p0v) + log(1.0-pclass)
    if p1> p0:
        return 1  # 1 位侮辱性词汇
    else:
        return 0  # 0 不是侮辱性词汇

测试贝叶斯函数

def testingB():
    listOPosts,listClasses = loadDataSet()  # 初始化数据集
    myVocabList = creatVocabList(listOPosts)  #数据去重
    trainMat=[]
    for postinDoc in listOPosts:
        trainMat.append(setofWord(myVocabList, postinDoc))  #判断单词在数据集中是出现
    p0V,p1V,pAb =trainbayes(array(trainMat),array(listClasses))  # 获取概率
    testEntry = ['love', 'my', 'dalmation']
    thisDoc = array(setofWord(myVocabList, testEntry))
    print testEntry,u'分类为: ',classifyB(thisDoc,p0V,p1V,pAb)
    testEntry = ['stupid', 'garbage']
    thisDoc = array(setofWord(myVocabList, testEntry))
    print testEntry,u'分类为: ',classifyB(thisDoc,p0V,p1V,pAb)

文本进行处理函数 该 函 数 去 掉 少 于 两 个 字 符 的 字 符 串 , 并 将 所 有 字 符 串 转 换 为 小 写

def textParse(bigString):
    listOfTokens = re.split(r'\W*', bigString)  #使用正则处理文件
    return [tok.lower() for tok in listOfTokens if len(tok) > 2] # 将字符字符转为小写。

使 用 朴 素 贝 叶 斯 过 滤 垃 圾 邮 件

def spamTest():
    docList=[]; classList = []; fullText =[]   #文件列表  分类列表  文件
    #  导入并解析文本
    for i in range(1,26):
        wordList = textParse(open('email/spam/%d.txt' % i).read())  #打开文件
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(1)
        wordList = textParse(open('email/ham/%d.txt' % i).read())
        docList.append(wordList)
        fullText.extend(wordList)
        classList.append(0)
    vocabList = creatVocabList(docList)
    trainingSet = range(50); testSet=[]            #创建一个训练数组
    for i in range(10):   #  选取十个邮件作为测试集
        randIndex = int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
    trainMat=[]; trainClasses = []
    for docIndex in trainingSet:
        trainMat.append(setofWord(vocabList, docList[docIndex]))  # 构建词向量
        trainClasses.append(classList[docIndex])
    p0V,p1V,pSpam = trainbayes(array(trainMat),array(trainClasses))
    errorCount = 0
    for docIndex in testSet:        #对邮件进行分类
        wordVector = setofWord(vocabList, docList[docIndex])
        if classifyB(array(wordVector),p0V,p1V,pSpam) != classList[docIndex]:
            errorCount += 1
            print u"分类错误",docList[docIndex]
    print u'错误率: ',float(errorCount)/len(testSet)

朴素贝叶斯算法主要是基于一个贝叶斯假设 所有的数据都相互独立但是这在现实中是不可能的。但是使用贝叶斯进行推理效果是很好的,一般来说,使用贝叶斯网的效果会更好。
贝叶斯网络是一种概率网络,它是基于概率推理的图形化网络,而贝叶斯公式则是这个概率网络的基础。贝叶斯网络是基于概率推理的数学模型,所谓概率推理就是通过一些变量的信息来获取其他的概率信息的过程,基于概率推理的贝叶斯网络是为了解决不定性和不完整性问题而提出的,它对于解决复杂设备不确定性和关联性引起的故障有很大的优势。
一个完整的贝叶斯网络的构成包括网络的构建和网络的训练,一般来说,网络的构建是一个很复制的事情。贝叶斯网络的训练和隐马尔可夫模型类似但是相比马尔可夫链,贝叶斯网络更加复制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于sklearn自带的breast_cancer数据集,我们可以构建四个模型:k最近邻(K-Nearest Neighbors,KNC)、高朴素贝叶斯(Gaussian Naive Bayes)、支持向量机(Support Vector Machine,SVM)和决策树(Decision Tree)。 其中,k最近邻(K-Nearest Neighbors,KNC)是一种基于实例的学习算法,通过计算新样本与已知样本之间的距离,然后将新样本配给距离其最近的k个已知样本的多数别来。在使用KNC时,可以通过调整k的取值来改变模型的性能。 高朴素贝叶斯(Gaussian Naive Bayes)是一种基于定理的概率模型。它假设所有特征之间相互独立,并且每个特征的布都服从高布。在构建高朴素贝叶斯模型时,我们可以使用breast_cancer数据集的特征值来计算每个的概率,并选择具有最高概率的作为预测结果。 上述提到的两种算法都是基于实例或概率的方法,而支持向量机(Support Vector Machine,SVM)和决策树(Decision Tree)则是基于规则的算法。 支持向量机(Support Vector Machine,SVM)是一种经典的机器学习算法。它通过构造超平面来将数据割成不同的别,同时尽量将超平面与最近的数据点之间的间隔最大化。在使用SVM时,我们可以调整惩罚参数和核函数等参数来改变模型的性能。 决策树(Decision Tree)是一种通过构建树形结构来的方法。在构建决策树模型时,我们可以根据不同特征的信息增益或基尼指数等指标来选择最优的划特征,并生成决策树。在预测时,通过遍历决策树的节点来得到最终的结果。 综上所述,基于sklearn自带的breast_cancer数据集,我们可以构建四个模型:k最近邻(KNC)、高朴素贝叶斯(Gaussian Naive Bayes)、支持向量机(SVM)和决策树(Decision Tree)。根据具体需求,我们可以选择适合的模型来预测和析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值