机器学习-朴素贝叶斯原理及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(苹果|黄色) = 0.1/0.5=0.2

朴素贝叶斯是一种十分简单的分类算法,称其朴素是因为其思想基础的简单性:就文本而言,它认为词袋中的两两词之间的关系是相互独立的,即一个对象的特征向量中每个维度都是相互独立的。

黄色是苹果和梨共有的属性,但苹果和梨是相互独立的。

朴素贝叶斯的正式定义如下:

(1)设x = {a1,a2,....,am}为一个待分类项,而每个a为x的一个特征属性。

(2)有类别集合 C = {y1,y2,...yn}

(3)计算P(y1|x),P(y2|x),...P(yn|x).

(4)如果P(yk|x) = max(P(y1|x),P(y2|x),...P(yn|x)),则x∈yk.

关键就是计算第(3)步中的各个条件概率,可按照以下步骤计算

(1)找到一个已知分类的待分类项集合,也就是训练集。

(2)统计得到在各类别下各个特征属性的条件概率估计。即:

P(a1|y1),P(a2|y1),...P(am|y1);

P(a1|y2),P(a2|y2),...P(am|y2);

P(a1|y1),P(a2|yn),...P(am|yn);

(3)如果各个特征属性是条件独立的(或者假设它们之间是相互独立的),则根据贝叶斯定理有如下推导

P(yi|x) = (P(x|yi)P(yi))/P(x)

因为分母对于所有类别为常熟,只要将分子最大化即可。又因为各特征属性是条件独立的,所以又

P(x|yi)P(yi) = P(a1|yi)P(a2|yi)...P(am|yi)P(yi)

根据上述分析,朴素贝叶斯分类的流程可以表示如下:

第一阶段:训练数据生成训练样本集:TF-IDF

第二阶段:对每个类别计算P(yi)

第三阶段:对每个特征属性计算所有划分的条件概率

第四阶段:对每个类别计算P(x|yi)P(yi)

第五阶段:以P(x|yi)P(yi)的最大项作为x的所属类别。

代码:

import numpy as np

class NBayes(object):
    # 1.默认构造方法
    def __init__(self):
        self.vocabulary = []    # 词典
        self.idf = 0            # 词典的IDF权值向量
        self.tf = 0             # 训练集的权值矩阵
        self.tdm = 0            # P(x|yi)
        self.Pcates = {}        # P(yi)是一个类别字典
        self.labels = []        # 对应每个文本的分类,是一个外部导入的列表
        self.doclength = 0      # 训练集文本数
        self.vocablen = 0       # 词典词长
        self.testset = 0        # 测试集

    # 2.导入和训练数据集,生成算法必须的参数和数据结构
    def train_set(self, trainset, classVec):
        self.cate_prob(classVec)    # 计算每个分类在数据集中的概率P(yi)
        self.doclength = len(trainset)
        tempset = set()
        [tempset.add(word) for doc in trainset for word in doc] # 生成词典
        self.vocabulary = list(tempset)
        self.vocablen = len(self.vocabulary)
        self.calc_wordfreq(trainset)    # 计算词频数据集
        self.build_tdm()    # 按分类累计向量空间的每维值P(x|yi)

    # 3.cate_prob函数:计算在数据集中每个分类的概率P(yi)
    def cate_prob(self,classVec):
        self.labels = classVec
        labeltemps = set(self.labels)   # 获取全部分类
        for labeltemp in labeltemps:
            # 统计列表中重复的分类:self.labels.count(labeltemp)
            self.Pcates[labeltemp] = float(self.labels.count(labeltemp)) / float(len(self.labels))

    # 4.calc_wordfreq函数:生成普通的词频向量
    def calc_wordfreq(self, trainset):
        self.idf = np.zeros([1, self.vocablen]) # 1*字典数
        self.tf = np.zeros([self.doclength, self.vocablen]) # 训练集文件数 * 词典数
        for indx in range(self.doclength): # 遍历所有的文本
            for word in trainset[indx]: # 遍历文本中的每个词
                # 找到文本的词在字典中的位置+1
                self.tf[indx, self.vocabulary.index(word)] += 1
            for signleword in set(trainset[indx]):
                self.idf[0,self.vocabulary.index(signleword)] += 1

    # 5.build_tdm函数:按分类累计计算向量空间的每维值P(x|yi)
    def build_tdm(self):
        self.tdm = np.zeros([len(self.Pcates), self.vocablen])  # 类别行 * 词典列
        sumlist = np.zeros([len(self.Pcates), 1])   # 统计每个分类的总值
        for indx in range(self.doclength):
            # 将同一类别的词向量空间值加总
            self.tdm[self.labels[indx]] += self.tf[indx]
            # 统计每个分类的总值--是一个标量
            sumlist[self.labels[indx]] = np.sum(self.tdm[self.labels[indx]])
        self.tdm = self.tdm / sumlist   # 生成P(x|yi)

    # 6.map2vocab函数:将测试集映射到当前词典
    def map2vocab(self, testdata):
        self.testset = np.zeros([1,self.vocablen])
        for word in testdata:
            self.testset[0, self.vocabulary.index(word)] += 1

    # 7.predict函数:预测分类结果,输出预测的分类类别
    def predict(self, testset):
        if np.shape(testset)[1] != self.vocablen:   # 如果测试集长度与词典不相等,则退出程序
            print(‘输入错误‘)
            exit(0)
        predvalue = 0   # 初始化类别概率
        predclass = ""  # 初始化类别名称
        for tdm_vect, keyclass in zip(self.tdm, self.Pcates):
            # P(x|yi)P(yi),变量tdm,计算最大分类值
            temp = np.sum(testset * tdm_vect * self.Pcates[keyclass])
            if temp > predvalue:
                predvalue = temp
                predclass = keyclass
        return predclass

from numpy import *
import numpy as np

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‘, ‘my‘],
        [‘stop‘, ‘posting‘, ‘stupid‘, ‘worthless‘, ‘garbage‘],
        [‘mr‘, ‘licks‘, ‘ate‘, ‘my‘, ‘steak‘, ‘how‘, ‘to‘, ‘stop‘, ‘him‘],
        [‘quit‘, ‘buying‘, ‘worthless‘, ‘dog‘, ‘food‘, ‘stopid‘]
    ]
    # 每个文本对应的分类
    classVec = [0, 1, 0, 1, 0, 1]
    return postingList,classVec

# 导入外部数据集
# dataset:句子的词向量,listClasses:是句子所属的类别
dataset, listClasses = loadDataSet()
nb = NBayes()   # 实例化
nb.train_set(dataset, listClasses)  # 训练数据集
nb.map2vocab(dataset[0])    # 随机选择一个测试句
print(nb.predict(nb.testset))

原文地址:https://www.cnblogs.com/EnzoDin/p/12405578.html

时间: 2024-10-12 04:41:43

机器学习-朴素贝叶斯原理及Python实现的相关文章

机器学习—朴素贝叶斯

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

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

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

朴素贝叶斯算法的Python实现

注意:1.代码中的注释请不要放在源程序中运行,会报错. 2.代码中的数据集来源于http://archive.ics.uci.edu/ml/datasets/Car+Evaluation 3.对于朴素贝叶斯的原理,可以查看我的前面的博客 # Author :Wenxiang Cui # Date :2015/9/11 # Function: A classifier which using naive Bayesian algorithm  import math class Bayesian:

机器学习——朴素贝叶斯(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. 贝叶斯公式是机器学习中常用的计算方法,例如,甲射中靶标的概率是0.4,乙射中靶标的概率是0.8,现在有个人中靶了,问问是甲射中的概率.这非常好计算,P=0.4/(0.8+0.4)=0.33,这是贝叶斯公式的基本应用,具体的贝叶斯公式如下: 2.<机器学习实战>中的贝叶斯实现: 略有修改,已经在本地电脑通过测试,可以运行 import numpy as np #-_-_-_-_-_- dataset=[['my', 'dog', 'has', 'flea', 'problems', 'he

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

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