R,在矩阵中创建 K-最近邻权重
R, Create K-nearest neighbors weights in a Matrix
我有一个 2 列数据框,对应于 500 个地理参考观测样本的 X 和 Y 笛卡尔坐标。
我想生成一个权重矩阵 W 其中每个元素等于:
* 1 :if 观察 j 是其中之一k-最近邻观察i,和
* 0 :if else.
假设我们有这个数据框:
df=as.data.frame(cbind(x=rnorm(500), y=rnorm(500)))
假设 k= 20,那么如何用 R 创建这个矩阵?
使用 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
我有一个 2 列数据框,对应于 500 个地理参考观测样本的 X 和 Y 笛卡尔坐标。
我想生成一个权重矩阵 W 其中每个元素等于:
* 1 :if 观察 j 是其中之一k-最近邻观察i,和
* 0 :if else.
假设我们有这个数据框:
df=as.data.frame(cbind(x=rnorm(500), y=rnorm(500)))
假设 k= 20,那么如何用 R 创建这个矩阵?
使用 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