You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将UMAP应用于自定义融合的距离矩阵?

问题:使用自定义距离矩阵运行UMAP时出错

我正在进行聚类分析,通过融合三个不同加权的距离矩阵得到了自定义距离矩阵,已经用MDS成功提取成分,现在尝试用UMAP提取成分。我用dist()命令生成了该距离矩阵,还将其转换为矩阵,但使用uwot包的umap()命令时出现以下错误:

第一个错误:

UMAP_prep <- umap(Futbol_Sparse, metric = "precomputed", n_components = 5)
Error in matrix(0, nrow = n, ncol = k) : 
  invalid 'ncol' value (too large or NA)

第二个错误:

> UMAP_prep <- umap(Futbol_Distances, metric = "precomputed", n_components = 5)
Error in 1:k : argument of length 0

我知道可以直接用原始数据集跑UMAP,但原始数据包含8901个观测值与67个预测变量,无法提供。请问如何将UMAP应用于我的距离矩阵?


补充数据结构信息:

> a
6 x 6 sparse Matrix of class "dsCMatrix"
          1         2         3         4         5         6
1 .         0.1125300 0.2593345 0.3366033 0.1128020 0.3617233
2 0.1125300 .         0.2304761 0.1847940 0.2635693 0.4567474
3 0.2593345 0.2304761 .         0.1489901 0.2106683 0.4101453
4 0.3366033 0.1847940 0.1494022 .         0.1494022 0.1547576
5 0.1128020 0.2635693 0.2106683 0.1494022 .         0.4835147
6 0.3617233 0.4567474 0.4101453 0.1547576 0.4835147 .        
> str(Futbol_Sparse)
Formal class 'dsCMatrix' [package "Matrix"] with 7 slots
  ..@ i       : int [1:39609450] 0 0 1 0 1 2 0 1 2 3 ...
  ..@ p       : int [1:8902] 0 0 1 3 6 10 15 21 28 36 ...
  ..@ Dim     : int [1:2] 8901 8901
  ..@ Dimnames:List of 2
  .. ..$ : chr [1:8901] "1" "2" "3" "4" ...
  .. ..$ : chr [1:8901] "1" "2" "3" "4" ...
  ..@ x       : num [1:39609450] 0.113 0.259 0.23 0.337 0.185 ...
  ..@ uplo    : chr "U"
  ..@ factors : list()

解决方法

1. 修复稀疏矩阵的对称性

你的Futbol_Sparse是上三角稀疏矩阵(uplo="U"),而uwot::umap处理预计算距离矩阵时,需要完整的对称矩阵。可以用Matrix包的forceSymmetric()将其转换为对称稀疏矩阵:

library(Matrix)
# 转换为对称稀疏矩阵
Futbol_Sparse_sym <- forceSymmetric(Futbol_Sparse)
# 运行UMAP
UMAP_prep <- umap(Futbol_Sparse_sym, metric = "precomputed", n_components = 5)

2. 显式指定邻居数量参数

错误中的k大概率对应UMAP的n_neighbors参数,默认值为15,但当样本量较大时,显式指定该参数可以避免推断错误:

UMAP_prep <- umap(Futbol_Sparse_sym, metric = "precomputed", 
                  n_components = 5, n_neighbors = 15)

3. 尝试转换为稠密矩阵(内存允许时)

如果稀疏矩阵仍有问题,可以尝试转为普通稠密矩阵,但注意8901x8901的矩阵会占用约600MB内存,需确保内存足够:

Futbol_Dense <- as.matrix(Futbol_Sparse_sym)
UMAP_prep <- umap(Futbol_Dense, metric = "precomputed", n_components = 5)

4. 验证距离矩阵的有效性

确保距离矩阵满足:

  • 对角线值为0(你的稀疏矩阵中用.表示,正确)
  • 所有距离值非负
  • 矩阵严格对称(转换后的对称矩阵已满足)

内容的提问来源于stack exchange,提问作者Leonardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:15:40