如何从字典中创建相似度矩阵?

2024-03-28 13:09:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我的口述如下:

dic = {a1: [a,b,c], b1:[b,k,l]}.

我想为每个键的值列表创建一个相似性矩阵。例如,对于键a1,我想使用假设方法f计算(a,b), (a,c) and (b,c)之间的相似性。f((a,a)) = 1。我们可以通过创建一个向量并用(a,b), (a,c) and (b,c)之间的相似度值索引它的元素,然后对b重复相同的过程,即(b,a), (b,b), and (b,c)等等。但这并不是必要的,因为(b,a) =(a,b)的相似性。那么如何解决呢?如何创建这样的矩阵? 同样的方法将应用于dic的每个键(即b1等)


Tags: and方法元素列表过程a1矩阵相似性
1条回答
网友
1楼 · 发布于 2024-03-28 13:09:35

如果f很昂贵而且不可矢量化,那么您可以使用np.tri和朋友

>>> import numpy as np
>>> from operator import itemgetter as iget
>>> 
# set up an example
>>> a1, b1 = 'a1', 'b1'
>>> a, b, c, k, l = np.random.randint(0, 10, (5, 3))
>>> dic = {a1: [a,b,c], b1: [b,k,l]}
>>> f = np.dot
>>> 
# do the computation
>>> RES = {}
>>> for k, v in dic.items():
...     N = len(v)
...     res = np.ones((N, N))
...     I, J = np.triu_indices_from(res, 1)
...     res[I, J] = np.fromiter(map(f, iget(*I.tolist())(v), iget(*J.tolist())(v)), float, N*(N-1)//2)
...     np.copyto(res, res.T, where=np.tri(*res.shape, -1, bool))
...     RES[k] = res
... 
# check
>>> RES
{'a1': array([[  1., 108., 122.],
       [108.,   1., 120.],
       [122., 120.,   1.]]), 'b1': array([[ 1., 42., 66.],
       [42.,  1., 20.],
       [66., 20.,  1.]])}

也可以使用itertools.starmap(f, itertools.combinations(v, 2)),而不是map(f, iget(...。你知道吗

相关问题 更多 >