0

0

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

心靈之曲

心靈之曲

发布时间:2025-09-15 23:21:00

|

496人浏览过

|

来源于php中文网

原创

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

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

经典多维尺度变换(CMDS)概述

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

CMDS算法的基本步骤如下:

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

处理距离矩阵中的无穷大值

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

原始CMDS算法在计算双重中心化平方距离矩阵$B$时,涉及$D^2$的操作。如果$D$中包含inf,那么$D^2$中的对应元素将变为inf,进而导致矩阵乘法H @ D**2 @ H的结果中包含inf或NaN(Not a Number)。随后的特征分解np.linalg.eigh(B)将无法处理这些非有限值,从而引发运行时错误。

为了使CMDS算法能够鲁棒地处理包含不连通点(即距离为inf)的场景,我们需要在计算$B$之前对距离矩阵进行预处理。

解决方案:替换无穷大值

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

吐槽大师
吐槽大师

吐槽大师(Roast Master) - 终极 AI 吐槽生成器,适用于 Instagram,Facebook,Twitter,Threads 和 Linkedin

下载

实现步骤:

  1. 检查输入距离矩阵D中是否存在无穷大值。
  2. 如果存在,则将所有inf值替换为np.finfo(D.dtype).max。

通过这种方式,我们既保留了不连通点距离“非常大”的语义,又避免了数值计算的崩溃。

示例代码

以下是修改后的CMDS函数,它集成了处理无穷大距离值的功能:

import numpy as np
from sklearn.metrics.pairwise import euclidean_distances

def cmds(X, n_dim, input_type='raw'):
    """
    Classical(linear) multidimensional scaling (MDS)

    Parameters
    ----------
    X: (d, n) array or (n,n) array
        input data. The data are placed in column-major order. 
        That is, samples are placed in the matrix (X) as column vectors
        d: dimension of points
        n: number of points

    n_dim: dimension of target space

    input_type: it indicates whether data are raw or distance
        - raw: raw data. (n,d) array. 
        - distance: precomputed distances between the data. (n,n) array.
    Returns
    -------
    Y: (n_dim, n) array. projected embeddings.
    evals: (n_dim) eigen values
    evecs: corresponding eigen vectors in column vectors
    """

    if input_type == 'distance':
        D = X
    elif input_type == 'raw':
        # Transpose X to (n, d) for euclidean_distances
        Xt = X.T
        D = euclidean_distances(Xt, Xt)
    else:
        raise ValueError("input_type must be 'raw' or 'distance'")

    # 检查距离矩阵中是否存在无穷大值,并进行替换
    if np.any(np.isinf(D)):
        # 将inf值替换为该数据类型所能表示的最大有限浮点数
        # 这样做可以避免在后续计算中因inf值导致错误,同时保留其“非常远”的语义
        D[np.isinf(D)] = np.finfo(D.dtype).max

    # Centering matrix
    n = D.shape[0]
    H = np.eye(n) - np.ones((n, n)) / n

    # Double-center the distance matrix
    # 注意:这里D**2是元素级的平方操作
    B = -0.5 * H @ (D**2) @ H

    # Eigen decomposition
    evals, evecs = np.linalg.eigh(B)

    # Sorting eigenvalues and eigenvectors in decreasing order
    sort_indices = np.argsort(evals)[::-1]
    evals = evals[sort_indices]
    evecs = evecs[:, sort_indices]

    # Selecting top n_dim eigenvectors
    evecs_selected = evecs[:, :n_dim]

    # Projecting data to the new space
    # 确保特征值非负,因为它们理论上应代表方差
    # 实际应用中,由于数值精度或非欧氏距离,可能出现微小负特征值,
    # 但对于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)是构建稳定、可靠数据分析流程的关键一环。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

225

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

500

2023.08.14

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

177

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号