【发布时间】:2012-07-10 09:41:07
【问题描述】:
如何找到两个向量之间的余弦相似度,并且向量的每个元素都有不同的范围?
例如,每个向量有两个元素V = {v[0], v[1]},如{age, height},其中年龄范围为30-70,身高范围为100cm-200cm,给出两个示例向量v1 = {20, 175}, v2 = {35,192}。
我知道余弦相似度 (sim) 定义为sim = (v1 dot v2 ) / (|v1| * |v2|),其中 dot 是 v1 和 v2 之间的点积,|v|是向量的大小。但这是基于向量 V 中的每个元素具有相同数据范围的假设,当每个元素具有不同范围时不适用,例如我这里使用的情况。
我能想到的一件事是将权重向量 W = {w[0],w[1]} 应用于每个向量 v1,并在此处使用 v2 来规范化向量中的每个元素。
那是
weighted_sim = ( sum (w[i] * v1[i] * v2[i]) ) / sqrt ( (sum (w[i] *v1[i]^2 ) ) * ( sum (w[i] *v2[i]^2 ) ) )
但是我在这里很难算出权重向量 W。
有人可以帮我吗?非常感谢。
【问题讨论】:
-
您不会简单地将两个测量值归一化以位于
[0,1]范围内吗?所以标准化年龄是(real_age-30)/(70-30)?当然,这不是简单的乘法“权重”;我首先计算归一化向量,然后计算向量相似度。 -
感谢您的回答,但归一化取决于数据分布。例如,如果年龄线性分布在 30-40 之间,那么您提到的线性归一化将起作用,否则会在这里产生额外的问题。
-
哦,好吧,你需要比我能提供的更聪明的答案。
-
在这方面,您通过缩放一个或其他维度或两个维度所做的一切将是有效地缩放一个维度,尽管这会改变您的 sim 结果,但不会改变一些基本点,例如如果之前是 1,那么之后会是 1。 iof sim1>sim2 before then it will be after。我不知道你之后用你的 sim 做什么,但你可能会发现这没什么大不了的......
-
谢谢,克里斯。我打算将余弦相似度和欧几里得距离以加权形式组合在一起,以测量两个向量之间的差异。欧几里得距离给出幅度差但不给出角度差。余弦距离在这里有相反的结果。所以我打算在这里以加权形式的距离度量将两者结合在一起。谢谢