多目标跟踪 距离的可视化(有动图)

news2024/10/6 17:58:11

多目标跟踪 距离的可视化(有动图)

flyfish

马氏距离的计算涉及到协方差矩阵的逆,而协方差矩阵的特征值和特征向量决定了数据分布的形状。椭圆的中心是数据的均值向量,椭圆的形状和方向由协方差矩阵的特征向量和特征值决定。椭圆的长轴和短轴长度与马氏距离的值相关联,较大的马氏距离对应于较大的椭圆。
在这里插入图片描述

马氏距离

马氏距离是一种度量,表示一个点到数据集中心(平均值)的距离,同时考虑了数据集的形状和分布。这种距离考虑了不同方向上的方差,因此它比欧几里得距离更适合高维数据的分析。

为什么使用马氏距离?

在多维空间中,数据点分布的形状可能不是圆形,可能是椭圆形。马氏距离可以考虑数据的这种形状差异,从而提供更准确的距离度量。

椭圆的意义

在二维空间中,马氏距离等于某个常数的点形成一个椭圆。这个椭圆展示了所有与中心点(平均值)具有相同马氏距离的点。因此:

  • 椭圆中心 :表示数据的平均值。

  • 椭圆形状和方向 :反映数据在各个方向上的方差和协方差。例如,数据在某个方向上的方差越大,椭圆在那个方向上就越长。

结合起来看

当我们在动画中移动一个点时,每个位置上这个点与数据集其他点的马氏距离会变化。这个变化用颜色来表示。与此同时,图中显示的椭圆展示了与数据集中心点(平均值)具有相同马氏距离的点的集合。

动画展示了:

  • 给定点的马氏距离变化:通过点的颜色反映。
  • 数据分布形状 :通过椭圆反映。
  • 红点的位置以及它的马氏距离。
  • 数据点的散布情况。
  • 椭圆表示的数据的分布形状和方向。

通过展示椭圆,我们可以更直观地理解马氏距离是如何根据数据分布的形状和方向变化的。

分析为什么是椭圆的原因

在多维空间中,数据点的分布形状可能不是圆形而是椭圆形,这主要是因为数据在不同维度上的方差不同。为了更好地理解这一点,让我们逐步解释其中的原因。

方差与协方差

  • 方差 :表示数据在某一维度上的离散程度。方差越大,数据在该维度上分布得越广。

  • 协方差 :表示两个维度之间的关系。如果协方差为正,表示两个维度在相同方向上变动;如果为负,表示两个维度在相反方向上变动。

数据分布形状

当我们有多维数据时,每个维度的方差可能不同,这意味着数据在某些维度上分布得更广,在某些维度上分布得更窄。此外,维度之间的协方差决定了数据在多维空间中的方向性分布。

马氏距离的计算

马氏距离计算时会考虑数据的协方差矩阵(包含方差和协方差信息)。协方差矩阵的逆矩阵用于衡量数据点与数据中心之间的距离。这种距离度量方式会自动考虑各维度的方差和维度之间的相关性。

椭圆形状

假设我们有二维数据,分别在 x x x y y y 方向上:

  • 如果数据在 x x x y y y 方向上的方差相同,并且两个方向上没有相关性(协方差为零),则数据分布呈现圆形。

  • 如果数据在 x x x y y y 方向上的方差不同,则数据分布在方差较大的方向上更广,呈现椭圆形。

  • 如果 x x x y y y 之间有相关性(协方差不为零),则椭圆会倾斜,表示两个维度之间的关系。
    上面动图的代码

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.spatial.distance import mahalanobis
from scipy.stats import chi2
import imageio

# 生成示例数据
np.random.seed(42)
mean = [0, 0]
cov = [[1, 0.5], [0.5, 1]]
data = np.random.multivariate_normal(mean, cov, 500)

# 计算马氏距离的函数
def calculate_mahalanobis_distance(data, point):
    cov_matrix = np.cov(data, rowvar=False)
    inv_cov_matrix = np.linalg.inv(cov_matrix)
    distances = [mahalanobis(d, point, inv_cov_matrix) for d in data]
    return distances

# 绘制马氏距离等高线
def plot_mahalanobis_ellipse(data, ax, color='blue'):
    cov_matrix = np.cov(data, rowvar=False)
    mean_data = np.mean(data, axis=0)
    
    # 特征值和特征向量
    eigvals, eigvecs = np.linalg.eigh(cov_matrix)
    
    # 长轴和短轴
    order = eigvals.argsort()[::-1]
    eigvals = eigvals[order]
    eigvecs = eigvecs[:, order]
    
    # 计算角度
    angle = np.degrees(np.arctan2(*eigvecs[:,0][::-1]))
    
    # 计算椭圆半径
    chi2_val = chi2.ppf(0.95, 2)
    width, height = 2 * np.sqrt(eigvals * chi2_val)
    
    # 绘制椭圆
    from matplotlib.patches import Ellipse
    ellipse = Ellipse(mean_data, width=width, height=height, angle=angle, edgecolor=color, fc='None', lw=2)
    ax.add_patch(ellipse)

# 绘制散点图并添加马氏距离和椭圆
def plot_mahalanobis(data, point, frame_number):
    fig, ax = plt.subplots(figsize=(10, 8))
    
    # 计算马氏距离并设置颜色映射
    distances = calculate_mahalanobis_distance(data, point)
    scatter = sns.scatterplot(x=data[:, 0], y=data[:, 1], hue=distances, palette='coolwarm', ax=ax, s=50, edgecolor=None)
    
    # 调整颜色条(colorbar)的范围和标签
    norm = plt.Normalize(vmin=min(distances), vmax=max(distances))
    sm = plt.cm.ScalarMappable(cmap="coolwarm", norm=norm)
    sm.set_array([])
    fig.colorbar(sm, ax=ax, label='Mahalanobis Distance')
    
    # 绘制给定点和椭圆
    plt.scatter(point[0], point[1], color='red', s=100)
    plot_mahalanobis_ellipse(data, ax)
    
    plt.title(f'Mahalanobis Distance at Frame {frame_number}')
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.savefig(f'frame_{frame_number}.png')
    plt.close()

# 定义动画点
points = np.linspace(-3, 3, 30)
frames = []

# 生成每一帧图像
for i, p in enumerate(points):
    plot_mahalanobis(data, [p, p], i)
    frames.append(imageio.imread(f'frame_{i}.png'))

# 保存为GIF
imageio.mimsave('mahalanobis_distance.gif', frames, fps=2, loop=0)

下面三种情况
方差相同且无相关性的数据,这种情况下,数据分布呈现圆形。
方差不同且无相关性的数据,这种情况下,数据分布在方差较大的方向上更广,呈现椭圆形。
方差相同且有相关性的数据,这种情况下,椭圆会倾斜,表示两个维度之间的关系。
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
import seaborn as sns
from scipy.stats import chi2
def plot_ellipse(mean, cov, ax, color='blue'):
    # 特征值和特征向量
    eigvals, eigvecs = np.linalg.eigh(cov)
    
    # 长轴和短轴
    order = eigvals.argsort()[::-1]
    eigvals = eigvals[order]
    eigvecs = eigvecs[:, order]
    
    # 计算角度
    angle = np.degrees(np.arctan2(*eigvecs[:,0][::-1]))
    
    # 计算椭圆半径
    chi2_val = chi2.ppf(0.95, 2)
    width, height = 2 * np.sqrt(eigvals * chi2_val)
    
    # 绘制椭圆
    ellipse = Ellipse(mean, width=width, height=height, angle=angle, edgecolor=color, fc='None', lw=2)
    ax.add_patch(ellipse)

# 生成数据
np.random.seed(42)

# 情况 1:方差相同,无相关性
mean1 = [0, 0]
cov1 = [[1, 0], [0, 1]]
data1 = np.random.multivariate_normal(mean1, cov1, 500)

# 情况 2:方差不同,无相关性
mean2 = [0, 0]
cov2 = [[3, 0], [0, 1]]
data2 = np.random.multivariate_normal(mean2, cov2, 500)

# 情况 3:方差相同,有相关性
mean3 = [0, 0]
cov3 = [[1, 0.8], [0.8, 1]]
data3 = np.random.multivariate_normal(mean3, cov3, 500)

# 绘制图形
fig, axs = plt.subplots(1, 3, figsize=(18, 6))

# 情况 1
axs[0].scatter(data1[:, 0], data1[:, 1], alpha=0.6)
plot_ellipse(mean1, cov1, axs[0])
axs[0].set_title('Variance same, No Correlation')
axs[0].set_xlim(-5, 5)
axs[0].set_ylim(-5, 5)

# 情况 2
axs[1].scatter(data2[:, 0], data2[:, 1], alpha=0.6)
plot_ellipse(mean2, cov2, axs[1])
axs[1].set_title('Variance different, No Correlation')
axs[1].set_xlim(-10, 10)
axs[1].set_ylim(-5, 5)

# 情况 3
axs[2].scatter(data3[:, 0], data3[:, 1], alpha=0.6)
plot_ellipse(mean3, cov3, axs[2])
axs[2].set_title('Variance same, Correlation')
axs[2].set_xlim(-5, 5)
axs[2].set_ylim(-5, 5)

plt.tight_layout()
plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中石化加油卡有什么用?

对于有车一族来说,有一张加油卡真的可以省下不少钱 但是像我们这种没车的人,即使得到加油卡也毫无用武之地 久而久之,难免会造成卡过期的情况出现 还好,前两天把我手上堆积了好久的加油卡在收卡云上卖出去了,99折真…

录的视频太大怎么压缩?这几款软件真的很不错!

在数字化时代,视频已成为我们日常生活和工作中不可或缺的一部分。无论是记录生活点滴,还是制作工作汇报,视频都以其直观、生动的特点赢得了我们的青睐。然而,随着视频质量的提升,视频文件的大小也在不断增加&#xff0…

「51媒体」活动会议,展览展会,直播曝光的一种方法

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 我们在做活动会议,或者参加展览展会,需要进行直播的时候,可以通过一键同步多个媒体平台的方法,来扩大曝光,比如一场直播我们可…

【Python/Pytorch 】-- K-means聚类算法

文章目录 文章目录 00 写在前面01 基于Python版本的K-means代码02 X-means方法03 最小二乘法简单理解04 贝叶斯信息准则 00 写在前面 时间演变聚类算法:将时间演变聚类算法用在去噪上,基本思想是,具有相似信号演化的体素具有相似的模型参数…

Redis-事务-基本操作-在执行阶段出错不会回滚

文章目录 1、Redis事务控制命令2、Redis事务错误处理3、Redis事务错误处理,在执行阶段出错不会回滚 1、Redis事务控制命令 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set a1 v1 QUEUED 127.0.0.1:6379(TX)>…

Steam怎么购买黄金树之影 购买了黄金树之影怎么下载DLC教程

《艾尔登法环》大型DLC“黄金树幽影”将于6月21日正式上线,为广大玩家带来全新的冒险与挑战。在“黄金树幽影”中,玩家将拥有专属的强化系统。通过收集探索幽影之地获得的“幽影树的碎片”和“灵灰的加护”,不仅可以大幅度提升玩家的攻击力与…

SD卡上的文件删除不了?试试这6种方法!

用户案例 “我需要往32GB的三星Micro SD卡里复制文件,在此之前需要在电脑上删除一些SD卡上的数据来释放空间。但当我尝试按‘Ctrl Delete’删除文件时,文件无法从SD卡上删除。当我尝试格式化SD卡时,Windows提示该磁盘已写保护。这是怎么回事…

数字样机:飞行器状态控制系统仿真

引言:数字样机起源于20世纪90年代,是一种用数字化模型代替实际物理样机进行仿真分析的技术。 传统的飞行器研发流程往往遵循一套特定的循环结构:在设计初期,工程人员需要对飞行器提供一个综合的设计思路(初期蓝图&…

名校介绍|英国六所红砖大学

​近年来由于美国的拒签率增加,很多公派申请者,尤其是CSC资助的访问学者、公派联合培养学生及博士后研究学者,把出国目标改为其它发达国家,尤以英国居多,本文知识人网小编就重点介绍六所英国红砖大学。 我们在“英国大…

1panel + Pbootcms 设置伪静态规则

这里确保我们引用的样式路径是否是这样的&#xff0c;&#xff08;不然可能会设置了伪静态无法加载样式&#xff09; //这种格式在不开起伪静态是可以引入的&#xff0c;一旦开启就不行了,一定要在static 前面加上反斜杠 /<link rel"stylesheet" href"{pbo…

人工智能如何助力人才招聘方式改变

尽管全球经济不稳定&#xff0c;但在当今的就业市场上&#xff0c;招聘顶尖人才仍然竞争激烈&#xff0c;企业很难找到优质人才。明智的人才招聘团队会将人工智能融入日常招聘流程当中&#xff0c;借助人工智能工具或智能招聘系统&#xff08;如大易招聘管理系统&#xff09;&a…

智能猫砂盆效果这么惊艳吗?绝对不踩雷的智能猫砂盆合集来啦

身为一个铲屎官&#xff0c;我深受“天天铲屎”的困扰。想要片刻放松都不行&#xff0c;因为猫砂盆一旦堆积屎尿&#xff0c;尤其在夏天&#xff0c;会迅速发臭&#xff0c;滋生细菌。对猫而言&#xff0c;不清理猫砂盆会让它们感到不适&#xff0c;可能引发疾病或拒绝使用猫砂…

学习分享-Redis 中的压缩列表 (Ziplist)

Redis 中的压缩列表 (Ziplist) 压缩列表 (Ziplist) 是 Redis 内部用于优化小规模数据存储的一种紧凑数据结构。它设计用于高效地存储包含少量元素的列表、哈希表或有序集合&#xff0c;以减少内存占用和提高性能。以下是压缩列表的详细介绍&#xff1a; 1. 压缩列表的结构 压…

Elastisearch集群(单节点)

目录 一、文件下载 二、创建linux es用户 三、上传、解压canal、es、kibana 四、配置es通讯证书&#xff08;生成证书给es配置使用&#xff09; 五、配置elastisearch 六、修改系统配置 七、添加ik分词器支持&#xff08;可选&#xff09; 八、给文件赋值权限 九、设置…

【C++题解】1713 - 输出满足条件的整数3

问题&#xff1a;1713 - 输出满足条件的整数3 类型&#xff1a;简单循环 题目描述&#xff1a; 有一个数列&#xff0c;该数列的前 4 个数是&#xff1a; 1 4 7 10 &#xff1b; 请从键盘读入一个正整数 n &#xff0c;请通过观察前 4 项的规律&#xff0c;输出 1∼n 之间所有…

【安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录】

安装笔记-系列文章目录 安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录 文章目录 安装笔记-系列文章目录安装笔记-20240616-Linux-为 OpenWrt 自动挂载 Windows 主机共享目录 前言一、软件介绍名称&#xff1a;cifsutils主页官方介绍特点 二、安装步骤测试…

如何在 Vue3 中使用 Cytoscape.js 创建交互式网络图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于Cytoscape.js的可视化网络图 应用场景介绍 网络图是一种用于表示节点和连接关系的图形化表示形式。在许多领域都有广泛的应用&#xff0c;例如社交网络分析、生物信息学和计算机科学。Cytoscape.js是一个…

基于matlab提取一维数组中非nan的数据

一、使用逻辑索引 使用逻辑索引来选择数组中所有非NaN的元素。逻辑索引是与原数组同型的逻辑数组&#xff0c;true对应的位置将会被选中。 % 假设a是一维数组 a [1, 2, NaN, 4, NaN, 6];% 使用逻辑索引提取非NaN元素 non_nan_elements a(~isnan(a)); 二、使用isnan函数和fi…

Repetition Improves Language Model Embeddings论文阅读笔记

文章提出了一种提高decoder-only LLM的embedding能力的方法&#xff0c;叫echo embeddingslast-token pooling&#xff08;即直接选最后一个token作为句子的embedding&#xff09;和直接mean pooling都不如文章提出的echo embedding&#xff0c;做法是把句子重复两次&#xff0…

【C语言】解决C语言报错:Use-After-Free

文章目录 简介什么是Use-After-FreeUse-After-Free的常见原因如何检测和调试Use-After-Free解决Use-After-Free的最佳实践详细实例解析示例1&#xff1a;释放内存后未将指针置为NULL示例2&#xff1a;多次释放同一指针示例3&#xff1a;全局或静态指针被释放后继续使用示例4&am…