当前位置: 首页 > 知识库问答 >
问题:

计算列表中所有向量之间欧几里德距离和闵可夫斯基距离的最快方法

皮景龙
2023-03-14

我已经尝试了一段时间来计算列表中所有向量之间的欧几里德距离和闵可夫斯基距离。我没有太多的高级数学知识。

  • 我通常用4或5维向量工作
  • 向量列表的大小范围可以从0到大约200,000
  • 当计算距离时,所有向量将具有相同的维数

在这个过程中,我依赖于这两个问题:

行向量矩阵间python-numpy欧氏距离计算

计算列表中所有元素之间的欧氏距离

起初,我的代码如下所示:

import numpy as np

def euclidean_distance_np(vec_list, single_vec):
    dist = (np.array(vec_list) - single_vec) ** 2
    dist = np.sum(dist, axis=1)
    dist = np.sqrt(dist)
    return dist

def minkowski_distance_np(vec_list, single_vec, p_val):
    dist = (np.abs(np.array(vec_list, dtype=np.int64) - single_vec) ** p_val).sum(axis=1) ** (1 / p_val)
    return dist

当我有少量向量时,这工作得很好。我会计算单个向量到列表中所有向量的距离,并对列表中的每个向量逐个重复这个过程,但是一旦列表变成5或6位数的长度,这些函数就变得极其缓慢。

我设法改进了欧几里德距离计算,如下所示:

x = np.array([v[0] for v in vec_list])
y = np.array([v[1] for v in vec_list])
z = np.array([v[2] for v in vec_list])
w = np.array([v[3] for v in vec_list])
t = np.array([v[4] for v in vec_list])

res = np.sqrt(np.square(x - x.reshape(-1,1)) + np.square(y - y.reshape(-1,1)) + np.square(z - z.reshape(-1,1)) + np.square(w - w.reshape(-1,1)) + np.square(t - t.reshape(-1,1)))

但无法弄清楚如何实现上述数据口径来正确计算Minkowski距离。所以,准确地说,我的问题是如何以类似于我上面提到的代码的方式计算明考夫斯基距离。

我也希望有任何改进意见或更好的方法来进行计算

共有1个答案

赫连俊悟
2023-03-14

Scipy已经实现了距离函数:minkowski,欧几里德函数。但可能你需要的是cdist。

Numpy是矩阵操作的绝佳工具,但它并不包含所有可能的函数。您可以在SciPy中找到大多数与数学、科学和工程更相关的附加功能和操作。

 类似资料:
  • 我有一份清单。我想找到所有对和自身之间的欧几里德距离,并创建一个2D numpy数组。当对不同时,其自身之间的距离的位置和值将为0。列表列表的示例:我想要的结果是 x表示差异的值。周期意味着结果应遵循矩阵中所示。我需要python代码方面的帮助。行和列中0、1、2等的数量定义了内部列表索引。

  • 首先,我知道欧几里得距离是什么,以及它在两个向量之间做什么或计算什么。 但我的问题是如何计算两个类对象之间的距离,例如在Java或任何其他OOP语言中。我读了很多关于机器学习的东西,已经使用库等编写了分类器。但我想知道,当我有例如以下对象时,如何计算欧几里德距离: 我已经知道的是(如果我没有错!)我必须将此对象转换为表示属性或“特征”的(n)个向量/数组(在机器学习中称为?) 但我该怎么做呢?这正

  • 我在一个列表中有8个点,我需要计算所有可能对之间的欧几里德距离。我可以编写一个for循环并继续计算距离,但是python/numpy/others有更好的方法吗? 坐标点:

  • 我试图使用Scala类计算两点之间的距离。但它给出了一个错误说 类型不匹配;发现:其他。需要类型(具有基础类型点):?{def x:?}请注意,隐式转换不适用,因为它们是不明确的:在[A](x:A)类型的对象Predef中确保[A]的方法any2Ensuring和在[A](x:A)“ArroAssoc[A]类型的对象Predef中的方法Ani2ArrowasSoc都是可能的其他转换函数。输入到?{

  • 问题内容: 我在3D中有两点: 我想计算距离: 使用NumPy或一般使用Python的最佳方法是什么?我有: 问题答案: 用途 背后的理论:如数据挖掘导论所述 之所以有效,是因为欧几里得距离为l2范数,并且 中ord参数的默认值为2。

  • 问题内容: 我在二维空间中有一组点,需要计算每个点到另一个点的距离。 我的点数相对较少,最多不超过100个。但是,由于我需要经常快速地确定这些移动点之间的关系,并且因为我知道遍历这些点可能同样糟糕由于O(n ^ 2)的复杂性,我正在寻找利用numpy矩阵魔术(或scipy)的方法。 就象我的代码中所说的那样,每个对象的坐标都存储在其类中。但是,当我更新类坐标时,也可以用numpy数组更新它们。 我