我正在使用julia的聚类包在UMAP的输出上获得dbscan
聚类结果,但我一直在尝试从DBscanresult数据结构中获得聚类索引。我的目标是将集群索引作为2D散点图的向量传递,但我找不到从dbscan结果中获得该向量的方法。
Julia在dbscan下实现了两种方法。我使用的是邻接列表实现,它采用点坐标的n x d数组(umapresults,如下(。
db = dbscan(umapresults, .1, min_neighbors = 10, min_cluster_size = 10)
产生结果:
13-element Array{DbscanCluster,1}:
DbscanCluster(17, [4, 12, 84, 90, 94, 675, 676, 737, 873, 965], [27, 108, 177, 880, 954, 1050, 1067])
DbscanCluster(10, Int64[], [46, 48, 51, 57, 188, 225, 226, 228, 270, 542])
DbscanCluster(11, [48, 51, 228], [46, 49, 57, 188, 225, 226, 270, 542])
DbscanCluster(14, [418, 759, 832, 988, 1046], [830, 831, 855, 865, 989, 991, 996, 1021, 1070])
DbscanCluster(10, Int64[], [624, 654, 664, 803, 805, 821, 859, 987, 1057, 1069]) ...
但ACAICD并没有直接的方法从这些结果中获得唯一的聚类指数。
理想情况下,我想要一个产生独特分配的实现:
assignments::Vector{Int}: vector of clusters indices, where each point was assigned to a single cluster
这种方法实际上存在,并在dbscan的"距离矩阵"版本中实现,但在"邻接列表"实现中不存在等效方法。
非常感谢您的真知灼见。
感谢@nils gudat,我找到了对我有用的答案。TIL,我必须将getproperty()
广播到getproperty.()
后面带点的结果结构。对于邻接列表方法,dbscan()
中的结果结构DbscanCluster
有三个字段,它们是:
DBSCAN
dbscan函数返回的集群(基于点坐标的实现(
字段
size::Int
:集群中的点数(核心+边界(core_indices::Vector{Int}
:集群核心点的索引boundary_indices::Vector{Int}
:簇边界上的点的索引
没有"赋值",就像在基于距离的矩阵方法中一样,所以如果我必须通过广播返回core_indices
矢量:
getproperty.(drb, :core_indices)
这给了我我想要的阵列:
7-element Array{Array{Int64,1},1}:
[3, 33, 35, 36, 37, 45, 60, 63, 67, 68, 69, 219, 263, 273, 274, 453, 454, 547, 560, 1077]
[5, 8, 10, 11, 14, 17, 19, 21, 22, 24 … 1094, 1095, 1097, 1098, 1099, 1100, 1102, 1103, 1104, 1105]
[6, 179, 199, 223, 344, 345, 346, 350, 353, 355, 379, 385, 388, 389, 416, 423, 430, 447, 562, 565]
[29, 66, 133, 138, 141, 164, 171, 181, 194, 250 … 702, 883, 887, 990, 997, 998, 1015, 1055, 1056, 1074]
[86, 103, 140, 160, 207, 251, 253, 275, 284, 298 … 958, 993, 994, 999, 1002, 1004, 1005, 1024, 1072, 1092]
[418, 759, 802, 804, 818, 819, 830, 831, 832, 855 … 988, 989, 991, 995, 996, 1021, 1046, 1047, 1049, 1070]
[502, 518, 806, 822, 829, 850, 912, 964]