DBSCAN 的距离函数

Distance function for DBSCAN

我想使用聚类算法为一个大有向图找到一个聚类,我也想从这个图中去除噪音。所以,我想使用 DBSCAN 方法,因为我看到我们可以给算法一个距离函数来确定 distance/similarity 在两个不同的节点之间。

我的问题是,我如何定义一个距离函数,它 增加 两个节点之间的相似性在跳数方面接近并且 减少 当一个节点被隔离时。

我没有坐标或节点属性,所以我不能使用它们。我只有图的拓扑结构。

预期的输出将是这样的:

我真的很担心解决方案的复杂性。如何近似具有线性复杂度的聚类...

明显有什么问题?

Distance(a,b) = 最短路径的长度,如果有 none.

则为无穷大

您可能应该考虑方向,所以 a0 到 a3 是 1。

@Anony-Mousse 建议的距离度量很好 和自然的一个,但我质疑 dbscan 的使用。使用 提议

distance = length of shortest path, or infinity if there is none

直接链接的任何两个节点的距离为 1。 如果您使用 dbscan 且 epsilon < 1,则所有点都是噪声 点。所以你会想要 epsilon > 1。从你的例子来看,它看起来 就像在距离 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

这告诉我们节点的组件成员资格, 每个组件的节点数和 组件。因为你想调用单个节点 组件 "noise" 在 dbscan 的风格,你可以 看到组件 3 和 4 各有一个节点。
他们是噪音。其他的是 "real" 个组件。 展示如何使用它并以一个结束 漂亮的图片,我将绘制图表着色 组件并为 "noise".

使用浅灰色
ColorMap = rainbow(Comp$no)
ColorMap[Comp$csize == 1] = "lightgray"
plot(g, layout=LO, vertex.color=ColorMap[Comp$membership])

我鼓励您将图形问题视为图形。