Рубрики
Без рубрики

Реализация Algorith k ближайших соседей с нуля в Python

Машина учится больше всего, это черная техника. Это означает, что входы и выходы известны B … Теги за обучением машины, алгоритмыми, Python.

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