首页app攻略增强经典多维尺度变换(CMDS)对无穷大距离矩阵的处理能力

增强经典多维尺度变换(CMDS)对无穷大距离矩阵的处理能力

圆圆2025-09-16 00:01:00次浏览条评论

增强经典多维尺度变换(CMDS)对无穷大距离矩阵的处理能力经典多维像素变形(CMDS)算法在处理包含无穷大(inf)值的距离矩阵时会遇到计算错误,这些无穷大值通常表示不能插入的点。本文将介绍如何在计算中心化矩阵和特征分解之前,识别并策略性距离矩阵的无穷大值替换为一个巨大大的有限数值,从而增强CMDS算法的鲁棒性,确保其在处理时不影响数据时的正常运行,避免程序崩溃,进一步实现对复杂网络结构数据的有效降维。经典多维坐标变换(CMDS)概述

经典多维坐标变换(cmds),刺绣主坐标分析(原理)坐标分析, pcoa),是一种常用的降维技术,旨在将高维数据点映射到低维空间,同时关系求保留原始数据点之间的距离。其核心思想是通过对距离矩阵进行双重中心化,进行特征排序,从而找到数据在低维空间中的最众表示。cmds广泛求数据可视化、模式识别和机器学习等领域。

CMDS算法的基本步骤如下:构建距离矩阵D:计算所有数据点之间的距离。如果输入是原始数据,通常使用欧氏距离;如果输入已经是距离矩阵,则直接使用。构建中心化矩阵H:$H = I - \frac{1}{n} \mathbf{1}\mathbf{1}^T$,其中$I$是单位矩阵,$n$是数据点数量,$\mathbf{1}$是全1向量。二维中心化平方距离矩阵B:$B = -\frac{1}{2} H D^{(2)} H$,其中$D^{(2)}$表示距离矩阵$D$中每个元素平方后的矩阵。特征划分:对矩阵$B$特征进行划分,得到特征值和特征求解。降维投影:选择最大的$n_dim$个正特征值及其对应的特征求解,构建低维嵌入。处理距离矩阵中的无穷大值

在某些应用场景中,特别是当数据点表示三个节点,而距离表示它们之间的路径长度时,两个不取代的节点之间的通常距离会被标记为无穷大(inf)。这在图论中是完全有效的概念,但在CMDS的数值计算中,无穷大值会导致严重问题。

原始CMDS算法在计算双重中心化距离矩阵$B$时,涉及$D^2$的操作。如果$D$中包含inf,那么$D^2$中的一个对应元素将是inf,进一步导致矩阵乘法H @ D**2 @ H 的结果中包含inf或NaN(不是a

为了使 CMDS 算法能够鲁棒地处理包含不指定点(即距离为 inf)的情况,我们需要在计算 $B$ 对距离矩阵进行计算。解决方案:替换无穷大值之前

最直接且有效的方法是识别距离矩阵中的所有无穷大值,将其替换为一个巨大的、但有限的数值。这个替换值应该足够大,以反映不作用点之间“无限远”的语义,但又不能真正是inf,居民数值计算错误。Python的numpy库提供了np.finfo(D.dtype).max,它能够返回给定数据类型最多表示的最大有限浮点数,这通常是一个理想的替换值。

灵机语音

灵机语音60查看详情

实现步骤:检查输入距离矩阵D中是否无穷大值。如果,则将所有inf值替换为np.finfo(D.dtype).max。

通过这种存在方式,我们既保留了不构成点距离“非常大”的逻辑,又避免了数值计算的崩溃。

示例代码

以下是修改后的CMDS函数,它集成了处理无穷大距离值的功能:import numpy as npfrom sklearn.metrics.pairwise import euclidean_distancesdef cmds(X, n_dim, input_type='raw'): quot;quot;quot; 经典(线性)多维缩放(MDS)参数 ---------- X: (d, n) 数组或 (n,n) 数组输入 数据。数据按列优先顺序放置。 即样本以列向量的形式放入矩阵(X)中 d: 点的维数 n: 点的个数 n_dim: 目标空间的维数 input_type: 表示数据是原始数据还是距离 - raw: 原始数据。 (n,d) 数组。 - distance: 预先计算的数据之间的距离。 (n,n) 数组。 返回 -------- Y: (n_dim, n) 数组。预计嵌入。 evals: (n_dim) 特征值 evecs: 列向量中对应的特征向量 quot;quot;quot; if input_type == 'distance': D = X elif input_type == 'raw': # 将 X 转置为 (n, d) for euclidean_distances Xt = X.T D = euclidean_distances(Xt, Xt) else: raise ValueError(quot;input_type 必须be 'raw' or 'distance'quot;) # 检查距离矩阵中是否无穷大值,并进行替换 if np.any(np.isinf(D)): # 将inf值替换为该数据类型最多表示的最大有限浮点数 # 这样可以避免在后续计算中因inf值导致错误,同时保留其“非常远”的标志 D[np.isinf(D)] = np.finfo(D.dtype).max # 居中矩阵 n = D.shape[0] H = np.eye(n) - np.ones((n, n)) / n # 双精度

距离矩阵 # 注意:这里D**2是元素级的平方操作 B = -0.5 * H @ (D**2) @ H # 特征值分解 evals, evecs = np.linalg.eigh(B) # 对特征值和特征向量进行降序排序 sort_indices = np.argsort(evals)[::-1] evals = evals[sort_indices] evecs = evecs[:, sort_indices] # 选择顶部的 n_dim 特征向量 evecs_selected = evecs[:, :n_dim] # 将数据投影到新空间 # 确定特征值非负,因为它们理论上应代表推测 # 实际应用中,由于分数精度或非欧氏距离,可能出现微小负特征值, # 但对于 CMDS,通常只考虑正特征值。这里假设前 n_dim 特征值是有效的。 valid_evals = np.maximum(0, evals[:n_dim]) # 避免负数开方 Y = np.sqrt(np.diag(valid_evals)) @evecs_selected.T return Y, evals, evecs登录后复制注意事项替换值的选择: np.finfo(D.dtype).max是一个合理的选择,因为确保在当前浮点数类型下替换了值是最大的有限数。如果使用一个大的分区,需要确保它足够大的区分点,但又不能过大导致其他数值溢出(这种情况在现代浮点数系统中不常见)。语义影响:将inf替换为有限大值会稍微不代替点之间的“真实”距离,但对于CMDS的目标(在低维空间中估计距离关系),这种估计是合理的。它允许算法继续运行并提供一个可解释的嵌入改变,即使这些点在原始空间中是完全不代替的。适用场景:处理方法特别适用于距离矩阵中inf表示“不接近”或“不匹配”的情况,例如在图论或网络分析中。如果inf在你的应用中具有其他特定的、需要严格区分的语义,可能需要考虑更复杂的处理策略。负特征值:在CMDS中,理论上所有特征值都应非负。然而,由于分数精度问题或输入距离矩阵并非严格欧氏距离(例如,经过inf替换后),可能会出现微小的负特征值。在投影步骤np.sqrt(np.diag(evals[:n_dim]))中,如果evals包含负数,np.sqrt会产生复数。通常做法是取max(0, eval)来避免复数,如示例代码所示。总结

通过在CMDS算法中引入对距离矩阵中无穷大值的检测和替换机制,我们显着提升了算法的鲁棒性。这种方法使得CMDS能够有效处理包含不干扰的关系数据集,从而扩展了其在复杂网络和图结构数据分析中的应用范围。在实际应用中,理解并理解处理数据中的特殊值(如inf或NaN)是构建稳定、可靠的数据分析流程的关键一环。

以上就是增强经典多维位移矩阵(CMDS)对无穷大距离矩阵的处理能力的详细内容,更多请关注乐哥常识网其他相关文章! Python怎么向函数传递不定数量的参数_Python函数不定长参数传递方法 python如何读取和读取csv文件_python CSV文件读写命令操作指南 python如何执行一个外部并获取输出_python执行外部并获取输出的技巧

增强经典多维尺度变换
html 水平线 html水平线虚线样式
相关内容
发表评论

游客 回复需填写必要信息