像这样的矢量
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
之间的汉明距离是4,v1
和v3
之间的汉明距离也是4.但是因为我对'1'的组合感兴趣v2
与v1
更为相似,然后是v3
。
是否有可以在数据中捕获此值的距离指标?
数据代表房屋的入住率,这就是为什么它对我很重要。 “1”表示占用,“0”表示未占用。
答案 0 :(得分:8)
听起来你需要cosine similarity衡量标准:
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
,则最终总和(因此相似性)增加,否则不是改变。
您可以使用点积本身,但有时您会希望将最终相似度归一化,例如在这种情况下,您可以将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
。
答案 1 :(得分:4)
有数百种距离函数,包括集的距离度量,例如Dice和Jaccard。
你可能想要获得“距离函数词典”这本书,这很不错。
答案 2 :(得分:1)
案例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将平均值作为一项功能。
答案 3 :(得分:0)
我认为你可以简单地取每组中的平均值。例如,v1
此处的平均值 0.4545 ,v2
的平均值 0.6363 ,v3
的平均值 0.0909 即可。如果集合中唯一可能的值为0和1,则具有相等或几乎相等值的集合将满足您的目的。
答案 4 :(得分:-1)
有一个网站介绍了各种类型的矢量相似性方法
http://dataaspirant.com/2015/04/11/five-most-popular-similarity-measures-implementation-in-python/
我认为它可以帮助您确定应该使用的相似性
简要说明上述链接,矢量之间有五种流行的相似性度量
欧几里德距离 - 仅仅是向量之间的绝对距离
余弦 - 矢量之间的余弦度(θ)差异
曼哈顿 - 笛卡尔坐标的绝对差值之和,例如,
在p1位于(x1,y1)且p2位于(x2,y2)的平面中。曼哈顿距离 = | x1 - x2 | + | y1 - y2 |
Minkowski - 欧几里德距离和曼哈顿距离的广义度量形式
Jaccard - 对象之间的相似性。因此,一组中的每个特征将与另一组进行比较并找出其差异
使用上面的关键字,您可以谷歌进一步解释。 希望它能帮到你