贝叶斯公式在机器学习中有什么用,实例讲解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)占总数据中的比例是多少,这道题中我们直接可以看出来是14\frac 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)占总数据比例是相等的,都是14\frac 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)就是等于12\frac 1 2嘛,为何用乘法公式计算出来是14\frac 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记作为θ\theta。也就是说我们需要估计θ\theta的值是多少。
在这里插入图片描述
其中P(X=xθ=θ^)==fθ^(x)P(X=x|\theta=\hat {\theta})==f_{\hat \theta}(x)。上面那个公式的意思就是说,θ\theta有很多很多取值,θ^\hat \theta是其中一个。那么怎么知道哪个最好呢?计算θ^\hat \theta是X的最好参数的可能性P(θ=θ^X=x)P(\theta = \hat \theta |X=x),哪个可能性最大就选哪个参数。这就是极大似然法。,极大似然法就是现有有多个可能的参数取值,我不知道取哪个最好。为了知道取哪个最好。我要计算出各个参数为优参数的可能性。然后将可能性最大的那个参数作为目前的概率分布函数最优参数。
那假如θ\theta取值无限种情况呢?
θ\theta取值无限的情况下,需要用梯度下降优化极大似然法这个等式.下面这个等式。不懂梯度下降可以看看这两篇文章
https://www.zhihu.com/question/305638940/answer/670034343
https://blog.csdn.net/varyshare/article/details/89556131
在这里插入图片描述

posted @ 2019-05-22 21:12  varyshare|李韬  阅读(983)  评论(0编辑  收藏  举报