2017-03-18 8 views
0

Als Zuweisung muss ich meinen eigenen kNN-Klassifikator erstellen, ohne For-Schleifen verwenden zu müssen. Ich habe es geschafft, scipy.spatial.KDTree zu verwenden, um die nächste (n) Nachbar (e) von jedem Vektor in dem Testsatz zu finden, und dann benutze ich scipy.stats.mode, um die Liste der vorhergesagten Klassen zurückzugeben. Dies dauert jedoch extrem lange, wenn die Größe des Sets sehr groß ist. Zum Beispiel habe ich das folgende Beispiel durch this pageVerbesserung der Performance (Geschwindigkeit) des kNN-Klassifikators

import numpy as np 
from sklearn.model_selection import train_test_split 
from scipy import spatial 
from scipy.stats import mode 

def predict(X_test): 
    X = Y_train[tree.query(X_test, k=k)[1]] 
    Y = mode(X, axis=-1)[0].T[0] 
    return Y 

def load_data(): 
    x1 = 1.5 * np.random.randn(100) + 1 
    y1 = 1.5 * np.random.randn(100) + 2 
    x2 = 1.5 * np.random.randn(100) + 3 
    y2 = 1.5 * np.random.randn(100) + 4 
    X = np.vstack((np.hstack((x1,x2)),np.hstack((y1,y2)))).T 
    y = 1.0*np.hstack((np.zeros(100), np.ones(100))) 
    return X, y 

if __name__ == '__main__': 
    X, y = load_data() 
    X_train, X_test, Y_train, Y_test = train_test_split(X, y) 

    k = 7 
    Z = predict(np.c_[xx.ravel(), yy.ravel()]) 
    Z = Z.reshape(xx.shape) 

inspiriert erstellt Dieser Vorgang dauert sehr lange (40-60 Sekunden!) Wegen des X = Y_train[tree.query(X_test, k=k)[1]] Teils. Gibt es eine Möglichkeit, die Geschwindigkeit von diese spezifische Implementierung zu verbessern, oder sollte ich an eine andere Möglichkeit denken, es zu tun? Zum Beispiel dauert die Implementierung sklearn nur 0,4 Sekunden, was im Vergleich zu meiner Implementierung wahnsinnig schnell ist.

Antwort

2

Hatte einen Code ein paar Mal gelesen, aber dann habe ich gesehen, Sie verwenden KDTree und nicht cKDTree. Letzteres ist in Cython (anstelle von python und numpy) implementiert und sollte Ihnen eine ordentliche Beschleunigung bringen.

Verwandte Themen