Машина учится больше всего, это черная техника. Это означает, что входы и выходы известны, но процесс не полностью понятен. Тем не менее, я думаю, что для большинства классических алгоритмов это не должно быть так. Эта кусок стремится помочь вам научиться реализовывать k ближайшего соседнего алгоритма в Python.
Принцип, стоящий за ближайшими методами соседей, в целом, состоит в том, чтобы найти заранее определенное количество образцов тренировок, ближайших к расстоянию до новой точки, и предсказывает этикетку от них. Количество образцов в этом случае является определенной пользователем постоянной.
Несмотря на свою простоту, ближайшие соседние методы были успешными в большом количестве задач классификации и регрессии, включая рукописные цифры и сцены спутникового изображения.
Оптимальный выбор значения «k» зависит от данных, но в целом большее значение подавляет эффекты шума, но делает границы классификации менее отличительной. Достаточно разговоров, давайте начнем …
import numpy as np
from scipy.spatial.distance import euclidean
from sklearn.base import BaseEstimator
class KNNBase(BaseEstimator):
...
Во-первых, мы импортируем соответствующие модули, которые являются numpy , евклид и Базовый . Евклидова Определяет, как рассчитано расстояние во время BaseEstimator Является ли базовый класс для всех оценщиков в Sklearn.
Кннбаз Таким образом, класс принимает этот класс как его родитель и наследует его методы. Это затем становится базовым классом для K ближайших соседей классификатора и регресса.
class KNNBase(BaseEstimator):
def __init__(self, n_neighbors = 5, distance_func = euclidean):
self.n_neighbours = n_neighbors
self.distance_func = euclidean
def _fit(self, X, Y):
self.X = X
self.Y = Y
return self
Класс KNNBASE инициализируется в __init__ Способ с 2 параметрами, а именно количество соседей и функции расстояния. Первый обозначает количество соседей и определяет прогноз для определенной точки данных, когда последний определяет, как рассчитывается расстояние.
Значения по умолчанию принимаются как 5 для n_neighbors и евклидова для divell_func (Любая функция из Scipy.spatial.distance. сделаю для divell_func ).
_fit Метод принимает в тренировках Х и цели Y и хранит их как переменные экземпляра. Затем он возвращает обновленный экземпляр через Я Отказ
def _vote(self, neighbors_targets):
raise NotImplementedError()
def _predict(self, X_test):
Y_pred = np.empty(X_test.shape[0])
for index, entry in enumerate(X_test):
distances = [self.distance_func(i, entry) for i in self.X]
neighbors = np.argsort(distances)[: self.n_neighbors]
neighbors_prediction = [self.Y[j] for j in neighbors]
Y_pred[index] = self._vote(neighbors_prediction)
return Y_pred
_Vote Метод – это функция помощника, которая не реализована в Кннбаз Класс, поскольку он будет отличаться для классификатора и регресса. Однако его цель состоит в том, чтобы вернуть единственный прогноз на точку данных, учитывая цели соседа.
_Predict Метод представляет собой электростанцию алгоритма, и он принимает в точках данных X_test Цели Кто должны быть предсказаны. Первое, что мы делаем, является созданием пустого массива с тем же количеством элементов, так как есть точка данных в X_test. .
Далее мы петлю через X_test И для каждой точки данных расстояния от каждого примера тренинга рассчитаны с евклидовой функцией.
Эти расстояния затем отсортированы с np.argsort Функция, и это возвращает отсортированный массив, но вместо того, чтобы самих значений в качестве элементов возвращает их индексы. Это полезно для нас, потому что нам нужны индексы, чтобы получить соответствующие прогнозируемые значения для ближайших соседей.
Первые k соседей нарезаны из отсортированного массива и целей в этих точках, хранящихся в соседей_predictiction Отказ Голосование сделано с использованием этих ценностей, позвонив на Self._Vote Метод и результат хранится путем заполнения после пустого массива Y_pred Отказ
Полный Кннбаз Класс так:
class KNNBase(BaseEstimator):
def __init__(self, n_neighbors = 5, distance_func = euclidean):
self.n_neighbors = n_neighbors
self.distance_func = euclidean
def fit(self, X, Y):
self.X = X
self.Y = Y
return self
def _vote(self, neighbors_targets):
raise NotImplementedError()
def predict(self, X_test):
"""
Predict the targets of the test data.
"""
Y_pred = np.empty(X_test.shape[0])
for index, entry in enumerate(X_test):
distances = [self.distance_func(i,entry) for i in self.X]
neighbors = np.argsort(distances)[:self.n_neighbors]
neighbors_prediction = [self.Y[j] for j in neighbors]
Y_pred[index] = self._vote(neighbors_prediction)
return Y_pred
Классификатор
class KNNClassifier(KNNBase):
def _vote(self, neighbors_target):
count_ = np.bincount(neighbors_target)
return np.argmax(count_)
Этот класс наследует от Кннбаз класс и реализует _Vote метод. В _Vote Метод, мы берем в Соседи_Таргет Список и используйте np.bincount Метод генерировать частоту каждого класса в Соседи_Таргет список. Затем мы возвращаем аргумент с наивысшим значением с np.argmax Отказ Если есть галстук для самой распространенной этикетки между соседями, то прогнозируемая этикетка является произвольным.
Регресс
class KNNRegressor(KNNBase):
def _vote(self, neighbors_target):
return np.mean(neighbors_target)
Этот класс также наследует из класса Knnbase и реализует _голосование метод. Однако в _Vote Метод, мы берем в Соседи_Таргет Список и используйте np.mean Функция, чтобы найти и вернуть среднее значение всех его ценностей. Чтобы быть уверенным, что наш алгоритм работает, мы будем сравнивать его результат на наборе данных Boston с использованием реализации Sklearn.
from sklearn.datasets import load_boston
from sklearn.neighbors import KNeighborsRegressor
X, y = load_boston(return_X_y = True)
model = KNNRegressor().fit(X,y)
pred= model.predict(X[:10])
print("For the first 10 data points,")
print(f"Our implementation gives: {pred}")
model1= KNeighborsRegressor().fit(X,y)
pred1= model1.predict(X[:10])
print(f"The Sklearn Implementation gives: {pred1}")
For the first 10 data points, Our implementation gives: [21.78 22.9 25.36 26.06 27.1 27.1 20.88 19.1 18.4 19.48] The Sklearn Implementation gives: [21.78 22.9 25.36 26.06 27.1 27.1 20.88 19.1 18.4 19.48]```
Теперь мы успешно реализовали алгоритм соседа K-ближайшего. Не стесняйтесь проверять его на любом другом наборе данных.
Я надеюсь, что вам понравилось прочитать это. Если у вас есть какие-либо вопросы, вы можете связаться со мной в Twitter @phortz Отказ
Использованная литература:
Оригинал: “https://dev.to/enutrof/implementing-the-k-nearest-neighbors-algorithm-from-scratch-in-python-1b42”