首页 > 编程语言 >python机器学习算法原理实现——MCMC算法之gibbs采样

python机器学习算法原理实现——MCMC算法之gibbs采样

时间:2023-11-16 12:02:13浏览次数:31  
标签:采样 MCMC python 0.5 维度 算法 Gibbs np 正态分布

【算法原理】

Gibbs采样是一种用于估计多元分布的联合概率分布的方法。在MCNC(Markov Chain Monte Carlo)中,Gibbs采样是一种常用的方法。

通俗理解Gibbs采样,可以想象你在一个多维空间中,你需要找到这个空间的某个特定区域(这个区域代表了你感兴趣的分布)。但是,你不能直接看到整个空间,只能一次看到一个维度。所以,你在一个维度上移动,然后在下一个维度上移动,依此类推,直到你遍历了所有的维度。这个过程就像是在空间中随机漫步,每次只在一个维度上移动。最终,你在空间中的位置就会遵循你感兴趣的分布。

在实际操作中,Gibbs采样的步骤如下:

1. 初始化所有变量的值。
2. 对于每一个变量,固定其他变量的值,然后从该变量的条件概率分布中采样一个新的值。
3. 重复第2步,直到满足某个停止条件(例如,达到预定的迭代次数)。

这个过程会生成一系列的样本,这些样本的分布会逐渐接近你感兴趣的分布。

 

【实际应用】

Gibbs采样在许多领域都有广泛的应用,主要包括:

1. 机器学习和数据挖掘:在贝叶斯网络、隐马尔可夫模型、主题模型(如LDA)等模型的学习和推理中,Gibbs采样被用来估计模型参数或隐藏变量的后验分布。

2. 计算生物学和生物信息学:在基因序列分析、蛋白质结构预测等问题中,Gibbs采样被用来寻找最可能的生物序列或结构。

3. 图像处理和计算机视觉:在图像分割、图像恢复、目标识别等问题中,Gibbs采样被用来估计像素或目标的最可能状态。

4. 统计物理:在研究磁性材料、液体等物理系统的性质时,Gibbs采样被用来模拟系统的微观状态,从而计算系统的宏观性质。

5. 优化问题:在解决组合优化问题(如旅行商问题、图着色问题)时,Gibbs采样可以用来寻找问题的近似解。

这些应用中,Gibbs采样的主要优点是它可以处理高维度和复杂的概率分布,而不需要知道分布的标准化常数,这在许多问题中是非常有用的。

 

【算法编程】

好的,让我们来看一个简单的二维正态分布的例子。假设我们有一个二维正态分布,其均值为(0, 0),协方差矩阵为[1, 0.5], [0.5, 1]]。我们想要从这个分布中采样。

在这个例子中,我们可以使用Gibbs采样来进行采样。具体步骤如下:

1. 初始化:选择一个初始点,例如(0, 0)。

2. 迭代更新:我们先固定y,然后从x的条件概率分布中采样一个新的x值。然后,我们固定新的x值,从y的条件概率分布中采样一个新的y值。这就完成了一次迭代。

3. 收敛判断:重复第2步,直到达到预定的迭代次数。

在Python中,我们可以使用以下代码来实现这个过程:

import numpy as np
import matplotlib.pyplot as plt

# 初始化
x, y = 0.0, 0.0
samples = [(x, y)]

# 迭代更新
for _ in range(10000):
    x = np.random.normal(0.5 * y, np.sqrt(1 - 0.5 ** 2))
    y = np.random.normal(0.5 * x, np.sqrt(1 - 0.5 ** 2))
    samples.append((x, y))

# 绘制结果
samples = np.array(samples)
plt.scatter(samples[:, 0], samples[:, 1], s=1)
plt.show()

  运行这段代码,你会看到生成的样本点在二维空间中形成一个椭圆形的分布,这就是我们想要的二维正态分布。

这个例子展示了Gibbs采样的基本原理:通过在每个维度上进行条件采样,我们可以逐渐接近目标分布。这种方法对于高维度和复杂的分布特别有效。

本机运行实际效果:

python机器学习算法原理实现——MCMC算法之gibbs采样_二维

 

【关键代码】

x = np.random.normal(0.5 * y, np.sqrt(1 - 0.5 ** 2))
y = np.random.normal(0.5 * x, np.sqrt(1 - 0.5 ** 2))
这个是什么意思?为什么这样?

这两行代码是在进行Gibbs采样的核心步骤:条件采样。这里的目标是一个二维正态分布,其均值为(0, 0),协方差矩阵为[1, 0.5], [0.5, 1]]。

在Gibbs采样中,我们需要在每个维度上进行条件采样。对于二维正态分布,如果我们知道了其中一个维度的值,那么另一个维度的值就服从一个一维的正态分布。

具体来说,如果我们知道了y的值,那么x的值就服从一个均值为0.5 * y,标准差为sqrt(1 - 0.5 2)的正态分布。这就是x = np.random.normal(0.5 * y, np.sqrt(1 - 0.5 ** 2))这行代码的意思。

同理,如果我们知道了x的值,那么y的值就服从一个均值为0.5 x,标准差为sqrt(1 - 0.5 2)的正态分布。这就是y = np.random.normal(0.5 * x, np.sqrt(1 - 0.5 ** 2))这行代码的意思。

这两行代码就完成了一次Gibbs采样的迭代:先在x维度上进行条件采样,然后在y维度上进行条件采样。通过多次迭代,我们可以得到一系列的样本,这些样本的分布会逐渐接近我们的目标分布。

 

【核心】

如果我们知道了y的值,那么x的值就服从一个均值为0.5 * y,标准差为sqrt(1 - 0.5 2)的正态分布。==》为什么???

这个结论是基于二维正态分布的性质得出的。在二维正态分布中,如果我们知道了其中一个维度的值,那么另一个维度的值就服从一个一维的正态分布,其均值和标准差可以由原二维正态分布的参数计算得出。

具体来说,对于一个二维正态分布,其均值为(μx, μy),协方差矩阵为[σx^2, ρσxσy], [ρσxσy, σy^2]](其中ρ是x和y的相关系数),如果我们知道了y的值,那么x的值服从一个均值为μx + ρσx/σy * (y - μy),标准差为σx * sqrt(1 - ρ^2)的正态分布。

在这个例子中,我们的二维正态分布的均值为(0, 0),协方差矩阵为[[1, 0.5], [0.5, 1]],所以ρ = 0.5,σx = σy = 1。因此,如果我们知道了y的值,那么x的值就服从一个均值为0.5 * y,标准差为sqrt(1 - 0.5^2)的正态分布。

这就是x = np.random.normal(0.5 * y, np.sqrt(1 - 0.5 ** 2))这行代码的理论依据。同理,y = np.random.normal(0.5 * x, np.sqrt(1 - 0.5 ** 2))也有相同的理论依据。

 

例如,如果我们想要生成一个均值为0,标准差为1的正态分布的随机数,可以这样写:

x = np.random.normal(0, 1)

如果我们想要生成一个形状为(3, 2)的数组,其中的元素都是从均值为0,标准差为1的正态分布中生成的,可以这样写:

x = np.random.normal(0, 1, (3, 2))

 

【最后,我们看看gibbs算法的正确性推导】--需要较多的数学知识,可以略过

Gibbs采样的正确性基于马尔可夫链蒙特卡洛(Markov Chain Monte Carlo,MCMC)方法的理论,其核心思想是构造一个马尔可夫链,使其平稳分布就是我们要采样的目标分布。

Gibbs采样的正确性推导可以从以下几个步骤进行:

1. 构造马尔可夫链:在Gibbs采样中,我们通过在每个维度上进行条件采样来构造马尔可夫链。这个马尔可夫链的状态就是所有变量的值,转移概率就是条件概率分布。

2. 证明马尔可夫链的平稳分布是目标分布:我们需要证明,如果我们按照Gibbs采样的方式进行转移,那么马尔可夫链的平稳分布就是我们要采样的目标分布。这一步通常需要用到详细平衡条件,即对于任意两个状态,从一个状态转移到另一个状态的概率等于从另一个状态转移到这个状态的概率。

3. 证明马尔可夫链是遍历的:我们还需要证明,马尔可夫链是遍历的,即从任意状态出发,经过足够长的时间,可以到达任意其他状态。这一步通常需要用到马尔可夫链的遍历性定理。

通过以上三个步骤,我们就可以证明Gibbs采样的正确性。具体的证明过程涉及到一些概率论和马尔可夫链的理论,可能需要一些数学背景。

 

 



标签:采样,MCMC,python,0.5,维度,算法,Gibbs,np,正态分布
From: https://blog.51cto.com/u_11908275/8416140

相关文章

  • 机器学习算法原理实现——HMM生成序列和维特比算法
    【HMM基本概念】隐马尔可夫模型(Hidden Markov Model,HMM)是一种统计模型,用于描述一个含有未知参数(隐状态)的马尔可夫过程。在HMM中,我们不能直接观察到状态,但可以观察到每个状态产生的一些相关数据(观测值)。HMM的目标是,给定观测序列,估计出最可能的状态序列。HMM的基本假设有两个(见例子......
  • 机器学习算法原理实现——EM算法
    【EM算法简介】EM算法,全称为期望最大化算法(Expectation-Maximization Algorithm),是一种迭代优化算法,主要用于含有隐变量的概率模型参数的估计。EM算法的基本思想是:如果给定模型的参数,那么可以根据模型计算出隐变量的期望值;反过来,如果给定隐变量的值,那么可以通过最大化似然函数来估......
  • 机器学习算法原理实现——朴素贝叶斯
    【先说条件概率】条件概率是指在某个事件发生的条件下,另一个事件发生的概率。以下是一个实际的例子:假设你有一副扑克牌(不包括大小王,共52张牌),你随机抽一张牌。我们设事件A为"抽到的牌是红色的"(红心和方块为红色,共26张),事件B为"抽到的牌是心"(红心共13张)。1.首先,我们可以计算事件A和事......
  • 机器学习算法原理实现——最大熵模型
    【写在前面】在sklearn库中,没有直接称为"最大熵模型"的类,但是有一个与之非常相似的模型,那就是LogisticRegression。逻辑回归模型可以被视为最大熵模型的一个特例,当问题是二分类问题,且特征函数是输入和输出的线性函数时,最大熵模型就等价于逻辑回归模型。【最大熵模型的原理】最大熵......
  • OSS+S3+python S3
    OSS是什么? 参考:https://zhuanlan.zhihu.com/p/544661650 ......
  • 算法刷题记录-哈希表
    算法刷题记录-哈希表有效的字母异位词给定两个字符串*s*和*t*,编写一个函数来判断*t*是否是*s*的字母异位词。注意:若*s*和*t*中每个字符出现的次数都相同,则称*s*和*t*互为字母异位词。示例1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s......
  • Python读取pdf、word、excel、ppt、csv和txt文件提取所有文本
    前言本文对使用python读取pdf、word、excel、ppt、csv、txt等常用文件,并提取所有文本的方法进行分享和使用总结。可以读取不同文件的库和方法当然不止下面分享的这些,本文的代码主要目标都是:方便提取文件中所有文本的实现方式。这些库的更多使用方法,请到官方文档中查阅。读取PD......
  • python3修改安全组
    场景:办公网络访问云资源,公司出口IP会变,试试更新到安全组脚本如下:#!/usr/bin/envpython#-*-coding:utf-8-*-#@Time:2023/11/1513:12#@File:security_group.py#@Author:zk_linux#@Software:PyCharm#@Description:importjsonimportsocketfro......
  • KMeans算法全面解析与应用案例
    本文深入探讨了KMeans聚类算法的核心原理、实际应用、优缺点以及在文本聚类中的特殊用途,为您在聚类分析和自然语言处理方面提供有价值的见解和指导。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验......
  • Python 获取指定目录所有深层文件路径(包括子目录下的所有文件)
    importosdefget_all_deep_files_in_folder(folder_path):all_files=[]file_paths=os.listdir(folder_path)foriteminfile_paths:fp=os.path.join(folder_path,item)ifos.path.isfile(fp):all_files.append(fp)......