根据python中的值计算字典的相关性
Posted
技术标签:
【中文标题】根据python中的值计算字典的相关性【英文标题】:calculate the correlation of dictionaries based on their values in python 【发布时间】:2013-05-18 02:09:05 【问题描述】:我有数千个表,每个表都包含数百个单词,以及它们在第二列中的对应分数。我需要计算每对表的相关性。
所以,我开始阅读每个表格,并将其转换为字典;每个单词都是一个字典键,它的分数就是值。
现在是计算相关性的时候了。我必须提到,不一定所有字典都有相同的键;多一些,少一些;每个字典都应根据其对进行扩展 - 意思是如果该对具有另一个不存在的某个键,则另一个字典应由这些键更新,并且这些键的值应为 0,最终必须计算相关系数.
示例:
dict1 = 'car': 0.1, 'dog':0.3, 'tiger':0.5, 'lion': 0.1, 'fish':0.2
dict2 = 'goat':0.3, 'fish':0.3, 'shark':0.4, 'dog':0.3
所以,dict1 应该看起来像:
dict1.comparable = 'car':0.1, 'goat':0.0 ,'dog':0.3, 'tiger':0.5, 'lion': 0.1, 'fish':'0.2, 'shark':0.0
dict2.comparable = 'car': 0.0, 'goat':0.3, 'dog':0.3, 'fish':0.3, 'shark':0.4, ,'tiger':0, 'lion': 0
然后应该计算它们的值的相关性。
我很欣赏如何根据字典的值有效地计算字典的相似性/相关性。
更新
Here 是一篇解释如何从技术上计算相关系数的帖子。
这是最简单的版本
import numpy
numpy.corrcoef(list1, list2)[0, 1]
但它只适用于“列表”。基本上,我在计算两个字典相对于它们的键的相关系数之后,以一种有效的方式。 (更少的扩展和排序键)
【问题讨论】:
你做了什么来尝试实现这个? 语义索引,也许? 更新后:你到底为什么要使用 Pearson 相关性?你知道极端情况下它可能产生的副作用吗? 【参考方案1】:keys = list(dict1.viewkeys() | dict2.viewkeys())
import numpy
numpy.corrcoef(
[dict1.get(x, 0) for x in keys],
[dict2.get(x, 0) for x in keys])[0, 1]
首先你得到所有的钥匙。不需要排序,但需要去重。将其存储为列表有助于以后以相同的顺序对其进行迭代。
然后你可以创建 numpy 需要的 2 个列表。
【讨论】:
keys = list(dict1.viewkeys() | dict2.viewkeys()) 返回错误,在 python 2.6 上,是否与 keys = set(dict1), keys.union(dict2) 相同?!如果您更新您的帖子,我将不胜感激。 你是对的,viewkeys() 是在 python 2.7 上添加的。使解决方案更轻量级!keys = set(dict1.keys()) | set(dict2.keys())
将是 2.6 答案。 docs.python.org/2/library/stdtypes.html#dict.viewkeys
哇,有趣的是python如何,对键进行排序(或者至少按照关键字以相同的顺序列出两个字典)【参考方案2】:
不要在字典中添加零。这些只是膨胀,并且在计算相似度时会被消除。省略零已经可以为您节省一些时间,如果不是很多时间的话。
然后,要计算相似度,从两者中最短的字典开始。对于最短的每个键,检查该键是否在最长的字典中。这也节省了大量时间,因为循环一个包含 N 个项目的 dict 需要 N 时间,而检查该项目是否在更大的 dict 中只需要 1 次。
如果只是为了计算相似度,请不要创建中间字典。浪费时间和内存。
要最终计算相似度,您可以根据需要尝试余弦度量、欧几里得距离或其他方法。
【讨论】:
我明白您的观点,即排除零更有效,但在统计上并不正确!那些短键,有更多机会获得更高的相关性! 您的评论并不完全正确。在您更新问题之前,我在您指定相似性/相关性的含义之前写了我的答案,这可以是许多不同的东西,包括不需要保持零的指标。这些指标更好地支持稀疏数据,并且效率更高。此外,没有什么是“统计上正确的”......总是存在偏见。以上是关于根据python中的值计算字典的相关性的主要内容,如果未能解决你的问题,请参考以下文章