我想使用聚类算法来查找大Digraph的聚类,我也想从此图中删除噪声。所以,我正在考虑使用 DBSCAN 方法,因为我看到我们可以给算法一个距离函数来确定两个不同节点之间的距离/相似度。 / p>
我的问题是,我如何定义一个距离函数,增加两个节点之间的相似性在跳跃方面关闭,而降低在节点被隔离时。
我没有坐标或节点属性,因此我无法使用它们。我只有图的拓扑结构。
预期的输出将是这样的:
我真的很担心解决方案的复杂性。如何近似具有线性复杂度的聚类...
答案 0 :(得分:1)
显而易见的是什么问题?
距离(a,b)=最短路径的长度,如果没有,则为无穷大。
你可能应该考虑方向,所以a0到a3是1。
答案 1 :(得分:0)
@ Anony-Mousse建议的距离指标很好 和自然的,但我质疑dbscan的使用。运用 建议
distance = length of shortest path, or infinity if there is none
直接链接的任何两个节点都在距离1处。 如果你使用dbscan与epsilon< 1,所有点都是噪音 点。所以你会想要epsilon>从你的例子看,它看起来 就好在距离1处甚至有一个点,你想要它们 相同的组件 它看起来像你想要minNumPts = 2.这将给出 结果是两个点通过任何长度的路径连接 他们会在同一个集群中。它看起来像什么 你所追求的与密度和聚类无关, 相反,我认为你想要的是连接组件。 如果两个节点通过任意长度的路径连接,则它们是 在同一个组件中。通过dbscan或其他一些集群查找 方法可能,但可能是 错误的思考方式。你有一个图表和一个图表 理论问题。您应该使用图表中的方法 理论。
我将使用R和igraph来说明。还有其他工具 如果你不关心这些。
大多数工作只是设置你的问题。
library(igraph)
to = c("a1", "a2", "a3", "a0", "b1", "b2", "b3", "b0")
from = c("a0", "a1", "a2", "a3", "b0", "b1", "b2", "b3")
EL = data.frame(from, to)
Vert = c("a0", "a1", "a2", "a3", "b0", "b1", "b2", "b3", "c0", "d0")
Vdf = data.frame(Vert)
g = graph_from_data_frame(d = EL, vertices=Vdf)
LO = matrix(c(1.2,1,1,1.2, 2.2,2,2,2.2, 0, 3, 4,3,2,1,4,3,2,1,4,4),
ncol=2)
plot(g, layout=LO)
现在我们可以使用单线来获得我们需要的一切 关于组件。
Comp = components(g, mode="weak")
Comp
$membership
a0 a1 a2 a3 b0 b1 b2 b3 c0 d0
1 1 1 1 2 2 2 2 3 4
$csize
[1] 4 4 1 1
$no
[1] 4
这告诉我们节点的组件成员资格, 每个组件的节点数和数量 组件。因为你想调用单个节点 可以使用dbscan风格的组件“噪音” 看到组件3和4各有一个节点 他们是噪音。其他是“真正的”组件。 为了说明如何使用它并用一个来关闭 漂亮的图片,我将绘制着色图 组件并使用浅灰色表示“噪音”。
ColorMap = rainbow(Comp$no)
ColorMap[Comp$csize == 1] = "lightgray"
plot(g, layout=LO, vertex.color=ColorMap[Comp$membership])
我建议您将图表问题视为图表。