import numpy as np
from scipy.stats import mode
from scipy.spatial.distance import cdist
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import RadiusNeighborsClassifier as skRadiusNeighborsClassifier
class RadiusNeighborsClassifier():
def __init__(self, radius=1.0):
self.radius = radius
def fit(self, X, y):
self._fit_X = X
self.classes_, self._y = np.unique(y, return_inverse=True)
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]
ind = np.array([mode(self._y[n])[0] for n in neigh_ind]).ravel()
return self.classes_[ind]
X, y = load_breast_cancer(return_X_y=True)
X = StandardScaler().fit_transform(X)
clf1 = RadiusNeighborsClassifier(radius=5).fit(X, y)
clf2 = skRadiusNeighborsClassifier(radius=5).fit(X, y)
pred1 = clf1.predict(X)
pred2 = clf2.predict(X)
assert np.array_equal(pred1, pred2)