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)
需要计算它们之间的相似性.海明之间的距离v1和v24之间,v1并且v3也是4.但因为我感兴趣的是"1",这是一起针对我的组v2是更为相似,v1那么v3是.
是否有可以在数据中捕获此值的距离指标?
数据代表房屋的占用情况,这就是为什么它对我来说很重要.'1'表示占用,'0'表示未占用.
听起来你需要余弦相似度量:
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] == 1和v2[k] == 1,然后最终总和(因此相似性)增加,否则它不会改变.
您可以使用点积本身,但有时您会希望最终相似度被归一化,例如介于0和1之间.在这种情况下,您可以划分点积v1和v2长度 - |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.
| 归档时间: |
|
| 查看次数: |
8320 次 |
| 最近记录: |