【问题标题】:R, Create K-nearest neighbors weights in a MatrixR,在矩阵中创建 K-最近邻权重
【发布时间】:2016-03-23 04:29:28
【问题描述】:

我有一个 2 列数据框,对应于 500 个地理参考观测样本的 XY 笛卡尔坐标。 我想生成一个权重矩阵W,其中每个元素都等于:
* 1 :如果观察jk-最近邻之一观察,以及
* 0 :否则
假设我们有这个数据框:

    df=as.data.frame(cbind(x=rnorm(500), y=rnorm(500)))  

假设 k= 20,那么如何用 R 创建这个矩阵呢?

【问题讨论】:

    标签: r knn


    【解决方案1】:

    使用 CRAN 的 FastKNN 包...假设您的距离矩阵为 5 * 5,如下所示:

    library(FastKNN)
    df <- as.data.frame(cbind(x = rnorm(5), y=rnorm(5)))
    dist_mat <- as.matrix(dist(df, method = "euclidean", upper = TRUE, diag=TRUE))
    
    ## Let's say k = 2...
    k <- 2
    nrst <- lapply(1:nrow(dist_mat), function(i) k.nearest.neighbors(i, dist_mat, k = k))
    
    ## Build w
    w <- matrix(nrow = dim(dist_mat), ncol=dim(dist_mat)) ## all NA right now
    w[is.na(w)] <- 0 ## populate with 0
    for(i in 1:length(nrst)) for(j in nrst[[i]]) w[i,j] = 1
    

    所以我的df 看起来像这样:

    > df
               x            y
    1 -0.2109351 -0.315256132
    2  0.5172415  0.003352551
    3  1.5700413 -0.737475081
    4 -0.2699282 -0.198414683
    5  1.3997493 -0.241382737
    

    我的w 最终看起来像这样:

    > w
         [,1] [,2] [,3] [,4] [,5]
    [1,]    0    1    0    1    0
    [2,]    1    0    0    1    0
    [3,]    0    1    0    0    1
    [4,]    1    1    0    0    0
    [5,]    0    1    1    0    0
    

    【讨论】:

    • 我在我的大数据框架上尝试了代码,效果很好!谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多