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.