2016-04-20 2 views
0

У меня есть массив векторов, и я хочу построить матрицу, которая покажет мне расстояние между собственным вектором. Например, я получил эту матрицу с этими 2 векторами:Расстояние от массива вектора от его собственного элемента

[[a, b , c] 
[d, e , f]] 

, и я хочу, чтобы получить, что где расстояние является евклидово расстояние, например:

[[dist(vect1,vect1), dist(vect1,vect2)] 
[dist(vect2,vect1), dist(vect2,vect2)]] 

Так obvisously Я ожидаю symetric матрица с нулевым значением по диагонали. Я пытаюсь что-то использовать scikit-learn.

#Create clusters containing the similar vectors from the clustering algo 
labels = db.labels_ 
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) 
list_cluster = [[] for x in range(0,n_clusters_ + 1)] 
for index, label in enumerate(labels): 
    if label == -1: 
     list_cluster[n_clusters_].append(sparse_matrix[index]) 
    else: 
     list_cluster[label].append(sparse_matrix[index]) 
vector_rows = [] 
for cluster in list_cluster: 
    for row in cluster: 
     vector_rows.append(row) 
#Create my array of vectors per cluster order 
sim_matrix = np.array(vector_rows) 
#Build my resulting matrix 
sim_matrix = metrics.pairwise.pairwise_distances(sim_matrix, sim_matrix) 

Проблема в том, что моя результирующая матрица не является симметричной, поэтому я думаю, что в моем коде есть что-то не так.

добавить немного образца, если вы хотите, чтобы проверить, я сделал это с Евклидовым вектором расстояния на вектор:

input_matrix = [[0, 0, 0, 3, 4, 1, 0, 2],[0, 0, 0, 2, 5, 2, 0, 3],[2, 1, 1, 0, 4, 0, 2, 3],[3, 0, 2, 0, 5, 1, 1, 2]] 

expecting_result = [[0, 2, 4.58257569, 4.89897949],[2, 0, 4.35889894, 4.47213595],[4.58257569, 4.35889894, 0, 2.64575131],[4.89897949, 4.47213595, 2.64575131, 0]] 
+1

Как таинственно, ваша окончательная строка определенно выглядит так, как будто она должна возвращать симметричную матрицу ?! можете ли вы включить некоторые данные в свой код, чтобы мы могли запустить и проверить ваш результат? – maxymoo

+0

Я знаю, что этот метод не сработает, но я все еще пытался проверить его так ... Я добавляю пример, если вы этого хотите. – mel

ответ

1

Функция pdist и squareform будет делать трюк:

import numpy as np 
from scipy.spatial.distance import pdist 
from scipy.spatial.distance import squareform 
input_matrix = np.asarray([[0, 0, 0, 3, 4, 1, 0, 2], 
          [0, 0, 0, 2, 5, 2, 0, 3], 
          [2, 1, 1, 0, 4, 0, 2, 3], 
          [3, 0, 2, 0, 5, 1, 1, 2]]) 
result = squareform(pdist(input_matrix)) 
print(result) 

Как и ожидалось, result является симметричной матрицей:

[[ 0.   2.   4.58257569 4.89897949] 
[ 2.   0.   4.35889894 4.47213595] 
[ 4.58257569 4.35889894 0.   2.64575131] 
[ 4.89897949 4.47213595 2.64575131 0.  ]] 

По умолчанию pdist вычисляет эвклидовое расстояние. Вы можете рассчитать другое расстояние, указав правильную метрику в вызове функции. Например:

result = squareform(pdist(input_matrix, metric='jaccard')) 
+0

И я могу изменить расстояние, как jaccard и т. Д.? – mel

Смежные вопросы