Матрица расстояний Фребениуса матриц

#python #numpy #matrix

#python #numpy #матрица

Вопрос:

У меня есть два набора матриц Sigma и Sigma_barre (размер: KxDxD), и я пытаюсь вычислить матрицу расстояния Фробениуса (2-норма по матрице) между этими двумя наборами, то есть матрицу M (размер KxK), такую, что

M[ i, j] = расстояние между Sigma[ i] и Sigma_barre[ j]

Я использовал np.linalg.norm, но я не уверен на сто процентов, что он делает то, что я хочу. Вот мой наивный код :

 M = np.zeros((K,K))
for i in range(K):
    for j in range(K):
        M[i,j] = np.linalg.norm(sigma[i]-sigma_barre[j]) 
 

Итак, мой вопрос: знаете ли вы элегантный / эффективный способ вычисления этой матрицы?

Комментарии:

1. Измените форму как в 2D, так и используйте cdist : cdist(sigma.reshape(sigma.shape[0],-1),sigma_barre.reshape(sigma_barre.shape[0],-1)) .

Ответ №1:

Вы можете сделать это за один раз, добавив несколько фиктивных измерений и указав, по какой оси следует производить суммирование.

 M = np.linalg.norm(sigma[:,None] - sigma_barre[None,:], axis=(2,3))
 

Поскольку sigma[:,None] - sigma_barre[None,:] это матрица размером KxKxDxD, это может занимать много памяти в зависимости от того, насколько велики K и D. Если проблема с памятью, ваше решение кажется хорошим, хотя вы можете j начать цикл с i 1 вместо этого, поскольку вы знаете это M[i,j] == M[j,i] и это M[i,i] == 0 .