R 在DBS中查找k最大的簇可以得到
我有一个数据帧df,由两列组成:x和y坐标。 每行指一个点。 我将其输入dbscan函数,以获得df中的点簇 通过使用print(db),我可以看到dbscan返回的结果 从上面的总结中,我可以看到集群2包含8186个种子点(核心点),集群1包含2634个种子点,集群5包含561个点 我将最大的集群定义为包含最多种子点的集群。因此,在这种情况下,最大的集群是集群2。第一、第二、第三大集群分别为2、1和5 一般来说,它们是否可以直接返回最大集群或k最大集群中的行(点)? 我可以用间接的方式来做R 在DBS中查找k最大的簇可以得到,r,dbscan,R,Dbscan,我有一个数据帧df,由两列组成:x和y坐标。 每行指一个点。 我将其输入dbscan函数,以获得df中的点簇 通过使用print(db),我可以看到dbscan返回的结果 从上面的总结中,我可以看到集群2包含8186个种子点(核心点),集群1包含2634个种子点,集群5包含561个点 我将最大的集群定义为包含最多种子点的集群。因此,在这种情况下,最大的集群是集群2。第一、第二、第三大集群分别为2、1和5 一般来说,它们是否可以直接返回最大集群或k最大集群中的行(点)? 我可以用间接的方式来做 我
但上述方法重新计算了许多已知结果,如打印摘要(db)中所述。dbscan
函数似乎没有保留数据
library(fpc)
set.seed(665544)
n <- 600
df <- data.frame(x=runif(10, 0, 10)+rnorm(n, sd=0.2), y=runif(10, 0, 10)+rnorm(n,sd=0.2))
(dbs <- dbscan(df, 0.2))
#dbscan Pts=600 MinPts=5 eps=0.2
# 0 1 2 3 4 5 6 7 8 9 10 11
#border 28 4 4 8 5 3 3 4 3 4 6 4
#seed 0 50 53 51 52 51 54 54 54 53 51 1
#total 28 54 57 59 57 54 57 58 57 57 57 5
attributes(dbs)
#$names
#[1] "cluster" "eps" "MinPts" "isseed"
#$class
#[1] "dbscan"
库(fpc)
种子集(665544)
n创建您自己的函数,其中包含您概述的5个“间接”步骤。此函数的输入参数可以是dbscan函数的结果、数据和k。函数的输出是所需的数据帧,其中包含与第k个最大集群对应的行。瞧,你现在有了一个直接获得你想要的东西的方法我认为我应该利用打印(db)中列出的总结结果,而不是从草图中再次计算所有内容。但问题是,我不知道如何从摘要中提取信息。>_太棒了,谢谢!因为我是R新手,我仍然很难相信你能用两行代码将这5个步骤实现成一个优雅的函数。最让我吃惊的语法是“data[dbs$cluster==kth,]”。我认为这意味着(1)将dbs$cluster添加为数据中的新列data$cluster,(2)选择data$cluster==kth的行,以及(3)从数据中删除data$cluster。函数返回的聚类向量长度与数据相同,但顺序与数据相同。这是至关重要的。这才是R的真正定义,也是程序如此吸引人的原因。因此,我们可以使用该向量,或者在本例中使用逻辑向量来索引数据行。:)事实上,只有一行代码是可能的,但通常最好让代码更具可读性。也更容易调试或修改。我也可以看看单线版本吗?我很喜欢这种简洁的写作风格。你只需将第二行的kth
替换为第一行的kth
表达式即可<代码>数据[dbs$cluster==名称(rev(sort(table(dbs$cluster)))[k],]
。不过有点难看。
> print(db)
dbscan Pts=13131 MinPts=4 eps=0.08
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
border 401 38 55 5 2 3 0 0 0 8 0 6 1 3 1 3 3 2 1 2 4 3
seed 0 2634 8186 35 24 561 99 7 22 26 5 75 17 9 9 54 1 2 74 21 3 15
total 401 2672 8241 40 26 564 99 7 22 34 5 81 18 12 10 57 4 4 75 23 7 18
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
border 4 1 2 6 2 1 3 7 2 1 2 3 11 1 3 1 3 2 5 5 1 4 3
seed 14 9 4 48 2 4 38 111 5 11 5 14 111 6 1 5 1 8 3 15 10 15 6
total 18 10 6 54 4 5 41 118 7 12 7 17 122 7 4 6 4 10 8 20 11 19 9
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
border 2 4 2 1 3 2 1 1 3 1 0 2 2 3 0 3 3 3 3 0 0 2 3 1
seed 15 2 9 11 4 8 12 4 6 8 7 7 3 3 4 3 3 4 2 9 4 2 1 4
total 17 6 11 12 7 10 13 5 9 9 7 9 5 6 4 6 6 7 5 9 4 4 4 5
69 70 71
border 3 3 3
seed 1 1 1
total 4 4 4
library(fpc)
set.seed(665544)
n <- 600
df <- data.frame(x=runif(10, 0, 10)+rnorm(n, sd=0.2), y=runif(10, 0, 10)+rnorm(n,sd=0.2))
(dbs <- dbscan(df, 0.2))
#dbscan Pts=600 MinPts=5 eps=0.2
# 0 1 2 3 4 5 6 7 8 9 10 11
#border 28 4 4 8 5 3 3 4 3 4 6 4
#seed 0 50 53 51 52 51 54 54 54 53 51 1
#total 28 54 57 59 57 54 57 58 57 57 57 5
attributes(dbs)
#$names
#[1] "cluster" "eps" "MinPts" "isseed"
#$class
#[1] "dbscan"
cluster_k <- function(dbs, data, k){
kth <- names(rev(sort(table(dbs$cluster)))[k])
data[dbs$cluster == kth,]
}
cluster_k(dbs=dbs, data=df, k=1)
## x y
## 3 6.580695 8.715245
## 13 6.704379 8.528486
## 23 6.809558 8.160721
## 33 6.375842 8.756433
## 43 6.603195 8.640206
## 53 6.728533 8.425067
## a data frame with 59 rows