如果您想对 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 之间,则通过除以最大可能距离进行归一化。