我有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的相似性将对平均相似度有显着贡献。
您能否建议一个公式或算法来满足这样的要求?
答案 0 :(得分:10)
简单,
在该示例中,可以认为每个字段具有相等的权重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,则最终平均值将相同。
答案 1 :(得分:1)
您只想找到加权平均值。将每个相似度乘以权重,然后将产品加在一起,最后除以权重之和得到平均值:
total, totalw = 0, 0
for w,s in weighted_sims :
total += w*s
totalw += w
result = total / totalw