两个高斯分布的KL散度绘制动画

KL散度

KL散度用于衡量两个变量分布之间的差异性

K L ( P ∣ ∣ Q ) = ∫ − ∞ + ∞ p ( x ) log ⁡ p ( x ) q ( x ) d x (1) KL(P\ ||\ Q)=\int_{-\infty}^{+\infty}p(x)\log\frac{p(x)}{q(x)}dx\tag{1} KL(P ∣∣ Q)=+p(x)logq(x)p(x)dx(1)

P、Q为随机变量X的两个概率分布;p、q为对应的概率密度函数

如果P,Q均为高斯分布,即:
P = N ( μ 1 , σ 1 2 ) Q = N ( μ 2 , σ 2 2 ) (2) P=\mathcal{N}(\mu_1,\sigma^2_1)\\ Q=\mathcal{N}(\mu_2,\sigma^2_2)\tag{2} P=N(μ1,σ12)Q=N(μ2,σ22)(2)
那么(1)可以化简为:
K L ( N ( μ 1 , σ 1 2 ) ∣ ∣ N ( μ 2 , σ 2 2 ) ) = log ⁡ σ 2 σ 1 + σ 1 2 + ( μ 1 − μ 2 ) 2 2 σ 2 2 − 1 2 KL(\mathcal{N}(\mu_1,\sigma^2_1)\ ||\ \mathcal{N}(\mu_2,\sigma^2_2))=\log\frac{\sigma_2}{\sigma_1}+\frac{\sigma_1^2+(\mu_1-\mu_2)^2}{2\sigma_2^2}-\frac{1}{2} KL(N(μ1,σ12) ∣∣ N(μ2,σ22))=logσ1σ2+2σ22σ12+(μ1μ2)221
用matplotlib库绘制两个高斯分布的KL散度变化动画:

KL

红线:

  • μ \mu μ在(-10,10)之间变化
  • σ \sigma σ​始终为1

蓝线:

  • μ \mu μ始终为0
  • σ \sigma σ始终为1

代码如下:

import functools
from typing import List
from matplotlib.lines import Line2D
from matplotlib.patches import ConnectionPatch
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation# 更新函数,用于在动画中更新正态分布的均值
def update(mean,pdf_line: Line2D,kl_div_line: Line2D,connection_line: ConnectionPatch,points: List[Line2D],x_min: float,x_max: float,step: float,
):# 生成两个正态分布的概率密度函数x1 = np.arange(x_min, x_max + step, step)y1 = 1 / (np.sqrt(2 * np.pi)) * np.exp(-((x1 - mean) ** 2) / 2)x2 = np.arange(x_min, mean + step, step)y2 = (1 + x2**2) / 2 - 0.5# 更新线的数据pdf_line.set_data(x1, y1)kl_div_line.set_data(x2, y2)connection_line.xy1 = (mean, 1 / (np.sqrt(2 * np.pi)))connection_line.xy2 = (mean, (1 + mean**2) / 2 - 0.5)points[0].set_data(np.expand_dims(connection_line.xy1, axis=-1))points[1].set_data(np.expand_dims(connection_line.xy2, axis=-1))if __name__ == "__main__":# 创建图形和坐标轴fig, ax = plt.subplots(2, 1, sharex=True, figsize=(8, 6.6))fig.suptitle("Animation of two Gauss Distribution's KL divergence", x=0.50, y=0.92)x_min, x_max, step = -10, 10, 0.10x_ords = np.linspace(x_min, x_max, 200, endpoint=False)ax[0].set_xlim(x_min, x_max)ax[0].set_ylim(-0.2, 0.6)ax[0].set_ylabel("Probability Density")ax[1].set_xlim(x_min, x_max)ax[1].set_ylim(-5, 100)ax[1].set_xlabel("Mean")ax[1].set_ylabel("KL Divergence")# 绘制标准正态分布ax[0].plot(x_ords,1 / (np.sqrt(2 * np.pi)) * np.exp(-(x_ords**2) / 2),label="mean=0 & std=1",)# 初始化动画时要绘制的线(pdf_line,) = ax[0].plot([], [], color="red", label="mean=[-10, 10] & std=1")(kl_div_line,) = ax[1].plot([], [], color="purple")(point1,) = ax[0].plot([-10], [0], color="cyan", marker="o")(point2,) = ax[1].plot([-10], [0], color="cyan", marker="o")ax[0].legend(), ax[0].grid(), ax[1].grid()connection = ConnectionPatch([-10, 0],[-10, 0],"data","data",axesA=ax[0],axesB=ax[1],ls="dotted",lw=2,color="pink",)fig.add_artist(connection)# 创建动画animation = FuncAnimation(fig,func=functools.partial(update,pdf_line=pdf_line,kl_div_line=kl_div_line,connection_line=connection,points=[point1, point2],x_min=x_min,x_max=x_max,step=step,),frames=np.arange(x_min, x_max, step),interval=50,)plt.show()animation.save("KL.gif")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/538829.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经典数组和指针笔试题解析——C语言

【本节内容】 1. 数组和指针笔试题解析 2. 指针运算笔试题解析 1. 数组和指针笔试题解析 1.1 一维数组 #include <stdio.h> int main() {int a[] { 1,2,3,4 };printf("%zd\n", sizeof(a));printf("%zd\n", sizeof(a 0));printf("%zd\n&qu…

Docker常见指令

1.docker search mysql &#xff1a;从docker镜像仓库搜索和mysql有关的镜像 docker search mysql 2.docker pull mysql &#xff1a;从docker仓库拉取mysql镜像 docker pull mysql 3.docker run mysql &#xff1a;启动mysql镜像 docker run mysql 4.docker ps &#xff…

消除PyCharm的黄色波浪线和右侧黄色短线

旧版pycharm看这个链接&#xff1a;https://blog.csdn.net/weixin_39450145/article/details/113574921 新版pycharm往下看 消除代码中的黄色波浪线&#xff1a;在设置&#xff0c;编辑器&#xff0c;配色方案&#xff0c;常规里面。然后选择错误和警告。 消除右侧黄色短线&am…

msfconsole数据库连接不了的问题【已解决】

msfconsole数据库连接 1.msf数据库端口 msf使用的是postgresql&#xff0c;这个数据库默认端口是5432 单个模块的使用可以不需要数据库&#xff0c;但是模块与模块之间需要沟通的时候就会用到数据库。 2.查看msf数据库连接状态 db_status #msf内部查看systemctl status p…

想零基础转行Python开发,怎么学习呢?

转行零基础学Python编程开发难度大吗&#xff1f;从哪学起&#xff1f;近期很多小伙伴问我&#xff0c;如果自己转行学习Python&#xff0c;完全0基础能否学会呢&#xff1f;Python的难度到底有多大&#xff1f;今天&#xff0c;小编就来为大家详细解读一下这个问题。 学习 Py…

MySQL:概念简章

1.SQL通用语法 SQL单行、多行书写&#xff0c;以分号结尾SQL可以以空格有缩进增加代码可读性SQL语句不区分大小写 2.SQL语句分类 2.1 DDL&#xff08;数据定义语言&#xff09; 用于数据库、数据表、字段的定义的语言 create by 表名 &#xff08;表里有什么字段&#xff09;…

软考--软件设计师(磁盘管理的例题)

流水线的理论公式&#xff1a; 单缓冲区&#xff1a;同一时间内只能允许一个进程进行写入读出&#xff0c;所以每个盘块经过缓冲区的时间是&#xff08;155微秒&#xff09;&#xff0c;之后再用1微秒的时间进行处理。在处理的同时&#xff0c;下一个盘块写入缓冲区&#xff0c…

BI数据分析案例详解:零售人货场分析该怎么做?

在当今快节奏、高竞争的商业环境中&#xff0c;人货场分析已成为企业成功的关键因素之一。科技的进步和数据的日益丰富使得企业对人流、货物流和场地布局的深入洞察变得愈发重要。通过科学的人货场分析&#xff0c;企业能更好地理解顾客行为、优化供应链、提高运营效率&#xf…

GPU服务器为什么需要DPU?

随着AI模型的复杂度增加以及数据量爆炸性增长&#xff0c;GPU服务器在执行训练和推理任务时&#xff0c;不仅面临计算密集型问题&#xff0c;还必须处理大量的数据移动、网络通信、存储I/O以及安全防护等非计算密集型任务。这些问题往往会成为性能瓶颈&#xff0c;消耗宝贵的CP…

【DL经典回顾】激活函数大汇总(八)(Maxout Softmin附代码和详细公式)

激活函数大汇总&#xff08;八&#xff09;&#xff08;Maxout & Softmin附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不…

用python证明一生一世很容易,但要爱一个人一生一世就比较难了

个人简介 &#x1f468;&#x1f3fb;‍&#x1f4bb;个人主页&#xff1a;九黎aj &#x1f3c3;&#x1f3fb;‍♂️幸福源自奋斗,平凡造就不凡 &#x1f31f;如果文章对你有用&#xff0c;麻烦关注点赞收藏走一波&#xff0c;感谢支持&#xff01; &#x1f331;欢迎订阅我的…

计算机设计大赛 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…