【问题标题】:Calculating euclidean distances between two data frame in python在python中计算两个数据框之间的欧几里得距离
【发布时间】:2017-09-15 12:01:17
【问题描述】:

我正在尝试编写 K-means 聚类程序,其中需要欧几里得距离。我了解当数据存储在列表中时它是如何工作的,如下面的代码。

for featureset in data:
    distances = [np.linalg.norm(featureset - self.centroids[centroid]) for centroid in self.centroids]
    cluster_label = distances.index(min(distances))

但是我的数据集非常大(大约 400 万行),所以使用列表或数组肯定不是很有效。我想将数据存储在数据框中。我正在考虑迭代data 的每一行并进行欧几里得计算,但它似乎并不那么有效,即使我使用的是iteruples()iterrows。我想知道是否有更有效的方法来做到这一点。

【问题讨论】:

  • 所以每个数据框都有一个包含点元组的列?
  • 如果我真的明白你的意思,是的。每行包含一组数据点。 @DmitryPolonskiy
  • @AnnaRG,请提供小型(3-7 行)可重复的样本数据集(文本/CSV 格式)和所需的数据集。 how to make good reproducible pandas examples

标签: python dataframe k-means


【解决方案1】:

当您在列表理解中计算距离时,centroid 已经是列表 self.centroids 的元素,因此无需在范数计算中再次订阅它。可能你提供的代码应该改成这样:

distances = [np.linalg.norm(featureset - centroid) for centroid in self.centroids]

但是,如果您将np.array 用于data 存储,这可能会更有效:

cluster_label = np.linalg.norm(self.centroids - featureset, axis=1).argmin()

让我们定义一个函数,它将返回一些featureset 的质心标签:

def get_label(featureset):
    return np.linalg.norm(self.centroids - featureset, axis=1).argmin()

现在我们可以在整个数据集上应用这个函数:

labels = np.apply_along_axis(get_label, 1, data)

如果 data 太大而无法作为单个 np.array 处理,您可以将其拆分为较小的和平,分别处理它们,然后连接结果。

【讨论】:

    猜你喜欢
    • 2020-06-10
    • 2020-01-23
    • 2019-09-30
    • 2020-07-18
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多