首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算加权相似度

计算加权相似度
EN

Stack Overflow用户
提问于 2013-05-23 17:44:42
回答 2查看 7.4K关注 0票数 2

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

就像这样:

代码语言:javascript
运行
复制
        field1  field2  field3  field4
Row 1
Row 2

现在我要比较这两种记录,并计算出它们的相似性。我通过推导余弦相似度来计算每个字段的相似性。

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

代码语言:javascript
运行
复制
field1: 0.12
field2: 0.67
field3: 1.00
field3: 0.93

我现在可以通过平均值来找到总相似性,但问题是:

我想在字段中添加权重,

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-23 17:54:00

很简单,

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

示例

  • 在这个例子中,每个字段都可以被认为具有相同的权重1。 ((0.12 * 1) + (0.67 * 1) + (1.00 * 1) + (0.93 * 1)) /4= 0.68
  • 如果我们想让field2值比其他字段高出2倍 //权重为(1 +2+1+ 1) =5 ((0.12 * 1) + (0.67 * 2) + (1.00 * 1) + (0.93 * 1)) /5= 0.678
  • 如果我们希望字段3有100倍的重量(字段2仍然是2倍) //权重为(1 +2+ 100 + 1) = 104 ((0.12 * 1) + (0.67 * 2) + (1.00 * 100) + (0.93 * 1)) / 104 = 0.9845192307692308

公式

代码语言:javascript
运行
复制
((field1 * field1_weight) + (field2 * field2_weight) + ... + (fieldn * fieldn_weight)) / (field1_weight + field2_weight + ... + fieldn_weight) = weighted_average

分数权

如果以分数作为权重,那么公式的工作原理也是一样的。例如,如果希望第四个字段的权重比其他字段更多地加权150%,则可以将其赋值为1.5

代码语言:javascript
运行
复制
// 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,则最终平均值将是相同的。

进一步阅读

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

票数 10
EN

Stack Overflow用户

发布于 2013-05-23 17:55:21

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

代码语言:javascript
运行
复制
total, totalw = 0, 0
for w,s in weighted_sims :
  total += w*s
  totalw += w
result = total / totalw
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16720549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档