从 N 点到 R 中其他 M 点集的距离总和

数据挖掘 机器学习 r 聚类 工作室
2022-01-22 18:02:45

想象两个相关的问题:

  1. 我有一个二维数据点和一组M2-dim 其他数据点。如何计算一个点与那些点之间所有距离的总和M积分?结果是一个数字。

  2. 我现在有N2-dim 点和相同的集合M2-dim 数据点如上。如何计算之间所有距离的总和N点和那些M积分?应该相当于循环遍历N积分并获得这些总和。结果是N数字。

这个问题与聚类有关。我使用 kmeans 从校准数据中提取了集群,但现在我想确定我的新点属于哪个集群。当然,简单的循环是低效的。

更新:

这是一个 R 问题。

数学公式:

(x,y)iN-放,(X,Y)kM-放。

k=1M(xiXk)2+(yiYk)2=di2

更新2:

我发现的一种方法是将所有内容分为两个步骤:

  1. (校准)使用 stats::kmeans() 等方法识别集群。它为整个数据集提供类。
  2. (回测)将数据集拆分为训练子样本和测试子样本,并使用 class::knn()。来自训练子样本的集群 ID 被假定为“真”。在输出中,它将提供由 knn 在测试子样本中标识的集群 ID。完全按照我的需要使用欧几里德指标选择测试集群 ID。

虽然我无法控制这个过程,但它仍然可以提供令人满意的结果和速度。

必须对单点进行分类的实时解决方案可以通过校准样本来实现(在步骤 1 之后)。

2个回答

首先,让我们创建一个计算函数:

dist_func <- function(a, b){
  sqrt((a$x-b$x)^2 + (a$y-b$y)^2)
}

现在,我们将创建一个数据集来处理第 1 种情况:

source <- data.frame(x=22.78, y= 73.27)

set.seed(4)
destination <- data.frame(x=runif(20, 22, 23), y=runif(20,77,78))

#Now just call the function and sum up

> sum(dist_func(source, destination))
[1] 86.76514

对于案例 2,我们将使用 for 循环来存储结果:

#Let's change the source

set.seed(4)
source <- data.frame(x=runif(5, 22, 23), y=runif(5,77,78))

#We will store the result in this vector

dist_output <- c()

for (i in 1:nrow(source)) {
  
  dist_output[i]<-sum(dist_func(source[i,], destination))
}

> dist_output
[1]  9.689657 12.537179 10.379821 11.005016 13.006207

如果这解决了您的目的,请在评论中告诉我。

为什么不这样做(伪代码):

from sklearn.metrics import euclidean_distances

#X.shape = (M, 2)

Y = euclidean_distances(X, [[x1, y1]])

其中 2-dim 点(如问题 1)是 (x1, y1)