如何将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
相关产品推荐
相关产品推荐

