在netlogo中使用dbscan确定簇间距离

在netlogo中使用dbscan确定簇间距离,netlogo,Netlogo,假设您拥有以下代码(由@Nicolas Payette提供),您将如何在netlog中使用dbscan查找平均集群间距离: 让我们以距离的端点作为海龟群的中心。这取决于如何定义群间距离。有很多方法可以做到这一点 让我们以距离的端点作为海龟群的中心 虽然这是一种很好的技术,比如说,K-means聚类,但对于DBSCAN来说效果并不好,因为聚类可能是凹的。因此,中心可能在集群之外!不管怎样,我会把它作为一个选项 首先,让我们定义距离度量: 簇中点之间的平均距离: 簇中点之间的最小距离: 质心间距 假

假设您拥有以下代码(由@Nicolas Payette提供),您将如何在netlog中使用dbscan查找平均集群间距离:


让我们以距离的端点作为海龟群的中心。

这取决于如何定义群间距离。有很多方法可以做到这一点

让我们以距离的端点作为海龟群的中心

虽然这是一种很好的技术,比如说,K-means聚类,但对于DBSCAN来说效果并不好,因为聚类可能是凹的。因此,中心可能在集群之外!不管怎样,我会把它作为一个选项

首先,让我们定义距离度量:

簇中点之间的平均距离: 簇中点之间的最小距离: 质心间距 假设“世界包装”处于禁用状态:

to-report cluster-distance [ cluster1 cluster2 ]
  let x1 mean [ xcor ] of cluster1
  let y1 mean [ ycor ] of cluster1
  let x2 mean [ xcor ] of cluster2
  let y2 mean [ ycor ] of cluster2
  report sqrt ((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
end
如果世界包装是开着的

; This is super complicated because, with wrapping on, xcor and ycor are
; more like angles rather than cartesian coordinates. So, this converts
; them to angles, gets the mean of those angles, and converts them back.
; Related SO question: https://stackoverflow.com/questions/24786908/get-mean-heading-of-neighboring-turtles
to-report xcor-mean [ xcors ]
  let angles map [ x -> 360 * (x - (min-pxcor - 0.5)) / world-width ] xcors
  let mean-x mean map cos angles
  let mean-y mean map sin angles
  report (atan mean-y mean-x) / 360 * world-width + (min-pxcor - 0.5)
end

to-report ycor-mean [ ycors ]
  let angles map [ y -> 360 * (y - (min-pycor - 0.5)) / world-height ] ycors
  let mean-x mean map cos angles
  let mean-y mean map sin angles
  report (atan mean-y mean-x) / 360 * world-height + (min-pycor - 0.5)
end

to-report cluster-distance [ cluster1 cluster2 ]
  let x1 xcor-mean [ xcor ] of cluster1
  let y1 ycor-mean [ ycor ] of cluster1
  let x2 xcor-mean [ xcor ] of cluster2
  let y2 ycor-mean [ ycor ] of cluster2
  report sqrt ((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
end
平均距离 一旦我们有了一个距离测量值,得到平均距离就相对简单了。请注意,下面的
删除
是必要的,因为我们不希望在平均值中包含集群到自身的距离。还请注意,此代码效率有点低,因为它会两次计算所有距离,但这也大大简化了它:

...
; This line is modified so that we get a list of turtle sets rather than
; a list of lists. 
let clusters map turtle-set dbscan:cluster-by-location red-grey-turtles 3 3
let avg-distance mean map [ c1 ->
  mean map [ c2 ->
    cluster-distance c1 c2
  ] remove c1 clusters ; Get distance to all other clusters but c1
] clusters

这取决于如何定义簇间距离。有很多方法可以做到这一点

让我们以距离的端点作为海龟群的中心

虽然这是一种很好的技术,比如说,K-means聚类,但对于DBSCAN来说效果并不好,因为聚类可能是凹的。因此,中心可能在集群之外!不管怎样,我会把它作为一个选项

首先,让我们定义距离度量:

簇中点之间的平均距离: 簇中点之间的最小距离: 质心间距 假设“世界包装”处于禁用状态:

to-report cluster-distance [ cluster1 cluster2 ]
  let x1 mean [ xcor ] of cluster1
  let y1 mean [ ycor ] of cluster1
  let x2 mean [ xcor ] of cluster2
  let y2 mean [ ycor ] of cluster2
  report sqrt ((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
end
如果世界包装是开着的

; This is super complicated because, with wrapping on, xcor and ycor are
; more like angles rather than cartesian coordinates. So, this converts
; them to angles, gets the mean of those angles, and converts them back.
; Related SO question: https://stackoverflow.com/questions/24786908/get-mean-heading-of-neighboring-turtles
to-report xcor-mean [ xcors ]
  let angles map [ x -> 360 * (x - (min-pxcor - 0.5)) / world-width ] xcors
  let mean-x mean map cos angles
  let mean-y mean map sin angles
  report (atan mean-y mean-x) / 360 * world-width + (min-pxcor - 0.5)
end

to-report ycor-mean [ ycors ]
  let angles map [ y -> 360 * (y - (min-pycor - 0.5)) / world-height ] ycors
  let mean-x mean map cos angles
  let mean-y mean map sin angles
  report (atan mean-y mean-x) / 360 * world-height + (min-pycor - 0.5)
end

to-report cluster-distance [ cluster1 cluster2 ]
  let x1 xcor-mean [ xcor ] of cluster1
  let y1 ycor-mean [ ycor ] of cluster1
  let x2 xcor-mean [ xcor ] of cluster2
  let y2 ycor-mean [ ycor ] of cluster2
  report sqrt ((x1 - x2) ^ 2 + (y1 - y2) ^ 2)
end
平均距离 一旦我们有了一个距离测量值,得到平均距离就相对简单了。请注意,下面的
删除
是必要的,因为我们不希望在平均值中包含集群到自身的距离。还请注意,此代码效率有点低,因为它会两次计算所有距离,但这也大大简化了它:

...
; This line is modified so that we get a list of turtle sets rather than
; a list of lists. 
let clusters map turtle-set dbscan:cluster-by-location red-grey-turtles 3 3
let avg-distance mean map [ c1 ->
  mean map [ c2 ->
    cluster-distance c1 c2
  ] remove c1 clusters ; Get distance to all other clusters but c1
] clusters

max和min(甚至是平均值)函数是否适用于分布在一个映射中的两个以上集群?不完全确定您的要求。每个距离函数都测量两个簇之间的距离。然后,求平均值得到每个簇组合之间的距离。所以,除非我有误解,是的。谢谢你的精彩回答,非常彻底和有用。平均反应正是我需要帮助理解的。我想知道这个代码是否只找到两个星团质心之间的平均距离,或者,如果它能像我所希望的那样在netlogo界面上找到多个群集之间的平均距离?如何迭代找到两个以上群集之间的最大和最小距离?平均距离部分是所有群集之间的平均距离,而不是两个群集之间的平均距离。要查找最大值和最小值,只需将该代码中的
mean
s更改为
max
min
。最大值和最小值(甚至平均值)函数是否适用于分布在地图中的两个以上群集?不完全确定您在问什么。每个距离函数都测量两个簇之间的距离。然后,求平均值得到每个簇组合之间的距离。所以,除非我有误解,是的。谢谢你的精彩回答,非常彻底和有用。平均反应正是我需要帮助理解的。我想知道这个代码是否只找到两个星团质心之间的平均距离,或者,如果它能像我所希望的那样在netlogo界面上找到多个群集之间的平均距离?如何迭代找到两个以上群集之间的最大和最小距离?平均距离部分是所有群集之间的平均距离,而不是两个群集之间的平均距离。要查找最大值和最小值,只需将该代码中的
平均值
s更改为
max
min