Как измерить дисперсию совокупности перестановок?

Мне нужно вычислить дисперсию в совокупности (массиве) перестановок, т.е.

Скажем, у меня есть этот массив перестановок:

import numpy as np
import scipy.stats as stats


a = np.matrix([[1,2,3,4,5,6], [2,3,4,6,1,5], [6,3,1,2,5,4]])

# distance between a[0] and a[1]
distance = stats.kendalltau(a[0], a[1])[0]

Итак, как вычислить (в Python) дисперсию этого массива, т. е. как измерить, насколько далеко эти перестановки друг от друга?

С уважением

Аймерик

p.s: я определяю расстояние между двумя перестановками по метрике Кендаллтау

Можете ли вы привести пример того, что вы подразумеваете под «насколько далеки эти перестановки друг от друга»?

IoaTzimas 22.12.2020 13:23

Например, как бы вы математически определили разницу между [1,3,4] и [2,5,6]?

IoaTzimas 22.12.2020 13:31

@loaTzimas Привет, я только что обновил свой код.

ailauli69 22.12.2020 13:34

Спасибо за обновление. Итак, вы хотите рассчитать расстояние для всех возможных пар внутри списка?

IoaTzimas 22.12.2020 13:41

Привет @ ailauli69, не могли бы вы уточнить, что вы хотите вычислить расстояние между? не совсем понятно? не могли бы вы привести пример?

Akshay Sehgal 22.12.2020 13:42

Здравствуйте, я упомянул, как вычисляю расстояние между двумя элементами, потому что подумал, что это полезно для вычисления дисперсии. Мне нужно вычислить дисперсию генеральной совокупности

ailauli69 22.12.2020 13:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не уверен, что это математический результат, который вы ищете. Вы можете использовать stats.kendalltau, чтобы вычислить расстояние для всех возможных пар, а затем взять дисперсию из этого результирующего вектора.

Чтобы получить вектор расстояний, я перебираю заархивированный список (a, a-shifted), используя np.roll:

dist = []
for x1, x2 in zip(a, np.roll(a, shift=1, axis=0)):
    dist.append(kendalltau(x1, x2)[0])

Чтобы взять дисперсию всех расстояний:

np.std(dist)

Или если вы ищете дисперсию как ( обсуждается здесь) затем возьмите норму вектора расстояния:

np.linalg.norm(dist)

Обратите внимание, что я использую a, как определено с np.array, а не np.matrix:

a = np.array([[1,2,3,4,5,6], [2,3,4,6,1,5], [6,3,1,2,5,4]])

Я предполагаю, что вы ищете что-то, что транслирует функцию kendalltau по каждому из 3 массивов и переставляет их. Результатом в этом случае будет матрица 3x3. Однако я не уверен, что вы ищете, когда говорите, что хотите дисперсию. Уточните в комментариях, и я соответствующим образом обновлю свой ответ. Надеюсь это поможет -

a = np.array([[1,2,3,4,5,6], [2,3,4,6,1,5], [6,3,1,2,5,4]])

def f(a,b):
    return np.array(stats.kendalltau(a,b)[0])

vf = np.vectorize(f, signature='(m),(m)->()')

out = vf(a[:,None,:],a[None,:,:])
print(out)
array([[ 1.        ,  0.33333333, -0.06666667],
       [ 0.33333333,  1.        , -0.46666667],
       [-0.06666667, -0.46666667,  1.        ]])

Итак, как вычислить (в Python) дисперсию этого массива, т. е. как измерить, насколько далеко эти перестановки друг от друга?

IIUC, если вы пытаетесь рассчитать kendalltau расстояния между каждой из комбинаций, а затем проверить стандартное отклонение между расстояниями, вы можете отфильтровать нашу нижнюю треугольную матрицу (без диагонали), используя np.tril_indices(k=-1), а затем получить 3 значения, чтобы получить np.std

np.std(out[np.tril_indices(out.shape[0], k=-1)])
0.3265986323710904

Другие вопросы по теме