Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在DBS中查找k最大的簇可以得到_R_Dbscan - Fatal编程技术网

R 在DBS中查找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最大集群中的行(点)? 我可以用间接的方式来做 我

我有一个数据帧df,由两列组成:x和y坐标。 每行指一个点。 我将其输入dbscan函数,以获得df中的点簇

通过使用print(db),我可以看到dbscan返回的结果

从上面的总结中,我可以看到集群2包含8186个种子点(核心点),集群1包含2634个种子点,集群5包含561个点

我将最大的集群定义为包含最多种子点的集群。因此,在这种情况下,最大的集群是集群2。第一、第二、第三大集群分别为2、1和5

一般来说,它们是否可以直接返回最大集群或k最大集群中的行(点)?

我可以用间接的方式来做

  • 我可以通过 db$cluster
  • 因此,我可以使用db$cluster作为 除了原来的x列和y列之外,新增了一列 专栏
  • 然后,我可以根据中的集群编号聚合df2 单击第三列并查找每个簇中的点数
  • 在那之后,我可以找到k-最大的群,它们是2,1和5 再说一遍
  • 最后,我可以选择df2中第三列值等于2的行,以返回最大集群中的点

  • 但上述方法重新计算了许多已知结果,如打印摘要(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