Как мы можем создать матрицу подобия из словаря? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующий текст:

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

Я хочу создать матрицу подобия для списка значений каждого ключа.например, для ключа a1 я хочу вычислить сходства между (a,b), (a,c) and (b,c), используя метод предположения f.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 и т. д.)

1 Ответ

0 голосов
/ 05 октября 2018

Если 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.]])}

Вместо map(f, iget(... вы также можете использовать itertools.starmap(f, itertools.combinations(v, 2)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...