2015-09-07 13 views
8

Se ti viene dato un elenco di 10 vettori, chiamati A che rappresentano gruppi diversi. Quindi hai una serie temporale di vettori v1, v2, ..., vn, essendo ciascuno un vettore. Mi chiedevo se c'era un modo per trovare il vettore "più vicino" in A per ogni v1, v2, ..., vn se si definisce una metrica di distanza?Trova il vettore più vicino da un elenco di vettori | Python

Esiste un modo rapido per eseguire questa operazione oltre al collegamento e al confronto di tutte le voci?

Modifica: No, non sto chiedendo come si fa k-means o qualcosa del genere.

+1

possibile duplicato di [Come classificare i dati con l'algoritmo più vicino-vicino usando Python?] (Http://stackoverflow.com/questions/7326958/how-can-i-classify-data-with-the-nearest -neighbor-algorithm-using-python) – Sneftel

risposta

12

È possibile utilizzare il spatial KDtree in scipy. Utilizza un algoritmo ad albero veloce per identificare punti per punti per vettori di dimensione arbitraria.

Modifica: scusate, se siete alla ricerca di arbitrary distance metrics, una struttura ad albero potrebbe essere ancora un'opzione.

Ecco un esempio:

>>> from scipy import spatial 
>>> A = [[0,1,2,3,4], [4,3,2,1,0], [2,5,3,7,1], [1,0,1,0,1]] 
>>> tree = spatial.KDTree(A) 

Questo imposta la KDTree con tutti i punti in A, che consente di effettuare ricerche spaziali veloci all'interno di esso. Tale query richiede un vettore e restituisce il vicino più prossimo in A per esso:

>>> tree.query([0.5,0.5,0.5,0.5,0.5]) 
(1.1180339887498949, 3) 

Il primo valore di ritorno è la distanza del vicino più prossimo e la seconda la sua posizione in A, in modo tale che è possibile ottenere per esempio come questo:

>>> A[ tree.query([0.5,0.5,0.5,0.5,0.5])[1] ] 
[1, 0, 1, 0, 1] 
+0

Hmm vedo. Quindi dovrei nutrire la mia matrice A che ha il "10 diversi vettori (gruppi)" per il KDTree. Quindi faccio semplicemente scorrere tutta la mia intera serie di interessi e faccio tree.query (data [i])? L'ho provato e l'output non è molto intuitivo e la documentazione per questo metodo era molto carente ... – ajl123

+0

Sì, anche se potevi distribuire tutti i punti contemporaneamente. Per query predefinita restituisce il vettore più vicino in A a quello specificato. E restituisce la distanza a quel vettore e la posizione del vettore più vicino in A. – haraldkl

1

Se si definisce una metrica, è possibile utilizzarlo nella funzione min:

closest = min(A, key=distance) 
+0

molto pulito, ma suona come OP sta chiedendo un modo veloce di trovare il vettore più vicino all'interno di A a * ogni * vettore in A se – lemonhead

1

Così alcuni esempi di codice è:

# build a KD-tree to compare to some array of vectors 'centall' 
tree = scipy.spatial.KDTree(centall) 
print 'shape of tree is ', tree.data.shape 

# loop through different regions and identify any clusters that belong to a different region 
[d1, i1] = tree.query(group1) 
[d2, i2] = tree.query(group2) 

questo restituisce le variabili d e i. d memorizza la distanza più vicina restituisco l'indice in cui ciò accade

Spero che questo aiuti.

Problemi correlati