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 RadiusNeighborsRegressor as skRadiusNeighborsRegressor
class RadiusNeighborsRegressor():
def __init__(self, radius=1.0):
self.radius = radius
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.where(d <= self.radius)[0] for d in dist_mat]
return np.array([np.mean(self._y[n]) for n in neigh_ind])
X, y = load_boston(return_X_y=True)
X = StandardScaler().fit_transform(X)
clf1 = RadiusNeighborsRegressor(radius=5).fit(X, y)
clf2 = skRadiusNeighborsRegressor(radius=5).fit(X, y)
pred1 = clf1.predict(X)
pred2 = clf2.predict(X)
assert np.allclose(pred1, pred2)