<?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=188.170.81.20&amp;*</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=188.170.81.20&amp;*"/>
		<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/188.170.81.20"/>
		<updated>2026-06-11T14:17:20Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>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&amp;diff=70817</id>
		<title>Уменьшение размерности</title>
		<link rel="alternate" type="text/html" href="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&amp;diff=70817"/>
				<updated>2019-04-07T16:20:14Z</updated>
		
		<summary type="html">&lt;p&gt;188.170.81.20: Фикс джява примера&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков набора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').&lt;br /&gt;
==Выбор признаков==&lt;br /&gt;
Методы '''выбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:&lt;br /&gt;
*Уменьшение вероятности [[переобучение|переобучения]];&lt;br /&gt;
*Увеличение точности предсказания модели;&lt;br /&gt;
*Сокращение времени обучения;&lt;br /&gt;
*Увеличивается семантическое понимание модели.&lt;br /&gt;
&lt;br /&gt;
Все методы выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.&lt;br /&gt;
===Фильтры===&lt;br /&gt;
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.&lt;br /&gt;
&lt;br /&gt;
Фильтры могут быть:&lt;br /&gt;
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае обычно измеряют &amp;quot;качество&amp;quot; каждого признака и удаляют худшие;&lt;br /&gt;
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.&lt;br /&gt;
&lt;br /&gt;
Распространенными вариантами для $\mu$ являются:&lt;br /&gt;
*Коэффициент ранговой корреляции Спирмена &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient Определение коэффициента ранговой корреляции Спирмена]&amp;lt;/ref&amp;gt;(англ. ''Spearman's rank correlation coefficient''): $p(x, y)=\displaystyle \frac{\sum_{i, j}(x_{ij}-\bar{x_j})(y_i-\bar{y})}{\sqrt{\sum_{i, j}(x_{ij}-\bar{x_j})^2\sum_i(y_i-\bar{y})^2}}$;&lt;br /&gt;
*Information gain&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Information_gain_in_decision_trees Определение information gain]&amp;lt;/ref&amp;gt;: $IG(x, y)=\displaystyle -\sum_{i=1}^kp(c_i)\log_2{(p(c_i))}+\sum_{i=1}^{n}p(t_i)\sum_{j=1}^kp(c_j|t_i)log_2{(p(c_j|t_i))}$, и другие.&lt;br /&gt;
&lt;br /&gt;
Преимуществом группы фильтров является простота вычисления релевантности признаков в наборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.&lt;br /&gt;
===Оберточные методы===&lt;br /&gt;
[[File:Feature_selection_wrapper_rus.png|450px|thumb|right|Процесс работы оберточных методов]]&lt;br /&gt;
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]]. &lt;br /&gt;
&lt;br /&gt;
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:&lt;br /&gt;
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество;&lt;br /&gt;
*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный &amp;lt;ref&amp;gt;[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]&amp;lt;/ref&amp;gt;. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.&lt;br /&gt;
&lt;br /&gt;
===Встроенные методы===&lt;br /&gt;
[[File:Feature_selection_embedded_rus.png|450px|thumb|right|Процесс работы встроенных методов]]&lt;br /&gt;
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения. &lt;br /&gt;
&lt;br /&gt;
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит &amp;quot;голосование&amp;quot; за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака набора данных. Дальнейший выбор нужных нам признаков уже зависит от выбранного критерия отбора.&lt;br /&gt;
&lt;br /&gt;
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.&lt;br /&gt;
&lt;br /&gt;
===Другие методы===&lt;br /&gt;
[[File:Feature_selection_ensemble_rus.png|thumb|Один из примеров процесса работы ансамблевых методов]]&lt;br /&gt;
Есть и другие методы выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например, некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.&lt;br /&gt;
&lt;br /&gt;
'''Ансамблевые методы''' применяются больше для наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Примеры кода scikit-learn===&lt;br /&gt;
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  &lt;br /&gt;
  # Вспомогательная функция для расчета корреляции&lt;br /&gt;
  def correlation(X, Y):&lt;br /&gt;
      return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))&lt;br /&gt;
&lt;br /&gt;
  # Сам фильтр на основе метрики ранговой корреляции&lt;br /&gt;
  # Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов&lt;br /&gt;
  def measure_spearmans(X, Y):&lt;br /&gt;
      xr = pd.Series(X).rank()&lt;br /&gt;
      yr = pd.Series(Y).rank()&lt;br /&gt;
      return correlation(xr, yr)&lt;br /&gt;
&lt;br /&gt;
Пример кода, реализующего SVM-RFE wrapper:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  from sklearn import svm&lt;br /&gt;
&lt;br /&gt;
  # X -- наш датасет, Y -- массив меток&lt;br /&gt;
  # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации&lt;br /&gt;
  # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет&lt;br /&gt;
  def RFE(X, Y, N, step = 10):&lt;br /&gt;
        # cache_size нужен, если набор данных большой, иначе можно опустить&lt;br /&gt;
        clfRFE = svm.SVC(kernel='linear', cache_size=1024)&lt;br /&gt;
        featureCount = X.shape[1]&lt;br /&gt;
        featureList = np.arange(0, featureCount )&lt;br /&gt;
        included = np.full(featureCount, True)&lt;br /&gt;
        curCount = featureCount&lt;br /&gt;
        while curCount &amp;gt; N:&lt;br /&gt;
            actualFeatures = featureList[included]&lt;br /&gt;
            Xnew = X[:, actualFeatures]&lt;br /&gt;
            &lt;br /&gt;
            clfRFE.fit(Xnew, Y)&lt;br /&gt;
            curStep = min(step, curCount - N)&lt;br /&gt;
            elim = np.argsort(np.abs(clfRFE.coef_[0]))[:curStep]&lt;br /&gt;
            included[actualFeatures[elim]] = False&lt;br /&gt;
            curCount -= curStep&lt;br /&gt;
        return included&lt;br /&gt;
==Выделение признаков==&lt;br /&gt;
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство набора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.&lt;br /&gt;
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.&lt;br /&gt;
&lt;br /&gt;
Одним из самых известных методов '''линейного''' выделения признаков является [[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.&lt;br /&gt;
&lt;br /&gt;
К '''нелинейным''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (t-distributed Stochastic Neighbor Embedding, рус. ''стохастическое вложение соседей с t-распределением''). Данный метод состоит из двух шагов: изначально строится распределение вероятностей по всем парам точек набора данных, каждая условная вероятность $p_{j|i}$ которого означает насколько точка $X_j$ близка к точке $X_i$ при гауссовом распределении вокруг $X_i$. Данное распределение как метрику похожести использует евклидово расстояние. Алгоритм старается получить отображение из точек размерности $\mathbb{R}^k$ в меньшую размерность $\mathbb{R}^d$, для этого вводится еще одно распределение, описывающее насколько точки из нового пространства похожи друг на друга, но используя при этом t-распределение Стьюдента с одной степенью свободы. Как метрику похожести двух распределений используется дивергенция Кульбака-Лейблера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Дивергенция Кульбака-Лейблера]&amp;lt;/ref&amp;gt;, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины. &lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
Пример выделения признаков с помощью PCA в scikit-learn:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  from sklearn.decomposition import PCA&lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
  X = ... # загрузка X&lt;br /&gt;
  Y = ... # загрузка Y&lt;br /&gt;
  # Разделение данных на train и test&lt;br /&gt;
  Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y)&lt;br /&gt;
&lt;br /&gt;
  clf = ... # берем какой-то классификатор&lt;br /&gt;
  # Обучаем PCA для выделения 5 признаков&lt;br /&gt;
  pca = PCA(n_components=5)&lt;br /&gt;
  pca.fit(Xtrain)&lt;br /&gt;
  # Изменяем наши наборы данных под выбранные признаки&lt;br /&gt;
  Xtrain = pca.transform(Xtrain)&lt;br /&gt;
  Xtest = pca.transform(Xtest)&lt;br /&gt;
  # Обучаем классификатор и проверяем точность его работы&lt;br /&gt;
  clf.fit(Xtrain, Ytrain)&lt;br /&gt;
  print (&amp;quot;Score: %.6f&amp;quot; % clf.score(Xtest, Ytest))&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;
Пример уменьшение размерности используя smile.feature.GAFeatureSelection&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/feature.html#genetic-algorithm-feature-selection Smile, Genetic Algorithm Based Feature Selection]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.feature.GAFeatureSelection&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.Accuracy&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Загрузка данных&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''data = read.arff(&amp;quot;data/weka/segment-test.arff&amp;quot;, 19)&lt;br /&gt;
  '''val '''(x, y) = data.unzipInt&lt;br /&gt;
  '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100)&lt;br /&gt;
  '''val '''measure = '''new '''Accuracy&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Cоздание генетического алгоритма и его настройка.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''selector = '''new '''GAFeatureSelection&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Размер популяции - 50, количество поколений - 20 &amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Каждая возращаемая BitString содержит фичи и их качество.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)&lt;br /&gt;
  result.foreach { bits =&amp;gt;&lt;br /&gt;
    print(100*bits.fitness)&lt;br /&gt;
    println(bits.bits.mkString(&amp;quot; &amp;quot;))&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример уменьшения размерности датасета с применением &amp;lt;code&amp;gt;weka.attributeSelection.PrincipalComponents&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/attributeSelection/PrincipalComponents.html/ Weka, PCA]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;nz.ac.waikato.cms.weka&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;weka-stable&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' weka.attributeSelection.PrincipalComponents;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' weka.filters.Filter;&lt;br /&gt;
  '''import''' weka.filters.unsupervised.attribute.NumericToNominal;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
&lt;br /&gt;
  // load dataset&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  '''var''' filter = new NumericToNominal();&lt;br /&gt;
  filter.setInputFormat(data);&lt;br /&gt;
  data = Filter.useFilter(data, filter);&lt;br /&gt;
  // initialize the PCA-based selector&lt;br /&gt;
  '''var''' pca = new PrincipalComponents();&lt;br /&gt;
  // dimensionality reduction is achieved through selecting enough eigenvectors to account&lt;br /&gt;
  // for some percantege of the variance in the original data&lt;br /&gt;
  pca.setVarianceCovered(0.95);&lt;br /&gt;
  pca.buildEvaluator(data);&lt;br /&gt;
  // transform the dataset&lt;br /&gt;
  data = pca.transformedData(data);&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Переобучение]]&lt;br /&gt;
*[[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Дерево решений и случайный лес| Случайный лес]]&lt;br /&gt;
*[[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
==Источники информации==&lt;br /&gt;
#[http://research.cs.tamu.edu/prism/lectures/pr/pr_l11.pdf Sequential feature selection] {{---}} курс ML Texas A&amp;amp;M University&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Feature_selection Feature selection] {{---}} статья про Feature Selection в Wikipedia&lt;br /&gt;
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]&lt;br /&gt;
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Уменьшение размерности]]&lt;/div&gt;</summary>
		<author><name>188.170.81.20</name></author>	</entry>

	<entry>
		<id>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&amp;diff=70816</id>
		<title>Уменьшение размерности</title>
		<link rel="alternate" type="text/html" href="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&amp;diff=70816"/>
				<updated>2019-04-07T16:19:44Z</updated>
		
		<summary type="html">&lt;p&gt;188.170.81.20: Добавил Джява пример&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков набора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').&lt;br /&gt;
==Выбор признаков==&lt;br /&gt;
Методы '''выбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:&lt;br /&gt;
*Уменьшение вероятности [[переобучение|переобучения]];&lt;br /&gt;
*Увеличение точности предсказания модели;&lt;br /&gt;
*Сокращение времени обучения;&lt;br /&gt;
*Увеличивается семантическое понимание модели.&lt;br /&gt;
&lt;br /&gt;
Все методы выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.&lt;br /&gt;
===Фильтры===&lt;br /&gt;
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.&lt;br /&gt;
&lt;br /&gt;
Фильтры могут быть:&lt;br /&gt;
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае обычно измеряют &amp;quot;качество&amp;quot; каждого признака и удаляют худшие;&lt;br /&gt;
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.&lt;br /&gt;
&lt;br /&gt;
Распространенными вариантами для $\mu$ являются:&lt;br /&gt;
*Коэффициент ранговой корреляции Спирмена &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient Определение коэффициента ранговой корреляции Спирмена]&amp;lt;/ref&amp;gt;(англ. ''Spearman's rank correlation coefficient''): $p(x, y)=\displaystyle \frac{\sum_{i, j}(x_{ij}-\bar{x_j})(y_i-\bar{y})}{\sqrt{\sum_{i, j}(x_{ij}-\bar{x_j})^2\sum_i(y_i-\bar{y})^2}}$;&lt;br /&gt;
*Information gain&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Information_gain_in_decision_trees Определение information gain]&amp;lt;/ref&amp;gt;: $IG(x, y)=\displaystyle -\sum_{i=1}^kp(c_i)\log_2{(p(c_i))}+\sum_{i=1}^{n}p(t_i)\sum_{j=1}^kp(c_j|t_i)log_2{(p(c_j|t_i))}$, и другие.&lt;br /&gt;
&lt;br /&gt;
Преимуществом группы фильтров является простота вычисления релевантности признаков в наборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.&lt;br /&gt;
===Оберточные методы===&lt;br /&gt;
[[File:Feature_selection_wrapper_rus.png|450px|thumb|right|Процесс работы оберточных методов]]&lt;br /&gt;
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]]. &lt;br /&gt;
&lt;br /&gt;
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:&lt;br /&gt;
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество;&lt;br /&gt;
*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге.&lt;br /&gt;
&lt;br /&gt;
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный &amp;lt;ref&amp;gt;[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]&amp;lt;/ref&amp;gt;. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.&lt;br /&gt;
&lt;br /&gt;
===Встроенные методы===&lt;br /&gt;
[[File:Feature_selection_embedded_rus.png|450px|thumb|right|Процесс работы встроенных методов]]&lt;br /&gt;
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения. &lt;br /&gt;
&lt;br /&gt;
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит &amp;quot;голосование&amp;quot; за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака набора данных. Дальнейший выбор нужных нам признаков уже зависит от выбранного критерия отбора.&lt;br /&gt;
&lt;br /&gt;
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.&lt;br /&gt;
&lt;br /&gt;
===Другие методы===&lt;br /&gt;
[[File:Feature_selection_ensemble_rus.png|thumb|Один из примеров процесса работы ансамблевых методов]]&lt;br /&gt;
Есть и другие методы выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например, некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.&lt;br /&gt;
&lt;br /&gt;
'''Ансамблевые методы''' применяются больше для наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:{{{1|both}}};&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Примеры кода scikit-learn===&lt;br /&gt;
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  &lt;br /&gt;
  # Вспомогательная функция для расчета корреляции&lt;br /&gt;
  def correlation(X, Y):&lt;br /&gt;
      return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))&lt;br /&gt;
&lt;br /&gt;
  # Сам фильтр на основе метрики ранговой корреляции&lt;br /&gt;
  # Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов&lt;br /&gt;
  def measure_spearmans(X, Y):&lt;br /&gt;
      xr = pd.Series(X).rank()&lt;br /&gt;
      yr = pd.Series(Y).rank()&lt;br /&gt;
      return correlation(xr, yr)&lt;br /&gt;
&lt;br /&gt;
Пример кода, реализующего SVM-RFE wrapper:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  import numpy as np&lt;br /&gt;
  import pandas as pd&lt;br /&gt;
  from sklearn import svm&lt;br /&gt;
&lt;br /&gt;
  # X -- наш датасет, Y -- массив меток&lt;br /&gt;
  # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации&lt;br /&gt;
  # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет&lt;br /&gt;
  def RFE(X, Y, N, step = 10):&lt;br /&gt;
        # cache_size нужен, если набор данных большой, иначе можно опустить&lt;br /&gt;
        clfRFE = svm.SVC(kernel='linear', cache_size=1024)&lt;br /&gt;
        featureCount = X.shape[1]&lt;br /&gt;
        featureList = np.arange(0, featureCount )&lt;br /&gt;
        included = np.full(featureCount, True)&lt;br /&gt;
        curCount = featureCount&lt;br /&gt;
        while curCount &amp;gt; N:&lt;br /&gt;
            actualFeatures = featureList[included]&lt;br /&gt;
            Xnew = X[:, actualFeatures]&lt;br /&gt;
            &lt;br /&gt;
            clfRFE.fit(Xnew, Y)&lt;br /&gt;
            curStep = min(step, curCount - N)&lt;br /&gt;
            elim = np.argsort(np.abs(clfRFE.coef_[0]))[:curStep]&lt;br /&gt;
            included[actualFeatures[elim]] = False&lt;br /&gt;
            curCount -= curStep&lt;br /&gt;
        return included&lt;br /&gt;
==Выделение признаков==&lt;br /&gt;
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство набора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.&lt;br /&gt;
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.&lt;br /&gt;
&lt;br /&gt;
Одним из самых известных методов '''линейного''' выделения признаков является [[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.&lt;br /&gt;
&lt;br /&gt;
К '''нелинейным''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (t-distributed Stochastic Neighbor Embedding, рус. ''стохастическое вложение соседей с t-распределением''). Данный метод состоит из двух шагов: изначально строится распределение вероятностей по всем парам точек набора данных, каждая условная вероятность $p_{j|i}$ которого означает насколько точка $X_j$ близка к точке $X_i$ при гауссовом распределении вокруг $X_i$. Данное распределение как метрику похожести использует евклидово расстояние. Алгоритм старается получить отображение из точек размерности $\mathbb{R}^k$ в меньшую размерность $\mathbb{R}^d$, для этого вводится еще одно распределение, описывающее насколько точки из нового пространства похожи друг на друга, но используя при этом t-распределение Стьюдента с одной степенью свободы. Как метрику похожести двух распределений используется дивергенция Кульбака-Лейблера&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Дивергенция Кульбака-Лейблера]&amp;lt;/ref&amp;gt;, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины. &lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
Пример выделения признаков с помощью PCA в scikit-learn:&lt;br /&gt;
  # Импорт библиотек&lt;br /&gt;
  from sklearn.decomposition import PCA&lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
&lt;br /&gt;
  X = ... # загрузка X&lt;br /&gt;
  Y = ... # загрузка Y&lt;br /&gt;
  # Разделение данных на train и test&lt;br /&gt;
  Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y)&lt;br /&gt;
&lt;br /&gt;
  clf = ... # берем какой-то классификатор&lt;br /&gt;
  # Обучаем PCA для выделения 5 признаков&lt;br /&gt;
  pca = PCA(n_components=5)&lt;br /&gt;
  pca.fit(Xtrain)&lt;br /&gt;
  # Изменяем наши наборы данных под выбранные признаки&lt;br /&gt;
  Xtrain = pca.transform(Xtrain)&lt;br /&gt;
  Xtest = pca.transform(Xtest)&lt;br /&gt;
  # Обучаем классификатор и проверяем точность его работы&lt;br /&gt;
  clf.fit(Xtrain, Ytrain)&lt;br /&gt;
  print (&amp;quot;Score: %.6f&amp;quot; % clf.score(Xtest, Ytest))&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;
Пример уменьшение размерности используя smile.feature.GAFeatureSelection&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/feature.html#genetic-algorithm-feature-selection Smile, Genetic Algorithm Based Feature Selection]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.feature.GAFeatureSelection&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.Accuracy&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Загрузка данных&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''data = read.arff(&amp;quot;data/weka/segment-test.arff&amp;quot;, 19)&lt;br /&gt;
  '''val '''(x, y) = data.unzipInt&lt;br /&gt;
  '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100)&lt;br /&gt;
  '''val '''measure = '''new '''Accuracy&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Cоздание генетического алгоритма и его настройка.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''selector = '''new '''GAFeatureSelection&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Размер популяции - 50, количество поколений - 20 &amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Каждая возращаемая BitString содержит фичи и их качество.&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)&lt;br /&gt;
  result.foreach { bits =&amp;gt;&lt;br /&gt;
    print(100*bits.fitness)&lt;br /&gt;
    println(bits.bits.mkString(&amp;quot; &amp;quot;))&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
==Пример на языке Java==&lt;br /&gt;
Пример уменьшения размерности датасета с применением &amp;lt;code&amp;gt;weka.attributeSelection.PrincipalComponents&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/attributeSelection/PrincipalComponents.html/ Weka, PCA]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;nz.ac.waikato.cms.weka&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;weka-stable&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' weka.attributeSelection.PrincipalComponents;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' weka.filters.Filter;&lt;br /&gt;
  '''import''' weka.filters.unsupervised.attribute.NumericToNominal;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
&lt;br /&gt;
  // load dataset&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  '''var''' filter = new NumericToNominal();&lt;br /&gt;
  filter.setInputFormat(data);&lt;br /&gt;
  data = Filter.useFilter(data, filter);&lt;br /&gt;
  // initialize the PCA-based selector&lt;br /&gt;
  '''var''' pca = new PrincipalComponents();&lt;br /&gt;
  // dimensionality reduction is achieved through selecting enough eigenvectors to account&lt;br /&gt;
  // for some percantege of the variance in the original data&lt;br /&gt;
  pca.setVarianceCovered(0.95);&lt;br /&gt;
  pca.buildEvaluator(data);&lt;br /&gt;
  // transform the dataset&lt;br /&gt;
  data = pca.transformedData(data);&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[Переобучение]]&lt;br /&gt;
*[[Метод опорных векторов (SVM)| SVM]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Дерево решений и случайный лес| Случайный лес]]&lt;br /&gt;
*[[Метод главных компонент (PCA)| PCA]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
==Источники информации==&lt;br /&gt;
#[http://research.cs.tamu.edu/prism/lectures/pr/pr_l11.pdf Sequential feature selection] {{---}} курс ML Texas A&amp;amp;M University&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Feature_selection Feature selection] {{---}} статья про Feature Selection в Wikipedia&lt;br /&gt;
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]&lt;br /&gt;
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Уменьшение размерности]]&lt;/div&gt;</summary>
		<author><name>188.170.81.20</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=70815</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=70815"/>
				<updated>2019-04-07T16:14:18Z</updated>
		
		<summary type="html">&lt;p&gt;188.170.81.20: Добавил Джява пример&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;quot;объект-ответ&amp;quot; &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;[на 28.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;
# Удобнее оптимизировать целочисленный параметр &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;
# Существует большое количество задач, где точки разбросаны неравномерно. В них могут существовать области, где достаточно брать небольшую &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;
==Пример на языке Java==&lt;br /&gt;
Пример классификации датасета с применением &amp;lt;code&amp;gt;weka.classifiers.lazy.IBk&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.stable-3-8/weka/classifiers/lazy/IBk.html/ Weka, KNN]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;nz.ac.waikato.cms.weka&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;weka-stable&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;3.8.0&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' weka.classifiers.Evaluation;&lt;br /&gt;
  '''import''' weka.classifiers.lazy.IBk;&lt;br /&gt;
  '''import''' weka.core.converters.ConverterUtils;&lt;br /&gt;
&lt;br /&gt;
  // read dataset and build knn-classifier&lt;br /&gt;
  '''var''' source  = new ConverterUtils.DataSource(&amp;quot;iris.csv&amp;quot;);&lt;br /&gt;
  '''var''' dataset = source.getDataSet();&lt;br /&gt;
  '''var''' ibk     = new IBk();&lt;br /&gt;
  ibk.buildClassifier(dataset);&lt;br /&gt;
  // test the model&lt;br /&gt;
  '''var''' eTest = new Evaluation(dataset);&lt;br /&gt;
  eTest.evaluateModel(ibk, dataset);&lt;br /&gt;
  // print results summary&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&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;
&amp;lt;references/&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 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 Лекция &amp;quot;Метрические методы классификации&amp;quot; К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Kernel_(statistics) Wikipedia {{---}} Kernel (statistics)]&lt;br /&gt;
* [https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html Документация по scikit-learn]&lt;br /&gt;
* [https://www.kaggle.com/jeffbrown/knn-classifier/data Пример по работе с датасетом с kaggle]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Метрический классификатор]]&lt;/div&gt;</summary>
		<author><name>188.170.81.20</name></author>	</entry>

	</feed>