2

我有 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 的相似度将对平均相似度有显着的贡献。

你能推荐一个公式或算法来满足这样的要求吗?

4

2 回答 2

10

简单的,

  1. 将 4 个值中的每一个乘以它们的权重
  2. 将结果加在一起
  3. 除以权重的总和

例子

  • 在示例中,可以认为每个字段的权重都为 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,则最终平均值将相同。

进一步阅读

维基百科:加权算术平均值

于 2013-05-23T17:54:00.983 回答
1

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

total, totalw = 0, 0
for w,s in weighted_sims :
  total += w*s
  totalw += w
result = total / totalw
于 2013-05-23T17:55:21.053 回答