机器学习-贝叶斯

186 阅读6分钟

转载贝叶斯

概率与数理统计

概率

概率是描述随机现象发生可能性的数学工具,是用来量化不确定性的概念。概率和数理统计在人工智能中用于辅助建模,其建模思想广泛应用于机器学习中的不同模型,如:高斯贝叶斯。

概念

定义:概率(Probability)是描述随机事件发生可能性的数值,通常表示为介于 0 到 1 之间的实数。概率为 0 表示事件不可能发生,概率为 1 表示事件一定发生。

  • 概率是一种固有属性,因为求概率是比较难的,所以我们往往使用频率 (frequency,在实际观测或试验中,某一事件发生的次数与总试验次数之比) 来代替。
  • 当实验次数越来越多时,频率就趋近于概率。在工程实践中,数据量很大时,概率直接拿频率来代替即可。

基本特性

  • 非负性:概率值始终是非负的,即概率值不会为负数,即:1 >= P(A) >= 0
  • 规范性:所有可能事件的概率之和等于1,即:P(A) + P(B) + P(B) … = 1

计算方法

离散型变量

概念
  • 离散型变量是指有限的状态中选一个变量。

  • 举例:

    • 例如:交通灯有红灯、绿灯、黄灯;
    • 例如:性别有男、女、未知;

离散量一般需要编码,编码的方式常见的有下面两种:

Zero index编码
  • 编码是从0开始,例如:0, 1, 2, 3, 4,…, N-1

  • 编码本身有大小,但是这个大小并没有数学内涵

    例如:编码1和编码4,它们只是一个编码,它们是平等的,并不存在类似考试成绩的排名,这个就是值没有数学内涵。

One hot编码
  • 编码是向量编码,其形式一般为:

    0: [1, 0, 0, 0, 0, ... ]
    1: [0, 1, 0, 0, 0, ... ]
    2: [0, 0, 1, 0, 0, ... ]
    

    备注:one hot是一种重要的编码,它从一开始认为人人平等,这一思想在自然语言处理中是核心理念。

离散量计算概率的例子
  • 假定有一个离散量做实验得到的数据为:[1, 2, 2, 2, 3, 1, 1]

  • 计算方法:(出现个数/总的个数)

  • 概率:

    • 事件1出现的概率P(1) = 3 / 8
    • 事件2出现的概率P(2) = 4 / 8
    • 事件3出现的概率P(3) = 1 / 8

以鸢尾花为例,通过代码求得各个类别的出现概率,代码如下:

from sklearn.datasets import load_iris

# 加载开源库中的iris数据集
X,y = load_iris(return_X_y=True)

P_y0 = (y == 0).mean()
P_y1 = (y == 1).mean()
P_y2 = (y == 2).mean()

print(f'类别0的鸢尾花出现概率P(0) = ', P_y0)
print(f'类别1的鸢尾花出现概率P(1) = ', P_y1)
print(f'类别2的鸢尾花出现概率P(2) = ', P_y2)

file

补充知识点:
以上计算得到的是先验概率,先验概率是指已经形成既定事实的概率分布,其是与生俱来的,改变不了的。

连续型变量

定义
  • 连续型变量是指可以取无限个数值的变量,其取值可以在一个区间内任意取值。

    例如:
    [0, 1]:一个从 0 到 1 的连续量中间可以有无数个采样结果

  • 严格意义上:

    • 对于连续量的某个单点(例如:0.6),这个点的概率是0(因为宽度为0,求积分为0)

    • 连续量的概率是概率密度函数积分,单点的积分上下限是0

      理论中的定义,在现实中是不太可能的,例如:在物理中经常提到在光滑的平面上求得….,完全光滑的平面在现实中是不存在的。所以,在工程中要进行化简,而人工智能是纯理论数学的工程化简。

概率密度函数

上述对连续量的概率介绍时,提到了一个重要的概念为概率密度函数(PDF, Probability Density Function)

  • 概率密度函数是概率的导函数(概率密度函数→求积分→概率)
  • 概率是概率密度函数的积分(概率→求微分→概率密度函数)
  • 概率密度函数是比较常见的,其中便有:高斯分布
高斯分布(正态分布)
  • 定义:高斯分布是一种连续型概率分布,其曲线呈钟形,对称分布在均值处,并由均值和方差两个参数完全描述。

  • 高斯分布的概率密度函数为:

image.png 其中,μ是均值,σ是标准差。

  • Python绘制高斯分布:
import numpy as np
from matplotlib import pyplot as plt

def gaussian(x, mu, sigma):
    """
    计算高斯分布的概率密度函数值

    参数:
    x: 随机变量
    mu: 均值
    sigma: 标准差

    返回:
    高斯分布的概率密度函数值
    """
    return 1/(np.sqrt(2*np.pi)*sigma) * np.exp(-(x - mu)**2 / (2*sigma**2))

# 测试高斯分布函数
x = np.linspace(start=-5, stop=5, num=100)
mu = 0
sigma = 1

# 可视化高斯分布
plt.plot(x, gaussian(x, mu=0, sigma=1), label="$\mu=0, \sigma=1$")
plt.plot(x, gaussian(x, mu=1, sigma=1), label="$\mu=1, \sigma=1$")
plt.plot(x, gaussian(x, mu=0, sigma=2), label="$\mu=0, \sigma=2$")

plt.title('Gaussian Distribution')
plt.xlabel('x')
plt.ylabel('Probability Density Function')
plt.grid(True)
plt.legend()
plt.show()

file

理论中的概率与工程中的概率

如果要求一个高斯分布函数上某一点的概率,其方法为求曲线的积分:
file

如果按照理论的方法是求不了概率的(因为理论中任意一点的宽度为0,进而概率也为0),所以我们需要进行工程化简。

核心思想:常规情况下,模型中对概率的使用,

  • 重在比较概率的大小,而不是计算概率的具体数值是多少
  • 求连续量的概率时,往往使用概率密度函数的值来代替概率的值(原因:求得是相对大小,而不是绝对大小)
连续量计算概率的例子
  • 假定有一个连续量采样数据:[1, 2, 2, 2, 3, 1, 1]

  • 计算方法:

    1. 计算概率密度函数来代替
    2. 由于上述采样数据的概率密度函数不可知,所以进一步工程化简
    3. 由于自然界普遍都是高斯分布,所以假定其是高斯分布即可
import numpy as np

def gaussian(x, mu, sigma):
   """
   计算高斯分布的概率密度函数值

   参数:
   x: 随机变量
   mu: 均值
   sigma: 标准差

   返回:
   高斯分布的概率密度函数值
   """
   return 1/(np.sqrt(2*np.pi)*sigma) * np.exp(-(x - mu)**2 / (2*sigma**2))

# 采样数据
logitis = np.array([1, 2, 2, 2, 2, 3, 1, 1])

# mu即为采样数据的均值
mu = logitis.mean()

# sigma即为采样数据的标准差
sigma = logitis.std()

# 求P(1)的概率
P1 = gaussian(x=1, mu=mu, sigma=sigma)
# 求P(2)的概率
P2 = gaussian(x=2, mu=mu, sigma=sigma)
# 求P(3)的概率
P3 = gaussian(x=3, mu=mu, sigma=sigma)

print(f'P(1)的概率为:',P1)
print(f'P(2)的概率为:',P2)
print(f'P(3)的概率为:',P3)