Вы задали два вопроса, один несколько открытый (первый) и другой, который имеет окончательный ответ, поэтому я начну со второго:
Есть ли уже преобразование?доступно, что принимает в качестве входных данных матрицу, подобную M, и производит матрицу, подобную C?Предпочтительно пакет python?
Ответ - да, есть один пакет с именем scipy.spatial.distance , который содержит функцию, которая принимает матрицу типа M
и производитматрица типа C
.В следующем примере показана функция:
import numpy as np
from scipy.spatial.distance import pdist, squareform
# initial data
M = [[18, 34, 54, 65],
[18, 12, 54, 65],
[21, 43, 55, 78]]
# convert to numpy array
arr = np.array(M)
result = squareform(pdist(M, metric='euclidean'))
print(result)
Выход
[[ 0. 22. 16.1245155 ]
[22. 0. 33.76388603]
[16.1245155 33.76388603 0. ]]
Как видно из приведенного выше примера, pdist принимаетM
матрица и генерирует матрицу C
.Обратите внимание, что вывод pdist
представляет собой матрицу сжатых расстояний , поэтому вам необходимо преобразовать ее в квадратную форму, используя squareform .Теперь перейдем ко второму вопросу:
Что является хорошим выбором для сравнения порядка двух списков?То есть, что является хорошим выбором для функции f?
Учитывая, что порядок имеет значение в вашем конкретном случае, я предлагаю вам взглянуть на коэффициенты ранговой корреляции, такие как: Kendall или Spearman , оба представлены в пакете scipy.stats вместе с целым рядом других коэффициентов.Пример использования:
import numpy as np
from scipy.spatial.distance import pdist, squareform
from scipy.stats import kendalltau, spearmanr
# distance function
kendall = lambda x, y : kendalltau(x, y)[0]
spearman = lambda x, y : spearmanr(x, y)[0]
# initial data
M = [[18, 34, 54, 65],
[18, 12, 54, 65],
[21, 43, 55, 78]]
# convert to numpy array
arr = np.array(M)
# compute kendall C and convert to square form
kendall_result = 1 - squareform(pdist(arr, kendall)) # subtract 1 because you want a similarity
print(kendall_result)
print()
# compute spearman C and convert to square form
spearman_result = 1 - squareform(pdist(arr, spearman)) # subtract 1 because you want a similarity
print(spearman_result)
print()
Выход
[[1. 0.33333333 0. ]
[0.33333333 1. 0.33333333]
[0. 0.33333333 1. ]]
[[1. 0.2 0. ]
[0.2 1. 0.2]
[0. 0.2 1. ]]
Если они не соответствуют вашим потребностям, вы можете взглянуть на расстояние Хэмминга Например:
import numpy as np
from scipy.spatial.distance import pdist, squareform
# initial data
M = [[18, 34, 54, 65],
[18, 12, 54, 65],
[21, 43, 55, 78]]
# convert to numpy array
arr = np.array(M)
# compute match_rank C and convert to square form
result = 1 - squareform(pdist(arr, 'hamming'))
print(result)
Вывод
[[1. 0.75 0. ]
[0.75 1. 0. ]
[0. 0. 1. ]]
В конце концов выбор функции подобия будет зависеть от вашего конечного приложения, поэтому вам потребуетсяПопробуйте различные функции и посмотрите те, которые соответствуют вашим потребностям.И scipy.spatial.distance
, и scipy.stats
предоставляют множество функций расстояния и коэффициентов, которые вы можете попробовать.
Далее
- Следующая бумага содержит раздел о сходстве списков