https://www.bilibili.com/video/BV17D4y1o7J2
wiki
https://en.wikipedia.org/wiki/Metropolis–Hastings_algorithm
知乎-介绍了为什么pdf(loc=x_start)的好处
https://www.zhihu.com/question/63305712
1.马尔科夫链MCMC采样
2.问题
有了MCMC采样,但是问题是想要得到对应收敛分布的转移矩阵P如何求得?
2.1 细致平稳条件
π ( i ) P ( i , j ) = π ( j ) P ( j , i ) π ( i ) P ( i , j ) = π ( j ) P ( j , i )
π ( x ) 是 指 系 统 在 i 状 态 的 分 布 函 数 , 个 人 任 务 写 成 π i ( x ) 更 合 适 , 这 个 老 师 写 的 不 合 理 , 因 为 x 表 示 随 机 变 量 X 的 取 值 , 比 如 系 统 有 A , B , C 三 种 取 值 , 假 设 是 0.5 , 0.3 , 0.2 , π i ( " A " ) = 0.5 表 示 i 状 态 时 X =" A " 的 概 率 , π i ( x ) 则 表 示 为 一 个 向 量 , 为 [ 0.5 , 0.3 , 0.2 ] π ( x ) 是 指 系 统 在 i 状 态 的 分 布 函 数 , 个 人 任 务 写 成 π i ( x ) 更 合 适 , 这 个 老 师 写 的 不 合 理 , 因 为 x 表 示 随 机 变 量 X 的 取 值 , 比 如 系 统 有 A , B , C 三 种 取 值 , 假 设 是 0.5 , 0.3 , 0.2 , π i ( " A " ) = 0.5 表 示 i 状 态 时 X =" A " 的 概 率 , π i ( x ) 则 表 示 为 一 个 向 量 , 为 [ 0.5 , 0.3 , 0.2 ]
P ( i , j ) 是 指 系 统 从 i 状 态 转 移 到 j 状 态 的 状 态 转 移 矩 阵 P ( i , j ) 是 指 系 统 从 i 状 态 转 移 到 j 状 态 的 状 态 转 移 矩 阵
回 到 方 程 本 身 π i ( x ) P ( i , j ) = π j ( x ) P ( j , i ) , 其 代 表 的 是 系 统 从 i 状 态 转 移 到 j 状 态 和 j 转 移 到 i 状 态 的 概 率 是 一 样 的 回 到 方 程 本 身 π i ( x ) P ( i , j ) = π j ( x ) P ( j , i ) , 其 代 表 的 是 系 统 从 i 状 态 转 移 到 j 状 态 和 j 转 移 到 i 状 态 的 概 率 是 一 样 的
对 应 的 如 果 π i 数 值 较 高 , 则 对 应 的 P ( i , j ) 概 率 较 低 , 并 且 对 应 的 π j ( x ) 较 低 P ( j , i ) 较 高 对 应 的 如 果 π i 数 值 较 高 , 则 对 应 的 P ( i , j ) 概 率 较 低 , 并 且 对 应 的 π j ( x ) 较 低 P ( j , i ) 较 高
2.2 引入参数α α
假 设 我 们 现 在 引 入 任 意 随 机 矩 阵 Q , 显 然 假 设 我 们 现 在 引 入 任 意 随 机 矩 阵 Q , 显 然
π i ( x ) Q ( i , j ) ≠ π j ( x ) Q ( j , i ) π i ( x ) Q ( i , j ) ≠ π j ( x ) Q ( j , i )
所 以 我 们 引 入 参 数 α , 令 其 强 行 相 等 所 以 我 们 引 入 参 数 α , 令 其 强 行 相 等
π i ( x ) Q ( i , j ) α ( i , j ) = π j ( x ) Q ( j , i ) α ( j , i ) π i ( x ) Q ( i , j ) α ( i , j ) = π j ( x ) Q ( j , i ) α ( j , i )
令
α ( i , j ) = π j ( x ) Q ( j , i ) ∈ [ 0 , 1 ] , α ( i , j ) 代 表 的 是 从 i 状 态 转 义 到 j 状 态 的 概 率 ( 随 着 状 态 转 义 矩 阵 P ) α ( i , j ) = π j ( x ) Q ( j , i ) ∈ [ 0 , 1 ] , α ( i , j ) 代 表 的 是 从 i 状 态 转 义 到 j 状 态 的 概 率 ( 随 着 状 态 转 义 矩 阵 P )
α ( j , i ) = π i ( x ) Q ( i , j ) ∈ [ 0 , 1 ] α ( j , i ) = π i ( x ) Q ( i , j ) ∈ [ 0 , 1 ]
两边即相等
我 们 得 到 , P ( i , j ) = Q ( i , j ) α ( i , j ) 我 们 得 到 , P ( i , j ) = Q ( i , j ) α ( i , j )
代 表 Q 不 等 于 P , 但 是 却 有 一 定 的 概 率 = P 代 表 Q 不 等 于 P , 但 是 却 有 一 定 的 概 率 = P
所 以 结 论 就 是 所 以 结 论 就 是
1. 给 定 任 意 转 移 矩 阵 Q , 然 后 计 算 α 1. 给 定 任 意 转 移 矩 阵 Q , 然 后 计 算 α
2. 以 Q 作 为 转 移 矩 阵 采 样 , 并 生 成 随 机 数 [ 0 , 1 ] , 若 随 机 数 < α , 则 接 受 采 样 , 否 则 丢 弃 继 续 采 样 2. 以 Q 作 为 转 移 矩 阵 采 样 , 并 生 成 随 机 数 [ 0 , 1 ] , 若 随 机 数 < α , 则 接 受 采 样 , 否 则 丢 弃 继 续 采 样
2.3 MCMC算法
具 体 算 法 具 体 算 法
输 入 任 意 给 定 的 马 尔 科 夫 链 状 态 转 移 矩 阵 Q , 目 标 平 稳 分 布 π ( x ) , 设 定 状 态 转 移 次 数 阈 值 n 1 , 需 要 的 样 本 数 n 2 输 入 任 意 给 定 的 马 尔 科 夫 链 状 态 转 移 矩 阵 Q , 目 标 平 稳 分 布 π ( x ) , 设 定 状 态 转 移 次 数 阈 值 n 1 , 需 要 的 样 本 数 n 2
从 任 意 简 单 概 率 分 布 得 到 初 始 状 态 值 x 0 ; 从 任 意 简 单 概 率 分 布 得 到 初 始 状 态 值 x 0 ;
f o r t = 0 i n n 1 + n 2 − 1 f o r t = 0 i n n 1 + n 2 − 1
a . 从 条 件 概 率 分 布 Q ( x | x 1 ) 得 到 样 本 值 x a . 从 条 件 概 率 分 布 Q ( x | x 1 ) 得 到 样 本 值 x
b . 从 均 匀 分 布 中 采 样 U ∼ [ 0 , 1 ] b . 从 均 匀 分 布 中 采 样 U ∼ [ 0 , 1 ]
c . 如 果 u < α ( x 1 , x ∗ ) = π ( x ∗ ) Q ( x ∗ , x t ) , 则 接 受 x t → x ∗ , 即 x t + 1 = x c . 如 果 u < α ( x 1 , x ∗ ) = π ( x ∗ ) Q ( x ∗ , x t ) , 则 接 受 x t → x ∗ , 即 x t + 1 = x
d . 否 则 不 接 受 转 移 , t = m a x { t − 1 , 0 } d . 否 则 不 接 受 转 移 , t = m a x { t − 1 , 0 }
3.MH算法
在前面的MCMC算法中若α α 过小容易造成采样效率低下,为了解决这个问题MH算法做了优化
优 化 的 公 式 也 很 简 单 , 令 α = m i n { π j ( x ) Q ( j , i ) π i ( x ) Q ( i , j ) , 1 } 优 化 的 公 式 也 很 简 单 , 令 α = m i n { π j ( x ) Q ( j , i ) π i ( x ) Q ( i , j ) , 1 }
采 样 算 法 和 上 面 的 M C M C 一 致 , 只 是 取 代 了 α 的 计 算 公 式 , 证 明 略 采 样 算 法 和 上 面 的 M C M C 一 致 , 只 是 取 代 了 α 的 计 算 公 式 , 证 明 略
4.python MH算法实现
点击查看代码
from scipy.stats import norm
def norm_dist_prob( theta) :
y = norm.pdf( theta, loc= 3 , scale= 2 )
return y
T = 5000
pi = [ 0 for i in range ( T ) ]
sigma = 1
t = 0
while t < T - 1 :
t = t + 1
pi_star = norm.rvs( loc= pi [ t - 1 ] , scale= sigma, size= 1 , random_state= None)
alpha = min ( 1 , ( norm_dist_prob( pi_star[ 0 ] ) / norm_dist_prob( pi [ t - 1 ] ) ) )
u = random.uniform( 0 , 1 )
if u < alpha:
pi [ t] = pi_star[ 0 ]
else :
pi [ t] = pi [ t - 1 ]
plt.scatter( pi , norm.pdf( pi , loc= 3 , scale= 2 ) , label= 'Target Distribution' )
num_bins = 50
plt.hist( pi , num_bins, normed= 1 , facecolor= 'red' , alpha= 0.7 , label= 'Samples Distribution' )
plt.legend( )
plt.show( )
5.Metropolis 算法
上面的算法其实很难理解,究其原因
1.之前的demo是介绍了离散值情况下的MC采样,这个很好理解,但如果是连续值如何写转移矩阵?
2.norm.rvs(loc=pi[t - 1], scale=sigma, size=1, random_state=None) 代码看不懂,关键是算法没理解
3.代码中没看到乘以矩阵Q的操作,没看懂
对于第一点
对 于 离 散 值 , 矩 阵 中 每 个 值 代 表 的 是 Q ( X = | Y = ) 是 一 个 带 条 件 的 概 率 质 量 函 数 ( p m f ) 对 于 离 散 值 , 矩 阵 中 每 个 值 代 表 的 是 Q ( X = | Y = ) 是 一 个 带 条 件 的 概 率 质 量 函 数 ( p m f )
那 么 扩 展 到 连 续 纸 , 转 移 概 率 矩 阵 就 是 一 个 带 条 件 的 概 率 密 度 函 数 ( p d f ) 那 么 扩 展 到 连 续 纸 , 转 移 概 率 矩 阵 就 是 一 个 带 条 件 的 概 率 密 度 函 数 ( p d f )
所 以 总 结 下 , 若 是 离 散 值 , 那 么 就 写 成 状 态 转 义 矩 阵 Q ( x | y ) , 若 是 连 续 值 , 就 写 成 g ( x | y ) , 代 表 概 率 密 度 函 数 所 以 总 结 下 , 若 是 离 散 值 , 那 么 就 写 成 状 态 转 义 矩 阵 Q ( x | y ) , 若 是 连 续 值 , 就 写 成 g ( x | y ) , 代 表 概 率 密 度 函 数
这 里 注 意 下 一 般 的 书 上 或 者 教 材 上 都 会 写 成 条 件 概 率 Q x | y , 这 种 数 学 上 表 达 式 没 错 , 但 不 用 关 心 这 个 条 件 y , 你 也 没 法 求 解 , 脱 离 这 个 条 件 y , 他 的 本 质 还 是 某 个 概 率 密 度 函 数 p d f / p m f , 只 要 你 能 找 到 这 种 你 想 要 的 p d f / p m f 即 可 这 里 注 意 下 一 般 的 书 上 或 者 教 材 上 都 会 写 成 条 件 概 率 Q x | y , 这 种 数 学 上 表 达 式 没 错 , 但 不 用 关 心 这 个 条 件 y , 你 也 没 法 求 解 , 脱 离 这 个 条 件 y , 他 的 本 质 还 是 某 个 概 率 密 度 函 数 p d f / p m f , 只 要 你 能 找 到 这 种 你 想 要 的 p d f / p m f 即 可
再看第二,三点
先看第一个wiki上的介绍
https://en.wikipedia.org/wiki/Random_walk
为 了 取 到 合 适 的 Q / g , M e t r o p o l i s 算 法 要 求 必 须 满 足 Q ( x | y ) = Q ( y | x ) , 或 者 g ( x | y ) = g ( y | x ) , 也 就 是 这 个 分 布 是 对 称 的 , 然 后 重 点 来 了 为 了 取 到 合 适 的 Q / g , M e t r o p o l i s 算 法 要 求 必 须 满 足 Q ( x | y ) = Q ( y | x ) , 或 者 g ( x | y ) = g ( y | x ) , 也 就 是 这 个 分 布 是 对 称 的 , 然 后 重 点 来 了
wiki原文
A usual choice is to let g ( x ∣ y ) g ( x ∣ y ) g ( x ∣ y ) g ( x ∣ y ) be a Gaussian distribution centered at y y , so that points closer to y y are more likely to be visited next, making the sequence of samples into a random walk [a]. The function g g is referred to as the proposal density or jumping distribution.
再抄一段知乎上的(有版权~~~大家自己去看下)
https://www.zhihu.com/question/63305712
从 第三:意外之喜。 这里开始看
大 致 意 思 就 是 通 过 w i k i 的 方 法 得 到 了 M e t r o p o l i s 算 法 的 精 髓 大 致 意 思 就 是 通 过 w i k i 的 方 法 得 到 了 M e t r o p o l i s 算 法 的 精 髓
若 M H 算 法 中 的 提 议 分 布 ( 就 是 Q / g ) 如 果 是 对 称 的 , 那 么 有 Q ( x | y ) = Q ( y | x ) , 或 者 g ( x | y ) = g ( y | x ) , 那 么 M H 算 法 可 以 简 化 为 若 M H 算 法 中 的 提 议 分 布 ( 就 是 Q / g ) 如 果 是 对 称 的 , 那 么 有 Q ( x | y ) = Q ( y | x ) , 或 者 g ( x | y ) = g ( y | x ) , 那 么 M H 算 法 可 以 简 化 为
α = m i n ( 1 , π j ( x ) π i ( x ) ) α = m i n ( 1 , π j ( x ) π i ( x ) )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)