python - 找到这些向量之间相似性的最佳方法是什么?

标签 python algorithm computer-science

v1 = [33, 24, 55, 56]
v2 = [32, 25, 51, 40]
v3 = [ ... ]
v4 = [ ... ]

通常,为了找出哪个向量与 v1 最相似,我会使用余弦相似度算法针对其他向量运行 v1。

现在,我有一组更复杂的向量,其结构为:

v1 = [ { 'a': 4, 'b':9, 'c': 12 ... },
       { 'a', 3, 'g':3, 'b': 33 ... },
       { 'b', 1, 'k': 6, 'n': 19 ... },
       ...
     ]
v2 = [ {}, {}, {} ... ]
v3 = [ {}, {}, {} ... ]
v4 = [ {}, {}, {} ... ]

鉴于此结构,您将如何计算相似度? (一个好的匹配应该是一个向量,它有许多与 v1 相似的键,这些键的值与 v1 的值非常相似)

btilly 的回答:

def cosine_sim_complex(v, w):
    '''
    Complex version of cosine similarity
    '''
    def complicated_dot(v, w):
        dot = 0
        for (v_i, w_i) in zip(v, w):
            #{ _, _ }, {_, _}
            for x in v_i:
                if x in w_i:
                    dot += v_i[x] * w_i[x]
        return float(dot)
    length_v = float(complicated_dot(v, v) ** 0.5)
    length_w = float(complicated_dot(w, w) ** 0.5)
    score = complicated_dot(v, w) /  length_v / length_w
    return score


v1 = [ {'a':44, 'b':21 }, { 'a': 55, 'c': 22 } ]
v2 = [ {'a':99, 'b':21 }, { 'a': 55, 'c': 22 } ]
cosine_sim_complex(v1, v2)
1.01342687531

最佳答案

你在更多的维度上做同样的事情。

以前您只有 4 个维度。现在你有一个更大的维度集,带有索引的二维标签。但数学原理是一样的。你有一个像这样未经测试的代码的点积:

def complicated_dot(v, w):
    dot = 0
    for (v_i, w_i) in zip(v, w):
        for x in v_i.iterkeys():
            if x in w_i:
                dot += v_i[x] * w_i[x]
    return dot

然后你可以应用你已经知道的余弦相似度算法。

关于python - 找到这些向量之间相似性的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6678803/

相关文章:

python - pygame 中出现错误 'pygame.surface' 对象不可下标

python - 我想将字符串“random.randint(2,4), 转换为整数

algorithm - 随机一个 512 位整数 N,它不是 2、3 或 5 的倍数

python - 根据条件删除嵌套列表中的列表

python - “模块”对象没有属性 'Serial'

java - 查找加起来等于给定值的数组间隔

java - 图 - 非简单路径,最长路径

algorithm - 哈密​​顿路径 - 当每个顶点只能覆盖一次时,我可以覆盖边缘两次吗?

计算数组中的位数并显示它们,然后将其乘以给定数字

algorithm - 将有序事件序列合并到表中