【问题标题】:Adding Euclidean distance to a matrix将欧几里得距离添加到矩阵
【发布时间】:2018-05-11 06:59:17
【问题描述】:

我解释我必须开发什么。

假设我必须执行一个函数,负责接收两个矩阵,这两个矩阵具有相同的列数,但行数可以不同。

总而言之,我们将有两个向量矩阵,它们具有相同的维度但元素个数 N 不同。

我必须计算构成我的两个矩阵的每个向量之间的欧几里得距离,然后将其存储在另一个矩阵中,该矩阵将包含我所有向量之间的欧几里得距离。

这是我开发的代码:

def compute_distances(x, y):
    # Dimension:
    N, d = x.shape
    M, d_ = y.shape

    # The dimension should be the same
    if d != d_:
        print "Dimensiones de x e y no coinciden, no puedo calcular las distancias..."
        return None

    # Calculate distance with loops:
    D = np.zeros((N, M))
    i = 0
    j = 0
    for v1 in x:
       for v2 in y:
            if(j != M):
                D[i,j] = math.sqrt(sum([(xi-yi)**2 for xi,yi in zip(v1,v2)]))
            #print "[",i,",",j,"]"
                j = j + 1
            else:
                j = 0
       i = i + 1;

    print D

在这种方法中,我接收到两个矩阵,以便稍后创建一个矩阵,该矩阵将在我的矩阵 xy 的向量之间具有欧几里得距离。

问题如下,我不知道如何,对每一个计算出来的欧几里得距离值我要为我生成的新矩阵D分配正确的位置。

我的主要功能有以下结构:

n = 1000
m = 700
d = 10

x = np.random.randn(n, d)
y = np.random.randn(m, d)

print "x shape =", x.shape
print "y shape =", y.shape

D_bucle = da.compute_distances(x, y)
D_cdist = cdist(x, y)

print np.max(np.abs(D_cdist - D_bucle))

B_cdist 使用有效的方法计算欧几里得距离。 它必须具有与 D_bucle 相同的结果,计算结果与另一个相同,但代码效率不高,但我没有得到应有的结果。

我认为是当我创建我的欧几里得矩阵 D 时没有正确执行,然后计算不正确。

更新!!! 我刚刚更新了我的解决方案,我的问题是首先我不知道如何将每对向量的正确欧几里德向量结果分配给 D 矩阵, 现在我知道如何分配它,但现在我的问题是,与 cdist 函数相比,只有 D Matrix 的第一行具有正确的结果

【问题讨论】:

标签: python loops numpy


【解决方案1】:

不完全理解您的要求,但我确实看到了一个可以解释您的结果的问题:

for v1 in x:
  for v2 in y:
    D = math.sqrt(sum([(xi-yi)**2 for xi,yi in zip(v1,v2)]))

在您通过此循环的每 NxM 次时,您都会覆盖 D 的值。完成后 D 仅包含上次比较的距离。你可能需要像 D[i,j] = math.sqrt(...

【讨论】:

  • might need something like D[i,j] 而不是 可能类似,您能否针对该缺陷提供解决方案/修复?
  • 是的,被指控有罪。我很模糊,因为我不熟悉在这种情况下提供矩阵的 numpy
  • 这是我的解决方案,但我认为它做得不好,因为比较 cdist 函数和我的欧几里得函数只有两个结果的第一行是正确的。 i = 0 j = 0 for v1 in x: for v2 in y: if(j != M): D[i,j] = math.sqrt(sum([(xi-yi)**2 for xi,yi in zip(v1,v2)])) #print "[",i,",",j,"]" j = j + 1 else: j = 0 i = i + 1;
  • 我自己用 numpy 试过这个,你更新的解决方案似乎产生了一个有效的矩阵。你能确认一下吗?
猜你喜欢
  • 2014-11-18
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2020-06-16
  • 2013-03-02
  • 2014-06-08
相关资源
最近更新 更多