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

2024-06-21 19:04

本文主要是介绍多目标跟踪 距离的可视化(有动图),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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 Ellipseellipse = 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.chinasem.cn/article/1082071

相关文章

基于Python打造一个可视化FTP服务器

《基于Python打造一个可视化FTP服务器》在日常办公和团队协作中,文件共享是一个不可或缺的需求,所以本文将使用Python+Tkinter+pyftpdlib开发一款可视化FTP服务器,有需要的小... 目录1. 概述2. 功能介绍3. 如何使用4. 代码解析5. 运行效果6.相关源码7. 总结与展望1

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

使用Folium在Python中进行地图可视化的操作指南

《使用Folium在Python中进行地图可视化的操作指南》在数据分析和可视化领域,地图可视化是一项非常重要的技能,它能够帮助我们更直观地理解和展示地理空间数据,Folium是一个基于Python的地... 目录引言一、Folium简介与安装1. Folium简介2. 安装Folium二、基础使用1. 创建

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目