zoukankan      html  css  js  c++  java
  • 贝叶斯公式在机器学习中有什么用,实例讲解Python实现朴素贝叶斯分类器

    贝叶斯公式=贝叶斯定理

    贝叶斯公式到底想说啥

    贝叶斯公式就是想用概率数学来表示事件发生依赖关系。
    贝叶斯公式长下面这样:
    在这里插入图片描述

    用图形怎么表示贝叶斯公式

    P(X=x)P(X=x)就是X的面积。
    P(Y=y)P(Y=y)就是Y的面积。
    P(X=xY=y)P(X=x|Y=y)是什么?P(X=xY=y)P(X=x|Y=y)是指Y发生的情况下X发生的概率。用图形表示就是,只看Y的情况下Y里面的X占比多少。这不就是相交部分除以Y的面积么?相交部分计算方式=X的面积*相交部分占X的比率。
    再看看前面的公式就完全能理解了。
    在这里插入图片描述

    朴素贝叶斯分类器

    任何机器学习都是要套一个数学模型。那朴素贝叶斯分类器套的是什么模型呢?
    它是想计算一个概率值。什么概率呢?就是当样本为x时,这个样本来自类A的概率是多少,来自类B的概率是多少。如果来自类A的概率>来自类B的概率。那就分类器输出样本属于类A
    用公式表示就是P(A|x)>P(B|x)=》x属于A .其中P(A|x)表示当样本取值是x时它来自类A的概率,P(B|x)表示当样本取值是x时它来自类B的概率。
    这样咋看好像很有道理的样子。那么问题来了,我咋知道样本x属于A和B的概率,要我知道了那还用分嘛?

    接下来看,如何计算样本取值为x时属于A的概率P(A|x)、和属于B的概率P(B|x)(下面一段话很重要一定要仔细看,没弄懂不要往后看)

    根据贝叶斯公式我们知道P(Ax)=P(xA)P(A)P(x)P(A|x)=frac {P(x|A)*P(A)} {P(x)}。其中P(A)表类A占比总数据中的比例。P(x)是指样本值等于x的数据占总数据的比例。P(x|A)表示在类A中,有多少个和x一样的数据。这三个概率我们都是知道的。那么或许你会问前面只有一个特征,那两个特征的样本怎么计算概率?答:假设一个样本有两个特征x,y。那么P(x,y)=P(x)P(y)P(x,yA)=P(xA)P(yA),P(A)P(x,y)=P(x)*P(y),P(x,y|A)=P(x|A)*P(y|A), P(A)和只有一个特征时计算方法一样。计算P(B|x)和计算P(A|x)同理。
    举个例子:

    数据格式为
    (样本值x,样本值y,类标签)
    (1,0,A)
    (0,1,A)
    (1,1,B)
    (0,0,B)
    

    如果我们想知道样本(0,1)是属于类A的概率P(A=(0,1))P(A|样本值=(0,1))有多大,我们得先计算下这几个概率值:P(A),P(0,1|A),P(0,1)

    • P(A)=24P(A)=frac 2 4这个指的是标签为A的数据占总数据中的比例
    • P(0,1)=P(x=0)P(y=1)=1212=14P(0,1)=P(样本值x=0)*P(样本值y=1)=frac 1 2 * frac 1 2=frac 1 4;其中P(0,1)P(0,1)指的是样本(0,1)占总数据中的比例是多少,这道题中我们直接可以看出来是14frac 1 4,但是有些情况下无法直接统计和样本值完全相同那就得用公式P(x)P(y)P(x)*P(y)计算P(x,y)P(x,y)了。其中P(x=0)P(样本值x=0)指的是样本第一个特征等于0的数据占总数据中的比例。其中P(y=1)P(样本值y=1)指的是样本第二个特征等于1的数据占总数据中的比例。我们通过P(x=0)P(y=1)P(样本值x=0)*P(样本值y=1)计算出来的值和我们直接观察到的(0,1)占总数据比例是相等的,都是14frac 1 4证明我们计算没有问题。
    • P(0,1A)=P(x=0A)P(y=1A)=14P(0,1|A)=P(样本x=0|A)*P(样本y=1|A)=frac 1 4; 用乘法公式P(x=0A)P(y=1A)P(样本x=0|A)*P(样本y=1|A)计算P(0,1|A)。你或许会发现明明P(0,1|A)就是等于12frac 1 2嘛,为何用乘法公式计算出来是14frac 1 4。这是因为乘法公式的前提是特征x和特征y时相互独立的。而在本例中乘法公式失效是因为在类A中的数据两个特征x,y是明显是相互干扰,x=1那么y不是1。通过举例子是想告诉大家,贝叶斯分类器它默认的前提是各个特征他们是相互独立的,这个特征的取值不会影响另一个特征的取值。其实主要原因是我们为了方便说明数据量太少所以不独立很正常,只有数据量足够大才能表现出独立性。

    Python编程实践贝叶斯分类器

    # -*- coding: utf-8 -*-
    """
    贝叶斯分类器实现逻辑异或
    
    @author: @Ai酱
    """
    import numpy as np
    #数据格式[特征x,特征y,标签]
    data = np.array([[1, 1, 'B'],[1, -1, 'A'],[-1,1, 'A'],[-1, -1, 'B']])# 注意:当Numpy的ndarray有不同类型同时存在时它们会转换为字符串
    label_index = 2
    feature_num = 2
    
    def counter(feature_index,value):
        return float(np.count_nonzero(data[:,feature_index]==str(value)))# 注意:当Numpy的ndarray有不同类型同时存在时它们会转换为字符串
    
    
    def P_label_x(label,x):
        '''
        计算P(label|x)的概率
        label取值:'A','B'
        '''
        # 计算p(x=(x1,x2...))=p(x1)*p(x2)*...
        p_x = 1
        for i in range(feature_num):
            p_x = p_x * (counter(i,x[i])/data.shape[0])
        # 计算p(label)
        p_label = counter(label_index,label)/data.shape[0]
        # 计算p(x|label)=p(x1|label)*p(x2|label)*...
        p_x_label = 1
        data_is_label = data[data[:,label_index]==label]
        for i in range(feature_num):
            num_xi_in_label = np.count_nonzero(data_is_label[:,i]==x[i])
            p_x_label = p_x_label * (num_xi_in_label/data_is_label.shape[0])
            pass
        # 计算p(label|x)=(p(x|label)*p(label))/p(x)
        p_label_x = (p_x_label*p_label)/p_x
        return p_label_x
    
    def bayes_classifier(x):
        '''对样本x进行分类'''
        p_A_x = P_label_x('A',x)
        p_B_x = P_label_x('B',x)
        if p_A_x>p_B_x:
            return 'A'
        else:
            return 'B'
        pass
    
    print(bayes_classifier(np.array([-1,1])))
    
    

    贝叶斯公式在机器学习中有什么用?答参数估计

    答:用于参数估计。机器学习做的事情其实就是找到一个概率分布函数,输入一个数据输出是这个数据属于某个类的概率。
    那么怎么找这个概率分布函数呢?一般是默认是高斯分布。

    下面是用贝叶斯公式估计逻辑回归里面的参数过程

    假设样本的概率分布是高斯分布。高斯分布长下面这样,有两个参数uσu和sigma。贝叶斯公式就是用来估计这两个参数。
    在这里插入图片描述
    那么贝叶斯公式怎么估计这两个参数你呢?将uσu和sigma记作为θ heta。也就是说我们需要估计θ heta的值是多少。
    在这里插入图片描述
    其中P(X=xθ=θ^)==fθ^(x)P(X=x| heta=hat { heta})==f_{hat heta}(x)。上面那个公式的意思就是说,θ heta有很多很多取值,θ^hat heta是其中一个。那么怎么知道哪个最好呢?计算θ^hat heta是X的最好参数的可能性P(θ=θ^X=x)P( heta = hat heta |X=x),哪个可能性最大就选哪个参数。这就是极大似然法。,极大似然法就是现有有多个可能的参数取值,我不知道取哪个最好。为了知道取哪个最好。我要计算出各个参数为优参数的可能性。然后将可能性最大的那个参数作为目前的概率分布函数最优参数。
    那假如θ heta取值无限种情况呢?
    θ heta取值无限的情况下,需要用梯度下降优化极大似然法这个等式.下面这个等式。不懂梯度下降可以看看这两篇文章
    https://www.zhihu.com/question/305638940/answer/670034343
    https://blog.csdn.net/varyshare/article/details/89556131
    在这里插入图片描述

    知乎 https://www.zhihu.com/people/yuanmuou/activities
  • 相关阅读:
    KindEditor编辑器的使用
    导航栏
    ajax php 验证注册用户名是否存在
    PS照片改底色
    截取邮箱@后面内容的两种情况
    js导航栏单击事件背景颜色变换
    model中的自动验证 $_validate $_auto
    一对一关联模型,HAS_ONE
    一对多关联模型,BELONGS_TO
    C++操作MySQL数据库
  • 原文地址:https://www.cnblogs.com/ailitao/p/11047293.html
Copyright © 2011-2022 走看看