Мне нужно вычислить дисперсию в совокупности (массиве) перестановок, т.е.
Скажем, у меня есть этот массив перестановок:
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: я определяю расстояние между двумя перестановками по метрике Кендаллтау
Например, как бы вы математически определили разницу между [1,3,4]
и [2,5,6]
?
@loaTzimas Привет, я только что обновил свой код.
Спасибо за обновление. Итак, вы хотите рассчитать расстояние для всех возможных пар внутри списка?
Привет @ ailauli69, не могли бы вы уточнить, что вы хотите вычислить расстояние между? не совсем понятно? не могли бы вы привести пример?
Здравствуйте, я упомянул, как вычисляю расстояние между двумя элементами, потому что подумал, что это полезно для вычисления дисперсии. Мне нужно вычислить дисперсию генеральной совокупности
Я не уверен, что это математический результат, который вы ищете. Вы можете использовать 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
Можете ли вы привести пример того, что вы подразумеваете под «насколько далеки эти перестановки друг от друга»?