【问题标题】:Calculating a weighted similarity计算加权相似度
【发布时间】:2019-04-13 04:46:12
【问题描述】:

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

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

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    简单,

    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,则最终平均值将相同。

    进一步阅读

    wikipedia: Weighted arithmetic mean

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        相关资源
        最近更新 更多