首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相似距离度量

相似距离度量
EN

Stack Overflow用户
提问于 2013-05-11 19:29:50
回答 5查看 9K关注 0票数 9

像这样的向量

代码语言:javascript
复制
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之间的Hamming距离是4,v1v3之间的距离也是4。但是因为我对“1”中的组感兴趣,所以对我来说,v2v3更像v1

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-11 20:34:47

听起来你需要度量:

代码语言:javascript
复制
similarity = cos(v1, v2) = v1 * v2 / (|v1| |v2|)

其中v1 * v2v1v2之间的点积:

代码语言:javascript
复制
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|。从本质上讲,向量长度是向量与自身的点积的平方根:

代码语言:javascript
复制
|v| = sqrt(v[1]*v[1] + v[2]*v[2] + ... + v[n]*v[n])

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

代码语言:javascript
复制
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

票数 8
EN

Stack Overflow用户

发布于 2013-05-12 21:25:54

实际上有成百上千的距离函数,包括集合的距离度量,如骰子和贾卡德。

你可能想买“距离函数字典”这本书,这本书很不错。

票数 4
EN

Stack Overflow用户

发布于 2016-07-25 21:03:14

情况1:如果序列中的位置是相关的,则:

我建议使用动态时间扭曲距离(DTW)。在时间序列数据的应用中,它被证明是非常有用的。

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

代码语言:javascript
复制
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: 1的位置不相关:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16496618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档