import numpy as np
from scipy.spatial.distance import cdist
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsRegressor as skKNeighborsRegressor
class KNeighborsRegressor():
def __init__(self, n_neighbors=5):
self.n_neighbors = n_neighbors
def fit(self, X, y):
self._fit_X = X
self._y = y
return self
def predict(self, X):
dist_mat = cdist(X, self._fit_X)
neigh_ind = np.argsort(dist_mat, axis=1)[:, :self.n_neighbors]
return np.mean(self._y[neigh_ind], axis=1)
X, y = load_boston(return_X_y=True)
X = StandardScaler().fit_transform(X)
clf1 = KNeighborsRegressor().fit(X, y)
clf2 = skKNeighborsRegressor().fit(X, y)
pred1 = clf1.predict(X)
pred2 = clf2.predict(X)
assert np.allclose(pred1, pred2)