zoukankan      html  css  js  c++  java
  • 朴素贝叶斯

    朴素贝叶斯

    朴素贝叶斯是贝叶斯分类器的一个扩展,是用于文档分类的常用算法

    优缺点:

    优点: 在数据较少的情况下仍然有效,可以处理多类别问题。
    缺点: 对于输入数据的准备方式较为敏感。
    适用数据类型: 标称型数据。

    流程伪代码:

    提取所有文档中的词条并进行去重
    获取文档的所有类别
    计算每个类别中的文档数目
    对每篇训练文档: 
        对每个类别: 
            如果词条出现在文档中-->增加该词条的计数值(for循环或者矩阵相加)
            增加所有词条的计数值(此类别下词条总数)
    对每个类别: 
        对每个词条: 
            将该词条的数目除以总词条数目得到的条件概率(P(词条|类别))
    返回该文档属于每个类别的条件概率(P(类别|文档的所有词条))

    核心代码:

    def testingNB():
        # 1. 加载数据集
        listOPosts, listClasses = loadDataSet()
        # 2. 创建单词集合
        myVocabList = createVocabList(listOPosts)
        # 3. 计算单词是否出现并创建数据矩阵
        trainMat = []
        for postinDoc in listOPosts:
            # 返回m*len(myVocabList)的矩阵, 记录的都是0,1信息
            trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
        # 4. 训练数据
        p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))
        # 5. 测试数据
        testEntry = ['love', 'my', 'dalmation']
        thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
        print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))
        testEntry = ['stupid', 'garbage']
        thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
        print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))
    def trainNB0(trainMatrix, trainCategory):
        """
        训练数据优化版本
        :param trainMatrix: 文件单词矩阵
        :param trainCategory: 文件对应的类别
        :return:
        """
        # 总文件数
        numTrainDocs = len(trainMatrix)
        # 总单词数
        numWords = len(trainMatrix[0])
        # 侮辱性文件的出现概率
        pAbusive = sum(trainCategory) / float(numTrainDocs)
        # 构造单词出现次数列表
        # p0Num 正常的统计
        # p1Num 侮辱的统计 
        # 避免单词列表中的任何一个单词为0,而导致最后的乘积为0,所以将每个单词的出现次数初始化为 1
        p0Num = ones(numWords)#[0,0......]->[1,1,1,1,1.....]
        p1Num = ones(numWords)
    
        # 整个数据集单词出现总数,2.0根据样本/实际调查结果调整分母的值(2主要是避免分母为0,当然值可以调整)
        # p0Denom 正常的统计
        # p1Denom 侮辱的统计
        p0Denom = 2.0
        p1Denom = 2.0
        for i in range(numTrainDocs):
            if trainCategory[i] == 1:
                # 累加辱骂词的频次
                p1Num += trainMatrix[i]
                # 对每篇文章的辱骂的频次 进行统计汇总
                p1Denom += sum(trainMatrix[i])
            else:
                p0Num += trainMatrix[i]
                p0Denom += sum(trainMatrix[i])
        print("p1+p0:
    ")
        print(p1Num)
        print(p0Num)
        # 类别1,即侮辱性文档的[log(P(F1|C1)),log(P(F2|C1)),log(P(F3|C1)),log(P(F4|C1)),log(P(F5|C1))....]列表
        p1Vect = log(p1Num / p1Denom)
        # 类别0,即正常文档的[log(P(F1|C0)),log(P(F2|C0)),log(P(F3|C0)),log(P(F4|C0)),log(P(F5|C0))....]列表
        p0Vect = log(p0Num / p0Denom)
        return p0Vect, p1Vect, pAbusive
    def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
        p1 = sum(vec2Classify * p1Vec) + log(pClass1)
        p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
        if p1 > p0:
            return 1
        else:
            return 0
  • 相关阅读:
    夺命雷公狗—玩转SEO---50---让页面更好的被搜索引擎发现,自动推送篇
    夺命雷公狗—玩转SEO---49---让页面更好的被搜索引擎发现,主动推送篇
    夺命雷公狗—玩转SEO---48---让页面更好的被搜索引擎发现,外链篇
    夺命雷公狗—玩转SEO---47---让页面更好的被搜索引擎发现,网站地图篇
    夺命雷公狗—玩转SEO---46---浅谈搜索引擎
    夺命雷公狗—玩转SEO---45---浅入批量获得高频词
    夺命雷公狗—玩转SEO---44---外链群发原理
    夺命雷公狗—玩转SEO---43---外链提升网站权重
    夺命雷公狗—玩转SEO---42---快速交换友情链接
    夺命雷公狗—玩转SEO---41---H1标签的玩法
  • 原文地址:https://www.cnblogs.com/eastblue/p/11600446.html
Copyright © 2011-2022 走看看