相似距离测量

8 vector similarity data-mining hamming-distance

像这样的矢量

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}
Run Code Online (Sandbox Code Playgroud)

需要计算它们之间的相似性.海明之间的距离v1v24之间,v1并且v3也是4.但因为我感兴趣的是"1",这是一起针对我的组v2是更为相似,v1那么v3是.

是否有可以在数据中捕获此值的距离指标?

数据代表房屋的占用情况,这就是为什么它对我来说很重要.'1'表示占用,'0'表示未占用.

ffr*_*end 8

听起来你需要余弦相似度量:

similarity = cos(v1, v2) = v1 * v2 / (|v1| |v2|)
Run Code Online (Sandbox Code Playgroud)

在和v1 * v2之间的点积是什么?v1v2

v1 * v2 = v1[1]*v2[1] + v1[2]*v2[2] + ... + v1[n]*v2[n]
Run Code Online (Sandbox Code Playgroud)

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

您可以使用点积本身,但有时您会希望最终相似度被归一化,例如介于0和1之间.在这种情况下,您可以划分点积v1v2长度 - |v1||v2|.从本质上讲,矢量长度是矢量与其自身的点积的平方根:

|v| = sqrt(v[1]*v[1] + v[2]*v[2] + ... + v[n]*v[n])
Run Code Online (Sandbox Code Playgroud)

拥有所有这些,很容易实现余弦距离如下(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))
Run Code Online (Sandbox Code Playgroud)

注意,我描述了相似性(两个矢量彼此接近多少),而不是距离(它们有多远).如果您需要精确距离,则可以将其计算为dist = 1 / sim.