在 R 中创建距离矩阵(不使用 dist())
create a distance matrix in R (without using dist())
我需要从矩阵创建距离矩阵,returns 列之间的距离。
我知道 它存在一个名为 dist() 的函数,但我不能使用它,因为我将使用不常见的距离函数。
本来想用apply,不知道怎么写
我创建的循环是:
dista <- function(A,distance){
dist_matrix=matrix(0,dim(A)[2],dim(A)[2])
for (i in 1:(dim(A)[2]-1)){
for(j in (i+1):(dim(A)[2])){
if(distance=='cosine') dist_matrix[j,i]<- (1-sum(A[,i]*A[,j]))/(sqrt(sum(A[,i]^2))+sqrt(sum(A[,j]^2)))
}
}
dist_matrix
}
假设您有这样的数据框:
df <- data.frame(x = rnorm(10, 5, 1), y = rnorm(10))
您可以使用如下方式申请:
apply(df, 1, dist)
要使用客户距离函数,您可以将上面对 dist
的调用替换为:
apply(df, 1, my_own_dist)
当然,这会遍历每一行数据,但仍然比基于矩阵的计算要慢。了解距离函数的实际作用可能会帮助人们以更有效的方式解决问题。
根据以下评论进行编辑....
如果您尝试计算原始矩阵 A 中每对列之间的成对距离,您可以尝试这样的操作:
apply(combn(1:ncol(A), 2), 2, function(x) my_dist_function(A[, x]))
首先生成所有唯一的列对,然后运行一次一个地通过它们
我需要从矩阵创建距离矩阵,returns 列之间的距离。
我知道 它存在一个名为 dist() 的函数,但我不能使用它,因为我将使用不常见的距离函数。
本来想用apply,不知道怎么写
我创建的循环是:
dista <- function(A,distance){
dist_matrix=matrix(0,dim(A)[2],dim(A)[2])
for (i in 1:(dim(A)[2]-1)){
for(j in (i+1):(dim(A)[2])){
if(distance=='cosine') dist_matrix[j,i]<- (1-sum(A[,i]*A[,j]))/(sqrt(sum(A[,i]^2))+sqrt(sum(A[,j]^2)))
}
}
dist_matrix
}
假设您有这样的数据框:
df <- data.frame(x = rnorm(10, 5, 1), y = rnorm(10))
您可以使用如下方式申请:
apply(df, 1, dist)
要使用客户距离函数,您可以将上面对 dist
的调用替换为:
apply(df, 1, my_own_dist)
当然,这会遍历每一行数据,但仍然比基于矩阵的计算要慢。了解距离函数的实际作用可能会帮助人们以更有效的方式解决问题。
根据以下评论进行编辑....
如果您尝试计算原始矩阵 A 中每对列之间的成对距离,您可以尝试这样的操作:
apply(combn(1:ncol(A), 2), 2, function(x) my_dist_function(A[, x]))
首先生成所有唯一的列对,然后运行一次一个地通过它们