1

如果我有一个查询向量 A 和一个项目向量 B,如果有人可以指导我如何对向量进行加权/标准化(相同的策略),那就太好了。向量 A 将具有以下组件(property1(二进制)、property2(二进制)、property 3(从范围 0 到 50 的 int)、property4(从范围(0 到 10)

向量 B 将具有相同的属性

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

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

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

请指教,

谢谢

4

1 回答 1

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 执行计算。注意 length(A') = length(B') = sqrt(4) 因为 A' 和 B' 中正好有 4 个。

td/idf 可能不是您最好的选择,但如果您想处理属性 3 和 4 之间的相似性。也就是说,对于 td/idf,属性 3 的值 40 与属性 3 的值 41 不同,并且不同比属性 3 的值 12。但是,41 不被认为比 12 离 40“更远”;它们都是不同的术语。

因此,如果您希望属性 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 之间,则通过除以最大可能距离进行归一化。

于 2014-10-04T22:07:20.907 回答