【问题标题】:Euclidean distance with weights带权重的欧几里得距离
【发布时间】:2012-01-14 07:38:44
【问题描述】:

我目前正在使用SciPy计算欧式距离

dis = scipy.spatial.distance.euclidean(A,B)

在哪里; A、B 是 5 维位向量。现在效果很好,但是如果我为每个维度添加权重,是否仍然可以使用 scipy?

我现在拥有的:sqrt((a1-b1)^2 + (a2-b2)^2 +...+ (a5-b5)^2)

我想要什么:sqrt(w1(a1-b1)^2 + w2(a2-b2)^2 +...+ w5(a5-b5)^2) 使用 scipy 或 numpy 或任何其他有效的方式来做到这一点。

谢谢

【问题讨论】:

    标签: python numpy scipy euclidean-distance


    【解决方案1】:

    编写自己的加权 L2 范数的建议是一个不错的建议,但 this answer 中提供的计算不正确。如果打算计算

    那么这应该可以完成工作:

    def weightedL2(a,b,w):
        q = a-b
        return np.sqrt((w*q*q).sum())
    

    【讨论】:

      【解决方案2】:

      只需自己定义即可。像这样的东西应该可以解决问题:

      def mynorm(A, B, w):
          import numpy as np
          q = np.matrix(w * (A - B))
          return np.sqrt((q * q.T).sum())
      

      【讨论】:

      • 这不是问题中包含的规范 - 您已经对权重进行了平方。 .sum() 也是完全多余的,q*q.T 是向量与自身的内积,即。它总和。
      • 您对权重的看法是正确的,我应该更加小心,但是您对 .sum() 完全多余的批评是错误的。 q * q.T 的结果将是一个 1x1 矩阵,这对于范数函数来说是一个意外的返回类型,总和会将其变成一个标量。
      • 但为什么要使用sum() 转换为标量? np.asscalar 会快几倍`?
      • 我不知道原因,但这就是它在scipy.spatial.distance.euclidean 中的实现方式。我只是假设 scipy 的作者知道什么是最好的
      【解决方案3】:

      如果你想继续使用 scipy 函数,你可以像这样预处理向量。

      def weighted_euclidean(a, b, w):
          A = a*np.sqrt(w)
          B = b*np.sqrt(w)
          return scipy.spatial.distance.euclidean(A, B)
      

      但它看起来比它慢

      def weightedL2(a, b, w):
          q = a-b
          return np.sqrt((w*q*q).sum())
      

      【讨论】:

        猜你喜欢
        • 2013-03-02
        • 2017-01-07
        • 2015-07-15
        • 2014-02-04
        • 1970-01-01
        • 2021-10-01
        • 2012-12-21
        相关资源
        最近更新 更多