<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kirant</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kirant"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Kirant"/>
		<updated>2026-08-03T23:04:18Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68922</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68922"/>
				<updated>2019-01-22T20:35:32Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики {{---}} неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. kNN {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; Nearest Neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
[[Файл:SimpleKnnExample.png|frame|none|super|upright=1|Пример классификации, методом 5 ближайших соседей]]&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило, используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей можно обобщить с помощью функции ядра. Рассмотрим два способа, которыми это можно сделать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|frame|none|super|upright=1|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим использование алгоритма &amp;lt;tex&amp;gt;kNN&amp;lt;/tex&amp;gt; на примере [https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29 реального набора данных].&lt;br /&gt;
Предположим, что мы загрузили &amp;lt;tex&amp;gt;wdbc.data&amp;lt;/tex&amp;gt; и сохранили как &amp;lt;tex&amp;gt;tr.csv&amp;lt;/tex&amp;gt; с заголовком - описанием признаков.&lt;br /&gt;
&lt;br /&gt;
* Загружаем данные&lt;br /&gt;
&lt;br /&gt;
  '''import''' pandas '''as''' pd    &lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler    &lt;br /&gt;
&lt;br /&gt;
  '''def''' load_data(data_path):&lt;br /&gt;
      ds = pd.read_csv(data_path, names=[&amp;quot;id&amp;quot;, &amp;quot;diagnosis&amp;quot;, &amp;quot;radius_mean&amp;quot;, &amp;quot;texture_mean&amp;quot;, &amp;quot;perimeter_mean&amp;quot;, &amp;quot;area_mean&amp;quot;,&lt;br /&gt;
                                       &amp;quot;smoothness_mean&amp;quot;, &amp;quot;compactness_mean&amp;quot;, &amp;quot;concavity_mean&amp;quot;, &amp;quot;concave points_mean&amp;quot;,&lt;br /&gt;
                                       &amp;quot;symmetry_mean&amp;quot;, &amp;quot;fractal_dimension_mean&amp;quot;, &amp;quot;radius_se&amp;quot;, &amp;quot;texture_se&amp;quot;,&lt;br /&gt;
                                       &amp;quot;perimeter_se&amp;quot;, &amp;quot;area_se&amp;quot;, &amp;quot;smoothness_se&amp;quot;, &amp;quot;compactness_se&amp;quot;, &amp;quot;concavity_se&amp;quot;,&lt;br /&gt;
                                       &amp;quot;concave points_se&amp;quot;, &amp;quot;symmetry_se&amp;quot;, &amp;quot;fractal_dimension_se&amp;quot;, &amp;quot;radius_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;texture_worst&amp;quot;, &amp;quot;perimeter_worst&amp;quot;, &amp;quot;area_worst&amp;quot;, &amp;quot;smoothness_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;compactness_worst&amp;quot;, &amp;quot;concavity_worst&amp;quot;, &amp;quot;concave points_worst&amp;quot;, &amp;quot;symmetry_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;fractal_dimension_worst&amp;quot;])&lt;br /&gt;
      y = ds['diagnosis']&lt;br /&gt;
      X = ds.drop('diagnosis', axis=1)&lt;br /&gt;
      X = X.drop('id', axis=1)&lt;br /&gt;
      i = len(X.columns)&lt;br /&gt;
      X = X.drop(X.columns[i - 1], axis=1)&lt;br /&gt;
      y.replace(('M', 'B'), (1, 0), inplace=True)&lt;br /&gt;
      sc = StandardScaler()&lt;br /&gt;
      sc.fit(X)&lt;br /&gt;
      X_ans = sc.transform(X)&lt;br /&gt;
      return X_ans, y&lt;br /&gt;
&lt;br /&gt;
  X, y = load_data(&amp;quot;tr.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - нормированные значения признаков и соответствующие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 model_params = best_model.get_params()&lt;br /&gt;
 tuned_params = {}&lt;br /&gt;
 for k, v in model_params.items():&lt;br /&gt;
     tuned_params[k] = [v]&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 predicted = best_model.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 print('Used params:', best_params)&lt;br /&gt;
 print('Evaluation:\n', metrics.classification_report(y_test, predicted))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Used params''': {'metric_params': None, 'metric': 'euclidean', 'weights': 'distance', 'n_neighbors': 9, 'leaf_size': 30, 'n_jobs': 4, 'p': 2, 'algorithm': 'auto'}&lt;br /&gt;
   '''Evaluation:'''&lt;br /&gt;
                   precision    recall  f1-score   support&lt;br /&gt;
               0       0.90      1.00      0.95        69&lt;br /&gt;
               1       1.00      0.82      0.90        45&lt;br /&gt;
       micro avg       0.93      0.93      0.93       114&lt;br /&gt;
       macro avg       0.95      0.91      0.92       114&lt;br /&gt;
    weighted avg       0.94      0.93      0.93       114&lt;br /&gt;
&lt;br /&gt;
==Пример реализации на языке Scala==&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.knn&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#knn Smile, KNN]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''toy: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = toy.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = toy.y().map(_.toInt)&lt;br /&gt;
  '''val '''KNN: KNN[Array['''Double''']] = knn(x, y, 3)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(KNN.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, KNN)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Уменьшение размерности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN kNN] - статья на machinelearning.ru про kNN&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про kNN] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;br /&gt;
# [https://www.kaggle.com/jeffbrown/knn-classifier/data kaggle example] - пример по работе с датасетом с kaggle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Метрический классификатор]]&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SimpleKnnExample.png&amp;diff=68919</id>
		<title>Файл:SimpleKnnExample.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:SimpleKnnExample.png&amp;diff=68919"/>
				<updated>2019-01-22T20:26:26Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68777</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68777"/>
				<updated>2019-01-22T10:47:29Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: /* Пример использования (через scikit-learn) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики {{---}} неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. kNN {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; Nearest Neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило, используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей можно обобщить, с помощью функции ядра. Рассмотрим два способа, которыми это можно сделать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|frame|none|super|upright=1|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим использование алгоритма &amp;lt;tex&amp;gt;kNN&amp;lt;/tex&amp;gt; на примере [https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29 реального набора данных].&lt;br /&gt;
Предположим, что мы загрузили &amp;lt;tex&amp;gt;wdbc.data&amp;lt;/tex&amp;gt; и сохранили как &amp;lt;tex&amp;gt;tr.csv&amp;lt;/tex&amp;gt; с заголовком - описанием признаков.&lt;br /&gt;
&lt;br /&gt;
* Загружаем данные&lt;br /&gt;
&lt;br /&gt;
  '''import''' pandas '''as''' pd    &lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler    &lt;br /&gt;
&lt;br /&gt;
  '''def''' load_data(data_path):&lt;br /&gt;
      ds = pd.read_csv(data_path, names=[&amp;quot;id&amp;quot;, &amp;quot;diagnosis&amp;quot;, &amp;quot;radius_mean&amp;quot;, &amp;quot;texture_mean&amp;quot;, &amp;quot;perimeter_mean&amp;quot;, &amp;quot;area_mean&amp;quot;,&lt;br /&gt;
                                       &amp;quot;smoothness_mean&amp;quot;, &amp;quot;compactness_mean&amp;quot;, &amp;quot;concavity_mean&amp;quot;, &amp;quot;concave points_mean&amp;quot;,&lt;br /&gt;
                                       &amp;quot;symmetry_mean&amp;quot;, &amp;quot;fractal_dimension_mean&amp;quot;, &amp;quot;radius_se&amp;quot;, &amp;quot;texture_se&amp;quot;,&lt;br /&gt;
                                       &amp;quot;perimeter_se&amp;quot;, &amp;quot;area_se&amp;quot;, &amp;quot;smoothness_se&amp;quot;, &amp;quot;compactness_se&amp;quot;, &amp;quot;concavity_se&amp;quot;,&lt;br /&gt;
                                       &amp;quot;concave points_se&amp;quot;, &amp;quot;symmetry_se&amp;quot;, &amp;quot;fractal_dimension_se&amp;quot;, &amp;quot;radius_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;texture_worst&amp;quot;, &amp;quot;perimeter_worst&amp;quot;, &amp;quot;area_worst&amp;quot;, &amp;quot;smoothness_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;compactness_worst&amp;quot;, &amp;quot;concavity_worst&amp;quot;, &amp;quot;concave points_worst&amp;quot;, &amp;quot;symmetry_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;fractal_dimension_worst&amp;quot;])&lt;br /&gt;
      y = ds['diagnosis']&lt;br /&gt;
      X = ds.drop('diagnosis', axis=1)&lt;br /&gt;
      X = X.drop('id', axis=1)&lt;br /&gt;
      i = len(X.columns)&lt;br /&gt;
      X = X.drop(X.columns[i - 1], axis=1)&lt;br /&gt;
      y.replace(('M', 'B'), (1, 0), inplace=True)&lt;br /&gt;
      sc = StandardScaler()&lt;br /&gt;
      sc.fit(X)&lt;br /&gt;
      X_ans = sc.transform(X)&lt;br /&gt;
      return X_ans, y&lt;br /&gt;
&lt;br /&gt;
  X, y = load_data(&amp;quot;tr.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - нормированные значения признаков и соответствующие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 model_params = best_model.get_params()&lt;br /&gt;
 tuned_params = {}&lt;br /&gt;
 for k, v in model_params.items():&lt;br /&gt;
     tuned_params[k] = [v]&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 predicted = best_model.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 print('Used params:', best_params)&lt;br /&gt;
 print('Evaluation:\n', metrics.classification_report(y_test, predicted))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Used params''': {'metric_params': None, 'metric': 'euclidean', 'weights': 'distance', 'n_neighbors': 9, 'leaf_size': 30, 'n_jobs': 4, 'p': 2, 'algorithm': 'auto'}&lt;br /&gt;
   '''Evaluation:'''&lt;br /&gt;
                   precision    recall  f1-score   support&lt;br /&gt;
               0       0.90      1.00      0.95        69&lt;br /&gt;
               1       1.00      0.82      0.90        45&lt;br /&gt;
       micro avg       0.93      0.93      0.93       114&lt;br /&gt;
       macro avg       0.95      0.91      0.92       114&lt;br /&gt;
    weighted avg       0.94      0.93      0.93       114&lt;br /&gt;
&lt;br /&gt;
==Пример реализации на языке Scala==&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.knn&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#knn Smile, KNN]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''toy: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = toy.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = toy.y().map(_.toInt)&lt;br /&gt;
  '''val '''KNN: KNN[Array['''Double''']] = knn(x, y, 3)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(KNN.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, KNN)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Уменьшение размерности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN kNN] - статья на machinelearning.ru про kNN&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про kNN] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;br /&gt;
# [https://www.kaggle.com/jeffbrown/knn-classifier/data kaggle example] - пример по работе с датасетом с kaggle&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68775</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68775"/>
				<updated>2019-01-22T10:32:51Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики {{---}} неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. kNN {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; Nearest Neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило, используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей можно обобщить, с помощью функции ядра. Рассмотрим два способа, которыми это можно сделать.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|frame|none|super|upright=1|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим использование алгоритма &amp;lt;tex&amp;gt;kNN&amp;lt;/tex&amp;gt; на примере [https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29 реального набора данных].&lt;br /&gt;
Предположим, что мы загрузили &amp;lt;tex&amp;gt;wdbc.data&amp;lt;/tex&amp;gt; и сохранили как &amp;lt;tex&amp;gt;tr.csv&amp;lt;/tex&amp;gt; с заголовком - описанием признаков.&lt;br /&gt;
&lt;br /&gt;
* Загружаем данные&lt;br /&gt;
&lt;br /&gt;
  '''import''' pandas '''as''' pd    &lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler    &lt;br /&gt;
&lt;br /&gt;
  '''def''' load_data(data_path):&lt;br /&gt;
      ds = pd.read_csv(data_path, names=[&amp;quot;id&amp;quot;, &amp;quot;diagnosis&amp;quot;, &amp;quot;radius_mean&amp;quot;, &amp;quot;texture_mean&amp;quot;, &amp;quot;perimeter_mean&amp;quot;, &amp;quot;area_mean&amp;quot;,&lt;br /&gt;
                                       &amp;quot;smoothness_mean&amp;quot;, &amp;quot;compactness_mean&amp;quot;, &amp;quot;concavity_mean&amp;quot;, &amp;quot;concave points_mean&amp;quot;,&lt;br /&gt;
                                       &amp;quot;symmetry_mean&amp;quot;, &amp;quot;fractal_dimension_mean&amp;quot;, &amp;quot;radius_se&amp;quot;, &amp;quot;texture_se&amp;quot;,&lt;br /&gt;
                                       &amp;quot;perimeter_se&amp;quot;, &amp;quot;area_se&amp;quot;, &amp;quot;smoothness_se&amp;quot;, &amp;quot;compactness_se&amp;quot;, &amp;quot;concavity_se&amp;quot;,&lt;br /&gt;
                                       &amp;quot;concave points_se&amp;quot;, &amp;quot;symmetry_se&amp;quot;, &amp;quot;fractal_dimension_se&amp;quot;, &amp;quot;radius_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;texture_worst&amp;quot;, &amp;quot;perimeter_worst&amp;quot;, &amp;quot;area_worst&amp;quot;, &amp;quot;smoothness_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;compactness_worst&amp;quot;, &amp;quot;concavity_worst&amp;quot;, &amp;quot;concave points_worst&amp;quot;, &amp;quot;symmetry_worst&amp;quot;,&lt;br /&gt;
                                       &amp;quot;fractal_dimension_worst&amp;quot;])&lt;br /&gt;
      y = ds['diagnosis']&lt;br /&gt;
      X = ds.drop('diagnosis', axis=1)&lt;br /&gt;
      X = X.drop('id', axis=1)&lt;br /&gt;
      i = len(X.columns)&lt;br /&gt;
      X = X.drop(X.columns[i - 1], axis=1)&lt;br /&gt;
      y.replace(('M', 'B'), (1, 0), inplace=True)&lt;br /&gt;
      sc = StandardScaler()&lt;br /&gt;
      sc.fit(X)&lt;br /&gt;
      X_ans = sc.transform(X)&lt;br /&gt;
      return X_ans, y&lt;br /&gt;
&lt;br /&gt;
  X, y = load_data(&amp;quot;tr.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - нормированные значения признаков и соответствующие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, test_size=0.2, random_state=1234)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 model_params = best_model.get_params()&lt;br /&gt;
 tuned_params = {}&lt;br /&gt;
 for k, v in model_params.items():&lt;br /&gt;
     tuned_params[k] = [v]&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 print('Used params:', best_params)&lt;br /&gt;
 print('Evaluation:\n', metrics.classification_report(y_validation, predicted))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Used params''': {'metric_params': None, 'metric': 'euclidean', 'weights': 'distance', 'n_neighbors': 9, 'leaf_size': 30, 'n_jobs': 4, 'p': 2, 'algorithm': 'auto'}&lt;br /&gt;
   '''Evaluation:'''&lt;br /&gt;
                   precision    recall  f1-score   support&lt;br /&gt;
               0       0.90      1.00      0.95        69&lt;br /&gt;
               1       1.00      0.82      0.90        45&lt;br /&gt;
       micro avg       0.93      0.93      0.93       114&lt;br /&gt;
       macro avg       0.95      0.91      0.92       114&lt;br /&gt;
    weighted avg       0.94      0.93      0.93       114&lt;br /&gt;
&lt;br /&gt;
==Пример реализации на языке Scala==&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.knn&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#knn Smile, KNN]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''toy: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = toy.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = toy.y().map(_.toInt)&lt;br /&gt;
  '''val '''KNN: KNN[Array['''Double''']] = knn(x, y, 3)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(KNN.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, KNN)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Уменьшение размерности]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN kNN] - статья на machinelearning.ru про kNN&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про kNN] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;br /&gt;
# [https://www.kaggle.com/jeffbrown/knn-classifier/data kaggle example] - пример по работе с датасетом с kaggle&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68531</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68531"/>
				<updated>2019-01-18T20:44:29Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. knn - &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|frame|none|super|upright=1|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим использование алгоритма &amp;lt;tex&amp;gt;knn&amp;lt;/tex&amp;gt; на примере [https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29 реального набора данных].&lt;br /&gt;
Предположим, что мы загрузили &amp;lt;tex&amp;gt;wdbc.data&amp;lt;/tex&amp;gt; и сохранили как &amp;lt;tex&amp;gt;tr.csv&amp;lt;/tex&amp;gt; с загаловком - описанием признаков.&lt;br /&gt;
&lt;br /&gt;
* Загружаем данные&lt;br /&gt;
&lt;br /&gt;
  '''import''' pandas '''as''' pd    &lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler    &lt;br /&gt;
&lt;br /&gt;
  '''def''' load_data(data_path):&lt;br /&gt;
      ds = pd.read_csv(data_path)&lt;br /&gt;
      y = ds['diagnosis']&lt;br /&gt;
      X = ds.drop('diagnosis', axis=1)&lt;br /&gt;
      X = X.drop('id', axis=1)&lt;br /&gt;
      i = len(X.columns)&lt;br /&gt;
      X = X.drop(X.columns[i - 1], axis=1)&lt;br /&gt;
      y.replace(('M', 'B'), (1, 0), inplace=True)&lt;br /&gt;
      sc = StandardScaler()&lt;br /&gt;
      sc.fit(X)&lt;br /&gt;
      X_ans = sc.transform(X)&lt;br /&gt;
      return X_ans, y&lt;br /&gt;
&lt;br /&gt;
  X, y = load_data(&amp;quot;tr.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, test_size=0.2, random_state=1234)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 model_params = best_model.get_params()&lt;br /&gt;
 tuned_params = {}&lt;br /&gt;
 for k, v in model_params.items():&lt;br /&gt;
     tuned_params[k] = [v]&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 print('Used params:', best_params)&lt;br /&gt;
 print('Evaluation:\n', metrics.classification_report(y_validation, predicted))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Used params''': {'metric_params': None, 'metric': 'euclidean', 'weights': 'distance', 'n_neighbors': 9, 'leaf_size': 30, 'n_jobs': 4, 'p': 2, 'algorithm': 'auto'}&lt;br /&gt;
   '''Evaluation:'''&lt;br /&gt;
                   precision    recall  f1-score   support&lt;br /&gt;
               0       0.90      1.00      0.95        69&lt;br /&gt;
               1       1.00      0.82      0.90        45&lt;br /&gt;
       micro avg       0.93      0.93      0.93       114&lt;br /&gt;
       macro avg       0.95      0.91      0.92       114&lt;br /&gt;
    weighted avg       0.94      0.93      0.93       114&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;br /&gt;
# [https://www.kaggle.com/jeffbrown/knn-classifier/data kaggle example] - пример по работе с датасетом с kaggle&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68529</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68529"/>
				<updated>2019-01-18T20:41:46Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. knn - &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|frame|none|super|upright=1|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим использование алгоритма knn на примере [https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29 реального датасета].&lt;br /&gt;
Предположим, что мы загрузили ''wdbc.data'' и сохранили как ''tr.csv'' с загаловком - описанием признаков.&lt;br /&gt;
&lt;br /&gt;
* Загружаем данные&lt;br /&gt;
&lt;br /&gt;
  '''import''' pandas '''as''' pd    &lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler    &lt;br /&gt;
&lt;br /&gt;
  '''def''' load_data(data_path):&lt;br /&gt;
      ds = pd.read_csv(data_path)&lt;br /&gt;
      y = ds['diagnosis']&lt;br /&gt;
      X = ds.drop('diagnosis', axis=1)&lt;br /&gt;
      X = X.drop('id', axis=1)&lt;br /&gt;
      i = len(X.columns)&lt;br /&gt;
      X = X.drop(X.columns[i - 1], axis=1)&lt;br /&gt;
      y.replace(('M', 'B'), (1, 0), inplace=True)&lt;br /&gt;
      sc = StandardScaler()&lt;br /&gt;
      sc.fit(X)&lt;br /&gt;
      X_ans = sc.transform(X)&lt;br /&gt;
      return X_ans, y&lt;br /&gt;
&lt;br /&gt;
  X, y = load_data(&amp;quot;tr.csv&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, test_size=0.2, random_state=1234)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 model_params = best_model.get_params()&lt;br /&gt;
 tuned_params = {}&lt;br /&gt;
 for k, v in model_params.items():&lt;br /&gt;
     tuned_params[k] = [v]&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 print('Used params:', best_params)&lt;br /&gt;
 print('Evaluation:\n', metrics.classification_report(y_validation, predicted))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Used params''': {'metric_params': None, 'metric': 'euclidean', 'weights': 'distance', 'n_neighbors': 9, 'leaf_size': 30, 'n_jobs': 4, 'p': 2, 'algorithm': 'auto'}&lt;br /&gt;
   '''Evaluation:'''&lt;br /&gt;
                   precision    recall  f1-score   support&lt;br /&gt;
               0       0.90      1.00      0.95        69&lt;br /&gt;
               1       1.00      0.82      0.90        45&lt;br /&gt;
       micro avg       0.93      0.93      0.93       114&lt;br /&gt;
       macro avg       0.95      0.91      0.92       114&lt;br /&gt;
    weighted avg       0.94      0.93      0.93       114&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;br /&gt;
# [https://www.kaggle.com/jeffbrown/knn-classifier/data kaggle example] - пример по работе с датасетом с kaggle&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68519</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68519"/>
				<updated>2019-01-18T17:57:37Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. knn - &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|frame|none|super|upright=1|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 print('Used params:', best_params)&lt;br /&gt;
 print('Evaluation:\n', metrics.classification_report(y_validation, predicted))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Used params: {'n_neighbors': 23}'''&lt;br /&gt;
   '''Evaluation:'''&lt;br /&gt;
                   precision    recall  f1-score   support&lt;br /&gt;
    &lt;br /&gt;
               A       0.82      1.00      0.90        40&lt;br /&gt;
               B       0.40      0.44      0.42        43&lt;br /&gt;
               C       0.83      0.23      0.36        22&lt;br /&gt;
               D       0.61      0.98      0.75        47&lt;br /&gt;
               E       0.33      0.67      0.44        42&lt;br /&gt;
               F       0.50      0.11      0.19        70&lt;br /&gt;
               G       0.59      0.44      0.50        68&lt;br /&gt;
    &lt;br /&gt;
       micro avg       0.53      0.53      0.53       332&lt;br /&gt;
       macro avg       0.58      0.55      0.51       332&lt;br /&gt;
    weighted avg       0.56      0.53      0.49       332&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68504</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68504"/>
				<updated>2019-01-18T16:37:05Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. knn - &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|frame|none|super|upright=1|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68437</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68437"/>
				<updated>2019-01-17T12:26:41Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. knn - &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ y_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68436</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68436"/>
				<updated>2019-01-17T12:18:24Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей''' (англ. knn - &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших к нему объектов обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-му соседу приписывается вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, как правило, убывающий с ростом ранга соседа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Объект относится к тому классу, который набирает больший суммарный вес среди &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; (поскольку чем дальше объект, тем меньший вклад он должен вносить в пользу своего класса).&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается константа &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании линейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть X, y - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68379</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68379"/>
				<updated>2019-01-15T10:18:08Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: /* Метод парзеновского окна */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод k ближайших соседей''' (англ. knn - k nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} k ближайших к нему объектов обучающей выборки x_i. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда i-му соседу приписывается вес w_i, как правило, убывающий с ростом ранга соседа i. Объект относится к тому классу, который набирает больший суммарный вес среди k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании ленейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода k ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть X, y - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68378</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68378"/>
				<updated>2019-01-15T10:17:20Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод k ближайших соседей''' (англ. knn - k nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} k ближайших к нему объектов обучающей выборки x_i. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда i-му соседу приписывается вес w_i, как правило, убывающий с ростом ранга соседа i. Объект относится к тому классу, который набирает больший суммарный вес среди k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании ленейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода k ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
[[Файл:KnnExample.png|Пример классификации, методом с постоянной шириной окна, и неравномерным разбросом точек]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть X, y - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:KnnExample.png&amp;diff=68377</id>
		<title>Файл:KnnExample.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:KnnExample.png&amp;diff=68377"/>
				<updated>2019-01-15T10:08:03Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68376</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68376"/>
				<updated>2019-01-15T10:06:46Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод k ближайших соседей''' (англ. knn - k nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} k ближайших к нему объектов обучающей выборки x_i. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда i-му соседу приписывается вес w_i, как правило, убывающий с ростом ранга соседа i. Объект относится к тому классу, который набирает больший суммарный вес среди k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании ленейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию [[Ядра]]&amp;lt;sup&amp;gt;[на 15.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Метод парзеновского окна ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
Сравним два этих метода. Сперва запишем классификаторы, полученные при использовании этих методов, в явном виде:&lt;br /&gt;
&lt;br /&gt;
Фиксированной ширины: &amp;lt;tex&amp;gt;a_h = a(u, X^m, \boldsymbol{h}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Переменной ширины: &amp;lt;tex&amp;gt;a_k = a(u, X^m, \boldsymbol{k}, K) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; не будет учитывать соседей на расстояние больше чем h, а всех остальных учтет в соответствии с функций ядра &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt; является аналогом метода k ближайших соседей (т.к. для всех &amp;lt;tex&amp;gt;k+i&amp;lt;/tex&amp;gt;-ых соседей функция &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; вернет 0), но при этом чем ближе &amp;lt;tex&amp;gt;k-i&amp;lt;/tex&amp;gt;-ый сосед, тем больший вклад в сторону своего класса он даст.&lt;br /&gt;
&lt;br /&gt;
Часто используют окно переменной ширины т.е. классификатор &amp;lt;tex&amp;gt;a_k&amp;lt;/tex&amp;gt;, по следующим причинам:&lt;br /&gt;
&lt;br /&gt;
1) Удобнее оптимизировать целочисленный параметр &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, чем вещественный параметр &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; по некоторой сетке.&lt;br /&gt;
&lt;br /&gt;
2) Существует большое количество задач, где точки разбросаны не равномерно. В них могут существовать области, где достаточно брать небольшую &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; и области, где в окно ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; попадает только одна точка. Тогда для классификатора &amp;lt;tex&amp;gt;a_h&amp;lt;/tex&amp;gt; будут существовать области в которых не будет ни одного объекта (кроме того, который нужно классифицировать). Для таких областей не понятно как классифицировать объекты. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть X, y - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68375</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68375"/>
				<updated>2019-01-15T08:40:36Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: /* Источники информации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод k ближайших соседей''' (англ. knn - k nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} k ближайших к нему объектов обучающей выборки x_i. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда i-му соседу приписывается вес w_i, как правило, убывающий с ростом ранга соседа i. Объект относится к тому классу, который набирает больший суммарный вес среди k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании ленейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию ядра.&lt;br /&gt;
&lt;br /&gt;
'''Функция ядра (ядро сглаживания)''' {{---}} неотрицательная монотонно невозрастающая функция на &amp;lt;tex&amp;gt;[0,+\infty)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Варианты метода ближайших соседей, использующие функцию ядра ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h(x_{i; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод потенциальных функций, в котором ширина окна &amp;lt;tex&amp;gt;h(x_i)&amp;lt;/tex&amp;gt; зависит не от классифицируемого объекта, а от обучающего объекта &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть X, y - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html sklearn] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68123</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68123"/>
				<updated>2018-12-30T17:22:42Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: Небольшие поправки стиля и опечаток&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод k ближайших соседей''' (англ. knn - k nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей {{---}} k ближайших к нему объектов обучающей выборки x_i. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда i-му соседу приписывается вес w_i, как правило, убывающий с ростом ранга соседа i. Объект относится к тому классу, который набирает больший суммарный вес среди k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; {{---}} заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; {{---}} простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; {{---}} метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании ленейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию ядра.&lt;br /&gt;
&lt;br /&gt;
'''Функция ядра (ядро сглаживания)''' {{---}} неотрицательная монотонно невозрастающая функция на &amp;lt;tex&amp;gt;[0,+\infty)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Варианты метода ближайших соседей, использующие функцию ядра ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h(x_{i; u})}\biggr)&amp;lt;/tex&amp;gt; {{---}} метод потенциальных функций, в котором ширина окна &amp;lt;tex&amp;gt;h(x_i)&amp;lt;/tex&amp;gt; зависит не от классифицируемого объекта, а от обучающего объекта &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
Пусть X, y - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68122</id>
		<title>Метрический классификатор и метод ближайших соседей</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80_%D0%B8_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%D0%B1%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D1%85_%D1%81%D0%BE%D1%81%D0%B5%D0%B4%D0%B5%D0%B9&amp;diff=68122"/>
				<updated>2018-12-30T17:19:48Z</updated>
		
		<summary type="html">&lt;p&gt;Kirant: Базовая статья Метрический классификатор и метод ближайших соседей&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метрический классификатор''' (англ. similarity-based classifier) {{---}} алгоритм классификации, основанный на вычислении оценок сходства между объектами.&lt;br /&gt;
&lt;br /&gt;
Для формализации понятия сходства вводится функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Как правило, не требуется, чтобы были выполнены все три аксиомы метрики - неравенство треугольника может нарушаться.&lt;br /&gt;
&lt;br /&gt;
'''Метод ближайших соседей''' {{---}} простейший метрический классификатор, основанный на оценивании сходства объектов. Классифицируемый объект относится к тому классу, которому принадлежат ближайшие к нему объекты обучающей выборки.&lt;br /&gt;
&lt;br /&gt;
'''Метод k ближайших соседей''' (англ. knn - k nearest neighbours) {{---}} Для повышения надёжности классификации объект относится к тому классу, которому принадлежит большинство из его соседей — k ближайших к нему объектов обучающей выборки x_i. В задачах с двумя классами число соседей берут нечётным, чтобы не возникало ситуаций неоднозначности, когда одинаковое число соседей принадлежат разным классам.&lt;br /&gt;
&lt;br /&gt;
'''Метод взвешенных ближайших соседей''' {{---}} в задачах с числом классов 3 и более нечётность уже не помогает, и ситуации неоднозначности всё равно могут возникать. Тогда i-му соседу приписывается вес w_i, как правило, убывающий с ростом ранга соседа i. Объект относится к тому классу, который набирает больший суммарный вес среди k ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть задана обучающая выборка пар «объект-ответ» &amp;lt;tex&amp;gt;X^m = \{(x_1,y_1),\dots,(x_m,y_m)\}.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть на множестве объектов задана функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. Эта функция должна быть достаточно адекватной моделью сходства объектов. Чем больше значение этой функции, тем менее схожими являются два объекта &amp;lt;tex&amp;gt;x, x'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для произвольного объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; расположим объекты обучающей выборки &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; в порядке возрастания расстояний до &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(u,x_{1; u}) \leq  \rho(u,x_{2; u}) \leq \cdots \leq \rho(u,x_{m; u})&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где через &amp;lt;tex&amp;gt;x_{i; u}&amp;lt;/tex&amp;gt; обозначается тот объект обучающей выборки, который является &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседом объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Аналогичное обозначение введём и для ответа на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-м соседе: &amp;lt;tex&amp;gt;y_{i; u}&amp;lt;/tex&amp;gt;. Таким образом, произвольный объект &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; порождает свою перенумерацию выборки. В наиболее общем виде алгоритм ближайших соседей есть:&lt;br /&gt;
&amp;lt;tex&amp;gt;a(u) = \mathrm{arg}\max_{y\in Y} \sum_{i=1}^m \bigl[ x_{i; u}=y \bigr] w(i,u)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;w(i,u)&amp;lt;/tex&amp;gt; — заданная весовая функция, которая оценивает степень важности &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-го соседа для классификации объекта &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;. Естественно полагать, что эта функция неотрицательна и не возрастает по &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По-разному задавая весовую функцию, можно получать различные варианты метода ближайших соседей.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i=1]&amp;lt;/tex&amp;gt; — простейший метод ближайшего соседа;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k]&amp;lt;/tex&amp;gt; — метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; ближайших соседей;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = [i\leq k] q^i&amp;lt;/tex&amp;gt; — метод &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; экспоненциально взвешенных ближайших соседей, где предполагается &amp;lt;tex&amp;gt;q &amp;lt; 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
== Использование ядер сглаживания ==&lt;br /&gt;
При использовании ленейной функции в качестве &amp;lt;tex&amp;gt;w(i, u)&amp;lt;/tex&amp;gt; возможно совпадение суммарного веса для нескольких классов. Это приводит к неоднозначности ответа при классификации. Чтобы такого не происходило используют функцию ядра.&lt;br /&gt;
&lt;br /&gt;
'''Функция ядра (ядро сглаживания)''' {{---}} неотрицательная монотонно невозрастающая функция на &amp;lt;tex&amp;gt;[0,+\infty)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем обозначать функцию ядра &amp;lt;tex&amp;gt;K(r)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Примеры ядер ===&lt;br /&gt;
&lt;br /&gt;
Triangular: &amp;lt;tex&amp;gt;{\displaystyle K(r)=(1-|r|)}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parabolic: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {3}{4}}(1-r^{2})}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tricube: &amp;lt;tex&amp;gt;{\displaystyle K(r)={\frac {70}{81}}(1-{\left|r\right|}^{3})^{3}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Варианты метода ближайших соседей, использующие функцию ядра ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h}\biggr)&amp;lt;/tex&amp;gt; — метод парзеновского окна фиксированной ширины &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{\rho(u,x_{k+1; u})}\biggr)&amp;lt;/tex&amp;gt; — метод парзеновского окна переменной ширины;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;w(i,u) = K\biggl(\frac{\rho(u,x_{i; u})}{h(x_{i; u})}\biggr)&amp;lt;/tex&amp;gt; — метод потенциальных функций, в котором ширина окна &amp;lt;tex&amp;gt;h(x_i)&amp;lt;/tex&amp;gt; зависит не от классифицируемого объекта, а от обучающего объекта &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Использование различных метрик расстояния ==&lt;br /&gt;
Очень редко известа хорошая функция расстояния &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;. В качестве нее обычно использую следующие функции:&lt;br /&gt;
&lt;br /&gt;
=== Примеры метрик ===&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; - объекты, а &amp;lt;tex&amp;gt;(x_1, x_2,..., x_n)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(y_1, y_2,..., y_n)&amp;lt;/tex&amp;gt; их признаковые описания.&lt;br /&gt;
&lt;br /&gt;
Евклидова метрика: &amp;lt;tex&amp;gt;\rho(x,y) = \sqrt {\sum _{i=1}^{n}(x_{i}-y_{i})^{2}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расстояние Чебышёва: &amp;lt;tex&amp;gt;\rho(x,y)=\max _{i=1,\dots ,n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Манхэттенское Расстояние: &amp;lt;tex&amp;gt;\rho(x,y)=\sum _{i=1}^{n}|x_{i}-y_{i}|&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При их использовании важно нормировать значения признаков, иначе один признак с максимальным значением может стать приобладающим, а признаки с маленькими значениями не будут учитываться при классификации. Чтобы отсеить лишние признаки (т.е. не влияющие на класс объекта) можно использовать [http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D0%B8 feature selection].&lt;br /&gt;
&lt;br /&gt;
== Пример использования (через scikit-learn) ==&lt;br /&gt;
&lt;br /&gt;
== Пример использования ==&lt;br /&gt;
Пусть X, y - нормированные значения признаков и соответствуйющие им классы.&lt;br /&gt;
&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.1, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(&lt;br /&gt;
    '''n_neighbors'''=10, &lt;br /&gt;
    '''weights'''=’distance’,&lt;br /&gt;
    '''algorithm'''=’auto’,&lt;br /&gt;
    '''leaf_size'''=30,&lt;br /&gt;
    '''metric'''=’euclidean’,&lt;br /&gt;
    '''metric_params'''=None,&lt;br /&gt;
    '''n_jobs'''=4&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль для поиска лучших параметров (англ. cross validation)&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
&lt;br /&gt;
 tuned_params = best_model.get_params()&lt;br /&gt;
 tuned_params['n_neighbors'] = range(1, 30)&lt;br /&gt;
 clf = GridSearchCV(KNeighborsClassifier(), tuned_params, cv=10, n_jobs=-1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 best_params = clf.best_params_&lt;br /&gt;
&lt;br /&gt;
* Оценка классификатора&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
&lt;br /&gt;
 best_model = KNeighborsClassifier(**best_params)&lt;br /&gt;
 predicted = best_model.predict(X_validation)&lt;br /&gt;
 logging.info('Used params: {0}'.format(params))&lt;br /&gt;
 logging.info('Evaluation:\n{0}'.format(metrics.classification_report(expected, predicted)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Общие понятия]]&amp;lt;sup&amp;gt;[на 30.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80 Метрический классификатор] - статья на machinelearning.ru про метрический классификатор&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=KNN knn] - статья на machinelearning.ru про knn&lt;br /&gt;
# [https://www.youtube.com/watch?v=l1xGQMowWA4&amp;amp;t=0s&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=3 лекция про knn] - Лекция из курса К.В. Воронцова&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Kernel_(statistics) Функции ядер] - примеры ядер с Википедии&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html] - документация по scikit-learn&lt;/div&gt;</summary>
		<author><name>Kirant</name></author>	</entry>

	</feed>