Машина учится больше всего, это черная техника. Это означает, что входы и выходы известны, но процесс не полностью понятен. Тем не менее, я думаю, что для большинства классических алгоритмов это не должно быть так. Эта кусок стремится помочь вам научиться реализовывать 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”