【问题标题】:Similarity distance measures相似距离度量
【发布时间】:2013-05-05 23:39:20
【问题描述】:

这样的向量

v1 = {0 0 0 1 1 0 0 1 0 1 1}
v2 = {0 1 1 1 1 1 0 1 0 1 0}
v3 = {0 0 0 0 0 0 0 0 0 0 1}

需要计算它们之间的相似度。 v1v2 之间的汉明距离是 4,v1v3 之间的汉明距离也是 4。但是因为我对组合在一起的“1”组感兴趣 v2 更类似于v1 然后是v3

是否有任何距离指标可以在数据中捕捉到这一点?

这些数据及时代表了房屋的入住率,这就是为什么它对我很重要。 '1' 表示占用,'0' 表示未占用。

【问题讨论】:

  • 那么问题是什么?
  • 抱歉,已经编辑过了,如果有任何距离指标可以捕捉到这一点
  • I am interested in the groups of '1' which are together。你能解释一下你的意思吗?由于组的数量相同,1 和 2 更相似?
  • 好吧,基本上是的,1 和 2 更相似,有相同数量的组。因为v2 基本上是矢量v1,只有'1' 的first group 是“更宽”。 V3 几乎是空向量

标签: vector data-mining similarity hamming-distance


【解决方案1】:

有一个网站介绍了各种向量相似度方法

http://dataaspirant.com/2015/04/11/five-most-popular-similarity-measures-implementation-in-python/

我认为它会帮助你决定你应该使用什么相似度

.

.

简单解释一下上面的链接,向量之间有五种流行的相似度度量

  1. 欧几里得距离 - 就是向量之间的绝对距离

  2. 余弦 - 向量之间的余弦度(θ)差

  3. 曼哈顿——它们的笛卡尔坐标的绝对差之和,例如,

在一个平面上,p1 在 (x1, y1),p2 在 (x2, y2)。曼哈顿距离 = |x1 – x2| + |y1 – y2|

  1. Minkowski - 欧几里得距离和曼哈顿距离的广义度量形式

  2. Jaccard - 对象之间的相似性。因此,一组中的每个特征都将与另一组进行比较并找出其差异

.

使用上面的关键字,您可以谷歌以获得进一步的解释。 希望对你有帮助

【讨论】:

    【解决方案2】:

    听起来你需要cosine similarity 措施:

    similarity = cos(v1, v2) = v1 * v2 / (|v1| |v2|)
    

    其中v1 * v2v1v2 之间的点积:

    v1 * v2 = v1[1]*v2[1] + v1[2]*v2[2] + ... + v1[n]*v2[n]
    

    本质上,点积显示两个向量中有多少元素在同一位置具有 1:如果 v1[k] == 1v2[k] == 1,则最终总和(因此相似性)增加,否则不会改变。

    您可以使用点积本身,但有时您希望将最终相似度归一化,例如介于 0 和 1 之间。在这种情况下,您可以将 v1v2 的点积除以它们的长度 - |v1||v2|。本质上,向量长度是向量与自身点积的平方根:

    |v| = sqrt(v[1]*v[1] + v[2]*v[2] + ... + v[n]*v[n])
    

    有了所有这些,就很容易实现余弦距离如下(Python中的示例):

    from math import sqrt
    
    def dot(v1, v2):
        return sum(x*y for x, y in zip(v1, v2))
    
    def length(v):
        return sqrt(dot(v, v))
    
    def sim(v1, v2): 
        return dot(v1, v2) / (length(v1) * length(v2))
    

    请注意,我描述的是相似性(两个向量之间的距离接近),而不是距离(它们之间的距离)。如果您需要精确的距离,您可以将其计算为dist = 1 / sim

    【讨论】:

    • 我认为应该是dist = 1 - sim 而不是1 / sim
    • @ThalisK.:两者都可以。这个想法是距离在某种意义上是相似度的倒数,因此任何逆(严格单​​调)函数都应该起作用,您可以根据您对“距离”的具体解释来选择具体函数。
    • 谢谢。这就说得通了。如果您再看看这个问题,我将不胜感激:stackoverflow.com/questions/25181104/…
    • 如果我有三个以上的向量,比如我想检查 v4 与 v1、v2 和 v3 是否不同,我可以应用你的答案吗?
    • 余弦相似度是一个成对的距离度量,所以你可以将它用于任意数量的向量,只要你考虑它们的对(例如v4 vs v1, v4 vs v2 , 等等。)。如果您想要一个同时使用 3 个或更多向量的度量,您应该更具体地了解该度量的理想属性。例如。您可能想要v4v1v2v3 的平均距离,这就像(dist(v4, v1) + dist(v4, v2) + dist(v4, v3)) / 3 一样简单。所以这一切都取决于你到底想要实现什么。
    【解决方案3】:

    案例1:如果系列中的位置相关,那么:

    我推荐动态时间规整距离 (DTW)。在时间序列数据的应用中,它已被证明非常有用。

    为了检查它是否可以应用于您的问题,我使用了这里提供的代码:https://jeremykun.com/2012/07/25/dynamic-time-warping/

    d13 = dynamicTimeWarp(v1,v3)
    d12 = dynamicTimeWarp(v1,v2)
    d23 = dynamicTimeWarp(v2,v3)
    
    d23,d12,d13
    (3, 1, 3)
    

    如您所见,d12 最低,因此 v1 和 v2 最相似。 DTW 的更多信息可以在这个论坛的任何地方找到,对于研究论文,我推荐Eamonn Keogh

    案例2:位置不相关:

    我只是同意 Deepu 将平均值作为一个特征。

    【讨论】:

      【解决方案4】:

      实际上有数百个距离函数,包括集合的距离度量,例如 Dice 和 Jaccard。

      你可能想要《距离函数词典》这本书,很不错。

      【讨论】:

      • 查了标题,没找到。请您提供作者、isbn、确切的标题吗?
      • Google 图书上的第一个结果。国际标准书号:9780080465548
      • 这本书是一个很好的参考。已更新并更名为距离百科全书:link.springer.com/book/10.1007/978-3-662-52844-0
      【解决方案5】:

      我认为您可以简单地取每组中的值的平均值。例如,v1 的平均值为 0.4545v2 的平均值为 0.6363v3 的平均值为 0.0909。如果集合中唯一可能的值是 0 和 1,那么具有相等或几乎相等值的集合将满足您的目的。

      【讨论】:

      • 这实际上是个好主意,但我遇到的问题是我必须以某种方式将这两个指标混合在一起。因为向量0 0 1 1 1 1 0 0 的平均回报率是0,5 和我的指标4,它们都被取代了。是否有可能以某种方式将这两个指标结合起来,每个指标都产生最终值的一半?还是这太不可预测了?
      • 标准差怎么样?会有帮助吗?
      • 在某种程度上我猜它下面的分布是否是高斯分布。但如果我再次以0 0 1 1 1 1 0 0 为例,std 将得到相同的结果。我知道你的意思,但是我必须首先对它进行聚类,然后再比较每个聚类的平均值和标准值。但是,如果这样一个复杂的解决方案产生了显着的不同。
      猜你喜欢
      • 2012-05-01
      • 2016-01-01
      • 2015-05-31
      • 2012-07-25
      • 2020-03-05
      • 2016-10-12
      • 2014-02-25
      • 2010-10-31
      • 2018-04-20
      相关资源
      最近更新 更多