像这样的向量
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}需要计算它们之间的相似度。v1和v2之间的Hamming距离是4,v1和v3之间的距离也是4。但是因为我对“1”中的组感兴趣,所以对我来说,v2比v3更像v1。
是否有任何距离度量可以在数据中捕捉到这一点?
这些数据代表了房屋的入住率,这就是为什么它对我来说很重要。'1‘表示已占用,'0’表示未占用。
发布于 2013-05-11 20:34:47
听起来你需要度量:
similarity = cos(v1, v2) = v1 * v2 / (|v1| |v2|)其中v1 * v2是v1和v2之间的点积:
v1 * v2 = v1[1]*v2[1] + v1[2]*v2[2] + ... + v1[n]*v2[n]本质上,点积表示两个向量中有多少个元素在同一位置有1:如果v1[k] == 1和v2[k] == 1,则最终和(以及相似度)增加,否则不变。
您可以使用点积本身,但有时您可能希望对最终相似度进行标准化,例如,在0和1之间。在这种情况下,您可以将v1和v2的点积除以它们的长度- |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。
发布于 2013-05-12 21:25:54
实际上有成百上千的距离函数,包括集合的距离度量,如骰子和贾卡德。
你可能想买“距离函数字典”这本书,这本书很不错。
发布于 2016-07-25 21:03:14
情况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: 1的位置不相关:
我只是同意Deepu将平均值作为一个特征。
https://stackoverflow.com/questions/16496618
复制相似问题