如何在此用例中使用余弦相似度?

时间:2014-10-04 21:42:59

标签: statistics data-mining recommendation-engine cosine-similarity

如果我有一个查询向量A和一个项目向量B,如果有人可以指导我如何权衡/标准化向量(相同的策略),那将是很好的。 向量A将具有以下组件(property1(二进制),property2(二进制),属性3(int范围为0到50),property4(int from range(0到10)

Vector B具有相同的属性

我知道使用余弦相似性的这两个矢量之间的角度会给出两个矢量之间的距离。我想基于相似性创建推荐。

但是我不清楚在这种情况下如何规范化属性和/或向量,因为它是二进制+ binary_int范围+ int范围。另外,如果我想给一个属性赋予比另一个更高的权重,我该怎么做。我有什么选择。

我在网上找到了与文档相关的余弦相似度的例子,但在这种情况下,向量A和B不是文档,所以在这种情况下我没有使用TF-idf。

请指教,

由于

1 个答案:

答案 0 :(得分:1)

如果要将两个向量之间的传统余弦相似度用于td / idf,则每个项都是向量中的维。也就是说,你需要形成两个新的矢量A'和B'并执行这两者之间的相似性。

这些向量对每个术语都有一个维度,你有65个术语:

property 1: true and false
property 2: true and false
property 3: 0 through 50
property 4: 0 through 10

所以A'和B'将是长度为65的向量,每个元素将为0或1:

A'(0) = 1 if A(0) = true, and 0 otherwise
A'(1) = 1 if A(0) = false, and 0 otherwise
etc.

显然,你可以看到这是低效的。你实际上并不需要计算A'或B'使用余弦相似性与td / idf;你可以假装你计算它们并在A和B上进行计算。注意长度(A')=长度(B')= sqrt(4)因为A'中恰好有4个。和B'。

如果你想在属性3和4中处理相似性,那么

td / idf可能不是你最好的选择。也就是说,使用td / idf,属性3值40不同于属性3值41,不同于属性3的值12.然而,41不被认为是#34;更远的"从40比12;它们都只是不同的术语。

因此,如果您希望属性3和4包含距离(1实际上接近2而50是远2),那么您必须定义距离度量。如果要比属性3和4更多或更少地权衡布尔值,则还必须定义不同的距离度量。如果这些是你想要做的事情,那就忘掉余弦,然后想出一个值。

以下是一个例子:

distance = abs(A.property1 - B.property1) * 5 + 
           abs(A.property2 - B.property2) * 5 + 
           abs(A.property3 - B.property3) / 51 * 1 +
           abs(A.property4 - B.property4) / 10 * 2

然后相似度=(所有距离的最大值) - 距离;

或者,如果你愿意,相似度= 1 /距离。

你可以随心所欲地定义它。如果您需要相似度在0和1之间,则通过除以最大可能距离进行归一化。