计算加权相似度

时间:2013-05-23 17:44:42

标签: algorithm

我有2个数据行,每个都有4个字段

类似的东西:

        field1  field2  field3  field4
Row 1
Row 2

现在我必须比较这两个记录并计算相似性。我通过推导余弦相似度来计算每个场的相似性。

所以我最终得到了类似的相似之处: (0代表一周的相似性,1代表强烈的相似性)

field1: 0.12
field2: 0.67
field3: 1.00
field3: 0.93

我现在可以通过平均值找到总相似度,但问题是:
我想在字段中添加权重

因此,如果field2的权重高于field1,那么field2的相似性将对平均相似度有显着贡献。

您能否建议一个公式或算法来满足这样的要求?

2 个答案:

答案 0 :(得分:10)

简单,

  1. 将4个值中的每一个乘以它们的重量
  2. 将结果添加到一起
  3. 除以权重之和
  4. 实施例

    • 在该示例中,可以认为每个字段具有相等的权重1

      ((0.12 * 1) + (0.67 * 1) + (1.00 * 1) + (0.93 * 1)) / 4 = 0.68
      
    • 现在,如果我们想让field2比其他字段贵2倍

      // Weights are (1 + 2 + 1 + 1) = 5
      ((0.12 * 1) + (0.67 * 2) + (1.00 * 1) + (0.93 * 1)) / 5 = 0.678
      
    • 如果我们希望字段3具有100倍的权重(字段2仍然是2x)

      // Weights are (1 + 2 + 100 + 1) = 104
      ((0.12 * 1) + (0.67 * 2) + (1.00 * 100) + (0.93 * 1)) / 104 = 0.9845192307692308
      

    ((field1 * field1_weight) + (field2 * field2_weight) + ... + (fieldn * fieldn_weight)) / (field1_weight + field2_weight + ... + fieldn_weight) = weighted_average
    

    分数权重

    如果您将分数作为权重,则公式的工作原理相同。例如,如果您希望第4个字段的权重加权150%,那么您可以为其他字段分配权重1.5

    // Weights are (1 + 1 + 1 + 1.5) = 4.5
    ((0.12 * 1) + (0.67 * 1) + (1.00 * 1) + (0.93 * 1.5)) / 4.5 = 0.7077777777777778
    

    权重是相对的

    您不需要从设置为1的每个权重开始,如果您愿意,可以使用100或1000.

    例如,如果所有4个字段的权重均为100,则如果它们全部为1,则最终平均值将相同。

    进一步阅读

    wikipedia: Weighted arithmetic mean

答案 1 :(得分:1)

您只想找到加权平均值。将每个相似度乘以权重,然后将产品加在一起,最后除以权重之和得到平均值:

total, totalw = 0, 0
for w,s in weighted_sims :
  total += w*s
  totalw += w
result = total / totalw