机器学习-朴素贝叶斯



1. 贝叶斯公式是机器学习中常用的计算方法,例如,甲射中靶标的概率是0.4,乙射中靶标的概率是0.8,现在有个人中靶了,问问是甲射中的概率。这非常好计算,P=0.4/(0.8+0.4)=0.33,这是贝叶斯公式的基本应用,具体的贝叶斯公式如下:

2.《机器学习实战》中的贝叶斯实现:

略有修改,已经在本地电脑通过测试,可以运行

import numpy as np
#-_-_-_-_-_-
dataset=[['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]

#将出现的所有单词放在一个列表中,再将列表转为集合,(调用的时候再转化为列表)
def createVocabList(dataSet0):
    vocalist=[]
    for i in dataSet0:
        for d in i :
            vocalist.append(d)
    return set(vocalist)
#将数据转为向量,类似于one_hot编码
def setOfWords2Vec(vocabList, inputSet):
    temp_vector=np.zeros((len(vocabList)))
    for i in inputSet:
        if i in vocabList:
            temp_vector[vocabList.index(i)]=1
    return temp_vector

##核心部分,训练算法
#输入 trainMatrix [[0,1 0.....],[0.1,1,1 0......],....]
# 输入trainCategory,标签[0,1,0,1,0,1]
# classifyNB函数会用到贝叶斯公式p(c|w)=p(c)p(w|c)/p(w)
# p(c)比较容易求
#
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs) #p(c)
    #这里之所以不初始为0,是因为p(w|c),可以看成p(w0,w1,w2...|c)
    #如果假设特征之间相互独立,则写成
    #p(w0|ci)p(w1|ci)p(w2|ci)...p(wN|ci)
    #所以为了防止其中一个为0,导致整体概率为0,须将数值初始化为1,分母初始为2
    p0Num = np.ones(numWords); p1Num = np.ones(numWords)      #change to ones()
    p0Denom = 2.0; p1Denom = 2.0                        #change to 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])
    #Python在很多小数相乘的时候,会产生下溢,因为精度不够,所以改成log
    p1Vect = np.log(p1Num/p1Denom)          #change to log()
    p0Vect = np.log(p0Num/p0Denom)          #change to log()
    return p0Vect,p1Vect,pAbusive

#核心算法,利用贝叶斯进行分类
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
#  因为在训练的时候转成了log,所以乘法变加法log(a*b)=log(a)+log(b)
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)  #分母一样,故把分母省略了
    p0 = sum(vec2Classify * p0Vec) + np.log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0
if __name__=='__main__':
    temp_set=createVocabList(dataset)
    word_list=list(temp_set)
    trainmatrix=[]
    for item in dataset:
        temp_vector=setOfWords2Vec(word_list,item)
        trainmatrix.append(temp_vector)
    p0Vect, p1Vect, pAbusive=trainNB0(trainmatrix,classVec)
    #这是我测试用的,如果输出为0,就是正确的
    #这个test向量对应的是我自己设置的词列表['cute','love']
    test=np.zeros(len(word_list))
    test[0]=1
    test[1]=1
    b=classifyNB(test,p0Vect,p1Vect,pAbusive)
    print(b)
#输出为0,符合预期

3. sklearn中的贝叶斯实现:
查看了一下sklearn源代码,GaussianNB主要部分如下所示:

def _joint_log_likelihood(self, X):
        check_is_fitted(self, "classes_")

        X = check_array(X)
        joint_log_likelihood = []
        for i in range(np.size(self.classes_)):
        #####这一部分和上边的classifyNB函数代码大同小异--------
            jointi = np.log(self.class_prior_[i])
            n_ij = - 0.5 * np.sum(np.log(2. * np.pi * self.sigma_[i, :]))
            n_ij -= 0.5 * np.sum(((X - self.theta_[i, :]) ** 2) /
                                 (self.sigma_[i, :]), 1)
            joint_log_likelihood.append(jointi + n_ij)
        #####-------------------------------------------------
        joint_log_likelihood = np.array(joint_log_likelihood).T
        return joint_log_likelihood

上述的源代码只不过是令公式中的:

实际应用也非常简单,这个分类一般应用于连续的,符合正态分布的数据上,除此之外,还有一个MultinomialNB,这个一般应用于离散的数据上.这个贝叶斯分类的对应的公式是:

他包含三个参数
alpha:即为上面的常数λ,默认为1,设置的时候稍大于1或者稍小于1
fit_prior:是否考虑先验概率
class_prior:即贝叶斯公式中的P(C),在fit_prior为true的情况下,如果不填这个参数,他会从样本中计算.

原文地址:https://www.cnblogs.com/starstrrys/p/11747342.html

时间: 2024-10-13 21:18:00

机器学习-朴素贝叶斯的相关文章

机器学习—朴素贝叶斯

机器学习-朴素贝叶斯 本文代码均来自<机器学习实战> 朴素贝叶斯的两个基本假设: 独立:一个特征出现的可能性和与它和其他特征相邻没有关系 每个特征同等重要 这段代码是以文本分类为例介绍朴素贝叶斯算法的 要从文本中获取特征,需要先拆分文本.这里的特征是来自文本的词条(token),一个词条是字符的任意组合.可以把词条想象为单词,也可以使用非单词词条,如URL.IP地址或者任意其他字符串.然后将一个文本片段表示为一个词向量,其中值为1表示词条出现,0表示词条未出现. ??以在线社区的留言板为例,为

机器学习-朴素贝叶斯原理及Python实现

机器学习-朴素贝叶斯原理及Python实现 贝叶斯公式 P(A|B) = (P(B|A)P(A))/P(B) 举例:苹果10个,有2个黄色:梨10个,有6个黄色,求拿出一个黄色水果,是苹果的概率. 代入公式: P(苹果|黄色) = (P(黄色|苹果)P(苹果))/P(黄色) P(黄色) = (2+6)/20 = 2/5 P(苹果) = 10/20 = 1/2 = 0.5 P(黄色|苹果)=1/5 P(黄色|苹果)P(苹果) = P(黄色,苹果) = 1/5*1/2 = 1/10 = 0.1 P(

机器学习——朴素贝叶斯(NBC)

朴素贝叶斯分类(NBC)是机器学习中最基本的分类方法,是其他众多分类算法分类性能的对比基础,其他的算法在评价性能时都在NBC的基础上进行.同时,对于所有机器学习方法,到处都蕴含着Bayes统计的思想. 朴素贝叶斯基于贝叶斯地理和特征条件独立性假设,首先基于条件独立性假设学习输入X和输出Y的联合分布P(X,Y),同时利用先验概率P(Y),根据贝叶斯定理计算出后验概率P(Y|X),找出每个类别的最大的后验概率即确定为相应的类别.算法实现简单,学习和预测的效率都很高, 基本定义 输入空间Rn为特征化的

通俗易懂机器学习——朴素贝叶斯算法

本文将叙述朴素贝叶斯算法的来龙去脉,从数学推导到计算演练到编程实战 文章内容有借鉴网络资料.李航<统计学习方法>.吴军<数学之美>加以整理及补充 基础知识补充: 1.贝叶斯理论–吴军数学之美 http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/ 2.条件概率 3.联合分布 朴素贝叶斯算法 朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设的 分类方法.给定训练数据集,首先基于特征条件独立假设学习 输入/输出的联合概率分布

通俗机器学习—朴素贝叶斯

引言 机器学习分类中的k近邻法和决策树师确定的分类算法,数据实例最终会被明确划分到某个分类中,本节我们讨论的分类算法将不能 完全确定数据实例应该划分到某个分类,或者智能给出数据实例属于给定分类的概率 一 朴素贝叶斯算法 1. 简介 Na?veBayes算法,又叫朴素贝叶斯算法,朴素:特征条件独立:贝叶斯:基于贝叶斯定理.属于监督学习的生成模型,实现简单,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑.在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景. 2. 基本思想 (1

机器学习-朴素贝叶斯应用-判断垃圾邮件

文章中代码均来自于<机器学习实战> 这个程序没有邮件的文件的话是不能运行的,要是想试试可以去网上搞搞文件 ''' Created on Oct 19, 2010 @author: Peter ''' #和其他复杂模型不一样,朴素贝叶斯的思想和操作比较简单,它一般是内嵌在处理具体问题的函数中的,而不像神经网络模型或者决策树等等有自己独立的方法 from numpy import * def createVocabList(dataSet): #将data中出现的所有词放在一个列表中 vocabS

机器学习--朴素贝叶斯算法原理、方法及代码实现

一.朴素的贝叶斯算法原理 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据,朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种,朴素的意思是条件概率独立性. 条件概率的三个重要公式: (1)概率乘法公式: P(AB)= P(B) P(A|B) = P(A) P(B|A) =P(BA) (2)全概率公式:        (3)贝叶斯公式:            如果一个事物在一些属性条件发生的情况下,事物属于A的概率>属于B的概率,则判定事物属于A,这就是朴素贝叶斯的基本思想. 二.算法步骤 (

机器学习--朴素贝叶斯算法案例

电子邮件垃圾过滤 1.如何从文本文档中构建自己的词列表.使用正则表达式切分句子,并将字符串全部转换为小写. #################################### # 功能:切分文本 # 输入变量:大字符串 big_string # 输出变量:字符串列表 #################################### def text_parse(big_string): list_of_tokens = re.split(r'\W*', big_string) re

机器学习——朴素贝叶斯分类器

假设现在要构建一个网络图书馆,我们可以给新进来的书贴上若干个标签,没有机器学习算法的情况下,我们需要给这些书手动分类,是计算机类的呀,还是非计算机类的呀,是小说类的呀,还是非小说类的云云. 那么,我们可以通过让程序自己学习如何通过一本书上的若干标签来进行图书类别的区分,这样就可以节省很多人力,这也是机器学习的魅力体现. 机器学习的基本原理是通过开发者给出这个程序一个学习集进行学习,再通过用户给的用户数据集进行学习的过程,机器学习包含很多的算法,当然,有大量数据的前提下,机器学习就和统计学密不可分