统计学习方法之朴素贝叶斯1.概述2.基础知识3.基本方法4.参数估计5.简单实现

1.概述

  • 朴素贝叶斯分类是贝叶斯分类器的一种,贝叶斯分类算法是统计学的一种分类方法,利用概率统计知识进行分类,其分类原理就是利用贝叶斯公式根据某对象的先验概率计算出其后验概率(即该对象属于某一类的概率),然后选择具有最大后验概率的类作为该对象所属的类。
  • 总的来说:当样本特征个数较多或者特征之间相关性较大时,朴素贝叶斯分类效率比不上决策树模型;当各特征相关性较小时,朴素贝叶斯分类性能最为良好。另外朴素贝叶斯的计算过程类条件概率等计算彼此是独立的,因此特别适于分布式计算。
  • 朴素:特征条件独立 贝叶斯:基于贝叶斯定理
  • 贝叶斯定理: P(A|B) = P(B|A) P(A) / P(B)

2.基础知识

条件概率是朴素贝叶斯模型的基础

  • 概率(Probability)——0和1之间的一个数字,表示一个特定结果发生的可能性。比如投资硬币,“正面朝上”这个特定结果发生的可能性为0.5,这个0.5就是概率。换一种说法,计算样本数据中出现该结果次数的百分比。即你投一百次硬币,正面朝上的次数基本上是50次。
  • 几率(Odds)——某一特定结果发生与不发生的概率比。如果你明天电梯上遇上你暗恋的女孩的概率是0.1,那么遇不上她的概率就是0.9,那么遇上暗恋女孩的几率就是1/9,几率的取值范围是0到无穷大。
  • 似然(Likelihood)——两个相关的条件概率之比,即给定B发生的情况下,某一特定结果A发生的概率和给定B不发生的情况下A发生的概率之比。另一种表达方式是,给定B的情况下A发生的几率和A的整体几率之比。两个计算方式是等价的。

A事件与B事件同时发生的概率表示为P(A∩B)。 A不发生的概率为1-P(A),写为P(~A),即矩形中除了圆圈A以外的其他部分。 A或者B至少有一个发生的概率表示为P(A∪B),即圆圈A与圆圈B共同覆盖的区域。

3.基本方法

设输入空间是一个n维向量的集合,输出空间是类标记集合,输入为特征向量x,输出为类标记y,X是定义在输入空间的随机向量,Y是定义在输出空间的随机变量。P(X,Y)是X和Y的联合概率分布。 朴素贝叶斯法通过训练数据集学习联合概率分布。 具体的学习先验概率分布和条件概率分布。 先验概率分布:

条件概率分布:

朴素贝叶斯对条件概率分布做了条件独立性的假设,具体的:

条件独立假设等于是说用于分类的特征在类确定的条件下都是条件独立的。 朴素贝叶斯分类时,对给定的输入x,通过学习到的模型计算后验概率P(y=c|X=x),将后验概率最大的类作为x的类输出。 后验概率根据贝叶斯定理进行:

所以贝叶斯分类器可以表示为:

注意到,对于所有的ck,分母都是一样的,所以有:

4.参数估计

4.1极大似然估计

用极大似然估计相应的概率:P(Y),P(X|Y)

先验概率的极大似然估计

条件概率的极大似然估计

4.2贝叶斯估计

用极大似然估计可能会出现所要估计的概率值为0的情况,这会影响到后验概率的计算结果,使得分类偏差,解决这一问题的方法就是使用贝叶斯估计。

先验概率的贝叶斯估计

条件概率的贝叶斯估计

其中lamda>=0。等价于在随机变量各个取值的频数上赋予一个正数。lambda=0,就是极大似然估计;取lamda=1,称为拉普拉斯平滑( Laplace smoothing)。

5.简单实现

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 10 17:33:38 2017

@author: jasonhaven
"""
import numpy as np
import operator

def createFeatureSpace(datas):
    xvectors_len=len(datas[0])
    xvectors_feature=[]
    for i in range(xvectors_len):
        xvectors_feature.append([])
    for x in datas:
        for i in range(xvectors_len):
            if x[i] not in xvectors_feature[i]:
                xvectors_feature[i].append(x[i])
    return xvectors_feature

def trainNB(datas,labels,feature):
    #计算先验概率
    prior_probability=np.zeros(len(set(labels))) #初始化先验概率
    positive_count = 0     #统计正类
    negative_count = 0     #统计负类
    labels_len=len(labels)
    for i in range(labels_len):
        if labels[i]==1:
            positive_count+=1
        else:
            negative_count+=1
    prior_probability[0] = positive_count / labels_len    #求得正类的先验概率
    prior_probability[1] = negative_count / labels_len    #求得负类的先验概率
    #计算条件概率
    condition_probability={}
    #print(condition_probability)
    for i,x in enumerate(feature):
        for j in range(len(x)):
            for y in set(labels):
                key=(x[j],y)
                sigma_jy=0
                sigma_y=0
                for k in range(len(datas)):
                    if labels[k]==y:
                        sigma_y+=1
                    if datas[k][i]==x[j] and labels[k]==y:
                        sigma_jy+=1
                condition_probability[key]=sigma_jy/sigma_y
    
    return prior_probability,condition_probability


def classify(instance,labels,prior_probability,condition_probability,feature):
    result=[]
    for i,y in enumerate(set(labels)):
        multi=prior_probability[i]
        for xi in instance:
            key=(xi,y)
            p_xy=condition_probability.get(key)
            multi*=p_xy
        result.append({str(y):multi})
    return result
    
def main():
    datas=[[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'],  [1, 'S'],
               [2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'],  [2, 'L'],
               [3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'],  [3, 'L']]
    labels=[-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]
    #构造特征向量表
    feature=createFeatureSpace(datas)
    prior_probability,condition_probability=trainNB(datas,labels,feature)
    instance=[2,'S']
    result=classify(instance,labels,prior_probability,condition_probability,feature)
    print(result)

if __name__ == '__main__':
    main()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏灯塔大数据

塔说 | 如何理解深度神经网络中的泛化理论?

前言 近年来的深度神经网络研究进展往往都重方法而轻理论,但理论研究能够帮助我们更好地理解深度学习成功背后的真正原因,并有望为进一步的研究指明方向。近日,普林斯顿...

42360
来自专栏AI科技评论

干货 | CVPR 2018论文:「随心所欲」换装换姿态

本文作者 Liqian Ma,他为 AI 科技评论撰写了他作为第一作者被 CVPR 2018 录用的 Spotlight 论文解读稿件。

16730
来自专栏机器之心

深度 | 思考VC维与PAC:如何理解深度神经网络中的泛化理论?

40440
来自专栏AI科技评论

大会 | 优必选悉尼AI研究院AAAI 2018顶会论文一览

AI 科技评论按:第 32 届人工智能顶级会议 AAAI 2018 在美国新奥尔良召开。在今年的 AAAI 上,优必选悉尼 AI 研究院共有 5 篇论文入选,其...

10930
来自专栏AI2ML人工智能to机器学习

最小二乘法的6个假设 (上篇)

我们曾经在“一步一步走向锥规划 - LS”里面详细介绍了最小二乘法的由来和几何解释。 并且, 在“回归分析中的问题和修正的探讨”中谈到了经典最小二乘法OLS的局...

46120
来自专栏决胜机器学习

循环神经网络(五) ——Bean搜索、bleu评分与注意力模型

22160
来自专栏数据科学与人工智能

【陆勤阅读】贝叶斯、概率分布与机器学习

一. 简单的说贝叶斯定理: 贝叶斯定理用数学的方法来解释生活中大家都知道的常识 形式最简单的定理往往是最好的定理,比如说中心极限定理,这样的定理往往会成为某一个...

24960
来自专栏人工智能

自然语言处理的神经网络模型初探

深度学习(Deep Learning)技术对自然语言处理(NLP,Natural Language Processing)领域有着巨大的影响。

1.3K110
来自专栏机器之心

深度 | 变分自编码器VAE面临的挑战与发展方向

选自akosiorek 机器之心编译 参与:刘天赐、李泽南 变分自编码器(VAE)与生成对抗网络(GAN)一样,是无监督学习最具前景的方法之一。本文中,牛津大学...

33950
来自专栏机器之心

深度学习贝叶斯,这是一份密集的6天速成课程(视频与PPT)

多数讲师和助教都是贝叶斯方法研究团队的成员以及来自世界顶级研究中心的研究者。很多讲师曾经在顶级国际机器学习会议例如 NIPS、ICML、ICCV、CVPR、IC...

19610

扫码关注云+社区

领取腾讯云代金券