Last active
March 22, 2024 12:31
-
-
Save nikolasrieble/8bd3a83e14c0b2fa66bfa2ddd8828717 to your computer and use it in GitHub Desktop.
KNN classification with custom metric (DTW Distance)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
from scipy.spatial import distance | |
from sklearn.model_selection import train_test_split | |
from sklearn.neighbors import KNeighborsClassifier | |
from sklearn.model_selection import GridSearchCV | |
from sklearn.metrics import classification_report | |
#toy dataset | |
X = np.random.random((100,10)) | |
y = np.random.randint(0,2, (100)) | |
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) | |
#custom metric | |
def DTW(a, b): | |
an = a.size | |
bn = b.size | |
pointwise_distance = distance.cdist(a.reshape(-1,1),b.reshape(-1,1)) | |
cumdist = np.matrix(np.ones((an+1,bn+1)) * np.inf) | |
cumdist[0,0] = 0 | |
for ai in range(an): | |
for bi in range(bn): | |
minimum_cost = np.min([cumdist[ai, bi+1], | |
cumdist[ai+1, bi], | |
cumdist[ai, bi]]) | |
cumdist[ai+1, bi+1] = pointwise_distance[ai,bi] + minimum_cost | |
return cumdist[an, bn] | |
#train | |
parameters = {'n_neighbors':[2, 4, 8]} | |
clf = GridSearchCV(KNeighborsClassifier(metric =DTW), parameters, cv=5) | |
clf.fit(X_train, y_train) | |
#evaluate | |
y_pred = clf.predict(X_test) | |
print(classification_report(y_test, y_pred)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment