<?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=91.215.123.110&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=91.215.123.110&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/91.215.123.110"/>
		<updated>2026-06-11T19:29:15Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70940</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70940"/>
				<updated>2019-04-09T00:41:18Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Основные особенности использования Java для задач машинного обучения==&lt;br /&gt;
В отличие от &amp;lt;code&amp;gt;Python&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; не обладает столь обширной экосистемой, ориентированной на решение задач машинного обучения и анализа данных. Большинство имеющихся инструментов являются узко специализированными (по сравнению, например, с &amp;lt;code&amp;gt;scikit-learn&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/ Библиотека scikit-learn]&amp;lt;/ref&amp;gt;) и хуже документированы. Ввиду более низкой популярности языка в сфере &amp;lt;code&amp;gt;ML&amp;lt;/code&amp;gt; большинство онлайн курсов и обучающих материалов ориентированы на &amp;lt;code&amp;gt;Python&amp;lt;/code&amp;gt;. Однако, не смотря на вышеперечисленные факторы, &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; остается&lt;br /&gt;
популярной альтернативой, особенно при необходимости интеграции с существующими &amp;lt;code&amp;gt;JVM&amp;lt;/code&amp;gt; проектами. Также к достоинствам &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; можно отнести статическую типизацию (и как следствие уменьшенную вероятность ошибок времени исполнения) и заметно более развитую поддержку в IDE.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия#Пример на языке Java}}&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java}}&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java_2}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон#Пример на языке Java}}&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети#Пример на языке Java}}&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память#Пример на языке Java}}&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)#Пример на языке Java}}&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Python&amp;diff=70939</id>
		<title>Обзор библиотек для машинного обучения на Python</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Python&amp;diff=70939"/>
				<updated>2019-04-09T00:32:14Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: Отмена правки 70880, сделанной 91.215.123.110 (обсуждение)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:python-logo.png|auto|thumb|Python: https://www.python.org]]&lt;br /&gt;
&lt;br /&gt;
==Scikit-learn==&lt;br /&gt;
===Описание===&lt;br /&gt;
Scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/ Библиотека scikit-learn]&amp;lt;/ref&amp;gt; {{---}} библиотека машинного обучения на языке программирования Python с открытым исходным кодом. Содержит реализации практически всех возможных преобразований, и нередко ее одной хватает для полной реализации модели. В данной библиотеки реализованы методы разбиения датасета на тестовый и обучающий, вычисление основных метрик над наборами данных, проведение [[кросс-валидации|Кросс-валидация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. В библиотеке также есть основные алгоритмы машинного обучения: [[Линейная регрессия|линейной регрессии]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и её модификаций Лассо, гребневой регрессии, [[Метод опорных векторов (SVM)|опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Дерево решений и случайный лес|решающих деревьев и лесов]] и др. Есть и реализации основных методов [[Кластеризация|кластеризации]]. Кроме того, библиотека содержит постоянно используемые исследователями методы работы с признаками: например, понижение размерности [[Метод главных компонент (PCA)|методом главных компонент]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. Частью пакета является библиотека imblearn&amp;lt;ref&amp;gt;[https://imbalanced-learn.readthedocs.io/en/stable/index.html Библиотека imbalanced-learn]&amp;lt;/ref&amp;gt;, позволяющая работать с разбалансированными выборками и генерировать новые значения.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{Main|Линейная регрессия|l1=Линейная регрессия&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Add required imports&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' LinearRegression&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' mean_squared_error, r2_score&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  diabetes = datasets.load_diabetes()&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Use only one feature&amp;lt;/font&amp;gt;&lt;br /&gt;
  diabetes_X = diabetes.data[:, np.newaxis, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Split the data into training/testing sets&amp;lt;/font&amp;gt;&lt;br /&gt;
  x_train = diabetes_X[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;]&lt;br /&gt;
  x_test = diabetes_X[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;:]&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Split the targets into training/testing sets&amp;lt;/font&amp;gt;&lt;br /&gt;
  y_train = diabetes.target[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;]&lt;br /&gt;
  y_test = diabetes.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;:]&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  lr = LinearRegression()&lt;br /&gt;
  lr.fit(x_train, y_train)&lt;br /&gt;
  predictions = lr.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# The mean squared error&amp;lt;/font&amp;gt;&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Mean squared error: %.2f&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
        % mean_squared_error(y_test, predictions))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Explained variance score: 1 is perfect prediction&amp;lt;/font&amp;gt;&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Variance score: %.2f'&amp;lt;/font&amp;gt; % r2_score(y_test, predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Mean squared error: 2548.07'''&lt;br /&gt;
    '''Variance score: 0.47'''&lt;br /&gt;
&lt;br /&gt;
Построение графика прямой, получившейся в результате работы линейной регрессии:&lt;br /&gt;
  plt.scatter(x_test, y_test,  color=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'black'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.plot(x_test, predictions, color=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'blue'&amp;lt;/font&amp;gt;, linewidth=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.xticks(())&lt;br /&gt;
  plt.yticks(())&lt;br /&gt;
  plt.show()&lt;br /&gt;
&lt;br /&gt;
[[File:Diabetes-sklearn.png|400px|none|super]]&lt;br /&gt;
&lt;br /&gt;
====Логистическая регрессия====&lt;br /&gt;
{{Main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn.datasets '''import''' load_digits&lt;br /&gt;
  digits = load_digits()&lt;br /&gt;
&lt;br /&gt;
Вывод первых трех тренировочных данных для визуализации:&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  &lt;br /&gt;
  plt.figure(figsize=(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;,&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;))&lt;br /&gt;
  '''for''' index, (image, label) '''in''' enumerate(zip(digits.data[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;], digits.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;])):&lt;br /&gt;
    plt.subplot(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;, index + &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
    plt.imshow(np.reshape(image, (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;8&amp;lt;/font&amp;gt;,&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;8&amp;lt;/font&amp;gt;)), cmap=plt.cm.gray)&lt;br /&gt;
    plt.title(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Training: %i\n'&amp;lt;/font&amp;gt; % label, fontsize = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
[[File:Digits-sklearn.png|800px|none|super]]&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  x_train, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' LogisticRegression&lt;br /&gt;
  lr = LogisticRegression()&lt;br /&gt;
  lr.fit(x_train, y_train)&lt;br /&gt;
  predictions = lr.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  score = lr.score(x_test, y_test)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % score)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Score: 0.953'''&lt;br /&gt;
&lt;br /&gt;
====Перцептрон====&lt;br /&gt;
{{Main|Нейронные сети, перцептрон}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  iris = datasets.load_iris()&lt;br /&gt;
  X = iris.data&lt;br /&gt;
  y = iris.target&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.20&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Трансформация признаков:&lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler&lt;br /&gt;
  scaler = StandardScaler()&lt;br /&gt;
  scaler.fit(X_train)&lt;br /&gt;
  X_train = scaler.transform(X_train)&lt;br /&gt;
  X_test = scaler.transform(X_test)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  '''from''' sklearn.neural_network '''import''' MLPClassifier&lt;br /&gt;
  mlp = MLPClassifier(hidden_layer_sizes=(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;), max_iter=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1000&amp;lt;/font&amp;gt;)&lt;br /&gt;
  mlp.fit(X_train, y_train.values.ravel())&lt;br /&gt;
  predictions = mlp.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' classification_report, confusion_matrix&lt;br /&gt;
  print(confusion_matrix(y_test,predictions))&lt;br /&gt;
  print(classification_report(y_test,predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''[[ 7  0  0]'''&lt;br /&gt;
     '''[ 0  8  1]'''&lt;br /&gt;
     '''[ 0  2 12]]'''&lt;br /&gt;
                  '''precision    recall  f1-score   support'''&lt;br /&gt;
  &lt;br /&gt;
               '''0       1.00      1.00      1.00         7'''&lt;br /&gt;
               '''1       0.80      0.89      0.84         9'''&lt;br /&gt;
               '''2       0.92      0.86      0.89        14'''&lt;br /&gt;
  &lt;br /&gt;
       '''micro avg       0.90      0.90      0.90        30'''&lt;br /&gt;
       '''macro avg       0.91      0.92      0.91        30'''&lt;br /&gt;
    '''weighted avg       0.90      0.90      0.90        30'''&lt;br /&gt;
&lt;br /&gt;
====Метрический классификатор и метод ближайших соседей====&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример использования (через scikit-learn)|l1=Метрический классификатор и метод ближайших соседей: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
====Дерево решений и случайный лес====&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Примеры использования (в scikit-learn)|l1=Дерево решений и случайный лес: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
====Обработка естественного языка====&lt;br /&gt;
{{Main|Обработка естественного языка}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' fetch_20newsgroups&lt;br /&gt;
  twenty_train = fetch_20newsgroups(subset=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'train'&amp;lt;/font&amp;gt;, shuffle='''True''', random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Вывод первых трех строк первого тренивочного файла и его класса:&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/font&amp;gt;.join(twenty_train.data[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;].split(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/font&amp;gt;)[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;]))&lt;br /&gt;
  print(twenty_train.target_names[twenty_train.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;]])&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''From: lerxst@wam.umd.edu (where's my thing)'''&lt;br /&gt;
    '''Subject: WHAT car is this!?'''&lt;br /&gt;
    '''Nntp-Posting-Host: rac3.wam.umd.edu'''&lt;br /&gt;
  &lt;br /&gt;
    '''rec.autos'''&lt;br /&gt;
&lt;br /&gt;
Построение и обучение двух моделей. Первая на основе [[Байесовская классификация | Байесовской классификации]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, а вторая использует метод опорных векторов:&lt;br /&gt;
  '''from''' sklearn.pipeline '''import''' Pipeline&lt;br /&gt;
  '''from''' sklearn.feature_extraction.text '''import''' CountVectorizer, TfidfTransformer&lt;br /&gt;
  &lt;br /&gt;
  '''from''' sklearn.naive_bayes '''import''' MultinomialNB&lt;br /&gt;
  text_clf1 = Pipeline([&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect'&amp;lt;/font&amp;gt;, CountVectorizer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf'&amp;lt;/font&amp;gt;, TfidfTransformer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf'&amp;lt;/font&amp;gt;, MultinomialNB()),&lt;br /&gt;
  ])&lt;br /&gt;
  &lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
  text_clf2 = Pipeline([&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect'&amp;lt;/font&amp;gt;, CountVectorizer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf'&amp;lt;/font&amp;gt;, TfidfTransformer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf'&amp;lt;/font&amp;gt;, SGDClassifier(loss=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'hinge'&amp;lt;/font&amp;gt;, penalty=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'l2'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                          alpha=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-3&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;,&lt;br /&gt;
                          max_iter=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, tol='''None''')),&lt;br /&gt;
  ])&lt;br /&gt;
  &lt;br /&gt;
  text_clf1.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
  text_clf2.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритмов:&lt;br /&gt;
  twenty_test = fetch_20newsgroups(subset=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'test'&amp;lt;/font&amp;gt;, shuffle='''True''', random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
  docs_test = twenty_test.data&lt;br /&gt;
  predicted1 = text_clf1.predict(docs_test)&lt;br /&gt;
  predicted2 = text_clf2.predict(docs_test)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % np.mean(predicted1 == twenty_test.target))&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % np.mean(predicted2 == twenty_test.target))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Score for naive Bayes: 0.774'''&lt;br /&gt;
    '''Score for SVM: 0.824'''&lt;br /&gt;
&lt;br /&gt;
====Кросс-валилация и подбор параметров====&lt;br /&gt;
{{Main|Кросс-валидация}}&lt;br /&gt;
&lt;br /&gt;
Возьмем предыдущий пример с обработкой естественного языка и попробуем увеличить точность алгоритма за счет кросс-валидации и подбора параметров:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
  parameters = {&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect__ngram_range'&amp;lt;/font&amp;gt;: [(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;), (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)],&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf__use_idf'&amp;lt;/font&amp;gt;: ('''True''', '''False'''),&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf__alpha'&amp;lt;/font&amp;gt;: (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-2&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-3&amp;lt;/font&amp;gt;),&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  gs_clf = GridSearchCV(text_clf2, parameters, cv=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, iid='''False''', n_jobs=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;)&lt;br /&gt;
  gs_clf = gs_clf.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
  &lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Best score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % gs_clf.best_score_)&lt;br /&gt;
  &lt;br /&gt;
  '''for''' param_name '''in''' sorted(parameters.keys()):&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;%s: %r&amp;quot;&amp;lt;/font&amp;gt; % (param_name, gs_clf.best_params_[param_name]))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Best score: 0.904'''&lt;br /&gt;
    '''clf__alpha: 0.001'''&lt;br /&gt;
    '''tfidf__use_idf: True'''&lt;br /&gt;
    '''vect__ngram_range: (1, 2)'''&lt;br /&gt;
&lt;br /&gt;
====Метод опорных векторов (SVM)====&lt;br /&gt;
{{Main|Метод опорных векторов (SVM)|l1=Метод опорных векторов (SVM) &amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  iris = datasets.load_iris()&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тестовый и тренировочный:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  clf = svm.SVC(kernel=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'linear'&amp;lt;/font&amp;gt;, C=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;)&lt;br /&gt;
  clf.fit(x_train, y_train)&lt;br /&gt;
  predictions = clf.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' classification_report, confusion_matrix&lt;br /&gt;
  print(confusion_matrix(y_test,predictions))&lt;br /&gt;
  print(classification_report(y_test,predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''[[13  0  0]'''&lt;br /&gt;
     '''[ 0 15  1]'''&lt;br /&gt;
     '''[ 0  0  9]]'''&lt;br /&gt;
                  '''precision    recall  f1-score   support'''&lt;br /&gt;
  &lt;br /&gt;
               '''0       1.00      1.00      1.00        13'''&lt;br /&gt;
               '''1       1.00      0.94      0.97        16'''&lt;br /&gt;
               '''2       0.90      1.00      0.95         9'''&lt;br /&gt;
  &lt;br /&gt;
       '''micro avg       0.97      0.97      0.97        38'''&lt;br /&gt;
       '''macro avg       0.97      0.98      0.97        38'''&lt;br /&gt;
    '''weighted avg       0.98      0.97      0.97        38'''&lt;br /&gt;
&lt;br /&gt;
====EM-алгоритм====&lt;br /&gt;
{{Main|EM-алгоритм|l1=EM-алгоритм&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  '''from''' matplotlib.colors '''import''' LogNorm&lt;br /&gt;
  '''from''' sklearn '''import''' mixture&lt;br /&gt;
  &lt;br /&gt;
  n_samples = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;300&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate random sample, two components&amp;lt;/font&amp;gt;&lt;br /&gt;
  np.random.seed(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate spherical data centered on (20, 20)&amp;lt;/font&amp;gt;&lt;br /&gt;
  shifted_gaussian = np.random.randn(n_samples, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;) + np.array([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate zero centered stretched Gaussian data&amp;lt;/font&amp;gt;&lt;br /&gt;
  C = np.array([[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-0.7&amp;lt;/font&amp;gt;], [&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3.5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;.7&amp;lt;/font&amp;gt;]])&lt;br /&gt;
  stretched_gaussian = np.dot(np.random.randn(n_samples, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;), C)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# concatenate the two datasets into the final training set&amp;lt;/font&amp;gt;&lt;br /&gt;
  X_train = np.vstack([shifted_gaussian, stretched_gaussian])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# fit a Gaussian Mixture Model with two components&amp;lt;/font&amp;gt;&lt;br /&gt;
  clf = mixture.GaussianMixture(n_components=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;, covariance_type=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'full'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  clf.fit(X_train)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# display predicted scores by the model as a contour plot&amp;lt;/font&amp;gt;&lt;br /&gt;
  x = np.linspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;30.&amp;lt;/font&amp;gt;)&lt;br /&gt;
  y = np.linspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;40.&amp;lt;/font&amp;gt;)&lt;br /&gt;
  X, Y = np.meshgrid(x, y)&lt;br /&gt;
  XX = np.array([X.ravel(), Y.ravel()]).T&lt;br /&gt;
  Z = -clf.score_samples(XX)&lt;br /&gt;
  Z = Z.reshape(X.shape)&lt;br /&gt;
  &lt;br /&gt;
  CS = plt.contour(X, Y, Z, norm=LogNorm(vmin=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;, vmax=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1000.0&amp;lt;/font&amp;gt;),&lt;br /&gt;
                   levels=np.logspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;))&lt;br /&gt;
  CB = plt.colorbar(CS, shrink=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.8&amp;lt;/font&amp;gt;, extend=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'both'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.scatter(X_train[:, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;], X_train[:, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;.8&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  plt.title(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Negative log-likelihood predicted by a GMM'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.axis(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tight'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.show()&lt;br /&gt;
&lt;br /&gt;
[[File:Em.png|400px|none|super]]&lt;br /&gt;
&lt;br /&gt;
====Уменьшение размерности====&lt;br /&gt;
{{Main|Уменьшение размерности#Пример кода scikit-learn|l1=Уменьшение размерности: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
==Tensorflow==&lt;br /&gt;
===Описание===&lt;br /&gt;
Tensorflow&amp;lt;ref&amp;gt;[https://www.tensorflow.org Библиотека Tensorflow]&amp;lt;/ref&amp;gt; {{---}} библиотека, разработанная корпорацией Google для работы с тензорами, используется для построения нейронных сетей. Поддержка вычислений на видеокартах имеет поддержку языка программирования C++. На основе данной библиотеки строятся более высокоуровневые библиотеки для работы с нейронными сетями на уровне целых слоев. Так, некоторое время назад популярная библиотека Keras стала использовать Tensorflow как основной бэкенд для вычислений вместо аналогичной библиотеки Theano. Для работы на видеокартах NVIDIA используется библиотека cuDNN. Если вы работаете с картинками (со сверточными нейросетями), скорее всего, придется использовать данную библиотеку.&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Сверточная нейронная сеть====&lt;br /&gt;
{{Main|Сверточные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Реализация сверточной нейронной сети для классификации цифр из датасета MNIST:&lt;br /&gt;
  '''from''' __future__ '''import''' division, print_function, absolute_import&lt;br /&gt;
  '''import''' tensorflow '''as''' tf&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Import MNIST data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''from''' tensorflow.examples.tutorials.mnist '''import''' input_data&lt;br /&gt;
  mnist = input_data.read_data_sets(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;/tmp/data/&amp;quot;&amp;lt;/font&amp;gt;, one_hot='''True''')&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Training Parameters&amp;lt;/font&amp;gt;&lt;br /&gt;
  learning_rate = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.001&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_steps = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;200&amp;lt;/font&amp;gt;&lt;br /&gt;
  batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;128&amp;lt;/font&amp;gt;&lt;br /&gt;
  display_step = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Network Parameters&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_input = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;784&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST data input (img shape: 28*28)&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_classes = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST total classes (0-9 digits)&amp;lt;/font&amp;gt;&lt;br /&gt;
  dropout = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.75&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Dropout, probability to keep units&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# tf Graph input&amp;lt;/font&amp;gt;&lt;br /&gt;
  X = tf.placeholder(tf.float32, ['''None''', num_input])&lt;br /&gt;
  Y = tf.placeholder(tf.float32, ['''None''', num_classes])&lt;br /&gt;
  keep_prob = tf.placeholder(tf.float32) &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# dropout (keep probability)&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Create some wrappers for simplicity&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''def''' conv2d(x, W, b, strides=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Conv2D wrapper, with bias and relu activation&amp;lt;/font&amp;gt;&lt;br /&gt;
    x = tf.nn.conv2d(x, W, strides=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, strides, strides, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'SAME'&amp;lt;/font&amp;gt;)&lt;br /&gt;
    x = tf.nn.bias_add(x, b)&lt;br /&gt;
    '''return''' tf.nn.relu(x)&lt;br /&gt;
  &lt;br /&gt;
  '''def''' maxpool2d(x, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MaxPool2D wrapper&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''return''' tf.nn.max_pool(x, ksize=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, k, k, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], strides=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, k, k, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;],&lt;br /&gt;
                          padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'SAME'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Create model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''def''' conv_net(x, weights, biases, dropout):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST data input is a 1-D vector of 784 features (28*28 pixels)&lt;br /&gt;
    # Reshape to match picture format [Height x Width x Channel]&lt;br /&gt;
    # Tensor input become 4-D: [Batch Size, Height, Width, Channel]&amp;lt;/font&amp;gt;&lt;br /&gt;
    x = tf.reshape(x, shape=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;28&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;28&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Convolution Layer&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv1 = conv2d(x, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc1'&amp;lt;/font&amp;gt;], biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc1'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Max Pooling (down-sampling)&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv1 = maxpool2d(conv1, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Convolution Layer&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv2 = conv2d(conv1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc2'&amp;lt;/font&amp;gt;], biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc2'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Max Pooling (down-sampling)&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv2 = maxpool2d(conv2, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Fully connected layer&lt;br /&gt;
    # Reshape conv2 output to fit fully connected layer input&amp;lt;/font&amp;gt;&lt;br /&gt;
    fc1 = tf.reshape(conv2, [&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;].get_shape().as_list()[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;]])&lt;br /&gt;
    fc1 = tf.add(tf.matmul(fc1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;]), biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bd1'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    fc1 = tf.nn.relu(fc1)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Apply Dropout&amp;lt;/font&amp;gt;&lt;br /&gt;
    fc1 = tf.nn.dropout(fc1, dropout)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Output, class prediction&amp;lt;/font&amp;gt;&lt;br /&gt;
    out = tf.add(tf.matmul(fc1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;]), biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    '''return''' out&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Store layers weight &amp;amp; bias&amp;lt;/font&amp;gt;&lt;br /&gt;
  weights = {&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 5x5 conv, 1 input, 32 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 5x5 conv, 32 inputs, 64 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc2'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# fully connected, 7*7*64 inputs, 1024 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;*&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;*&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 1024 inputs, 10 outputs (class prediction)&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;, num_classes]))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  biases = {&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc2'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bd1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([num_classes]))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Construct model&amp;lt;/font&amp;gt;&lt;br /&gt;
  logits = conv_net(X, weights, biases, keep_prob)&lt;br /&gt;
  prediction = tf.nn.softmax(logits)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Define loss and optimizer&amp;lt;/font&amp;gt;&lt;br /&gt;
  loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(&lt;br /&gt;
    logits=logits, labels=Y))&lt;br /&gt;
  optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)&lt;br /&gt;
  train_op = optimizer.minimize(loss_op)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Evaluate model&amp;lt;/font&amp;gt;&lt;br /&gt;
  correct_pred = tf.equal(tf.argmax(prediction, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;), tf.argmax(Y, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Initialize the variables (i.e. assign their default value)&amp;lt;/font&amp;gt;&lt;br /&gt;
  init = tf.global_variables_initializer()&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Start training&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''with''' tf.Session() '''as''' sess:&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Run the initializer&amp;lt;/font&amp;gt;&lt;br /&gt;
    sess.run(init)&lt;br /&gt;
    '''for''' step '''in''' '''range'''(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, num_steps+&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;):&lt;br /&gt;
      batch_x, batch_y = mnist.train.next_batch(batch_size)&lt;br /&gt;
      &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Run optimization op (backprop)&amp;lt;/font&amp;gt;&lt;br /&gt;
      sess.run(train_op, feed_dict={X: batch_x, Y: batch_y, keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.8&amp;lt;/font&amp;gt;})&lt;br /&gt;
      '''if''' step % display_step == &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt; '''or''' step == &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;:&lt;br /&gt;
        &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Calculate batch loss and accuracy&amp;lt;/font&amp;gt;&lt;br /&gt;
        loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x,&lt;br /&gt;
                                                             Y: batch_y,&lt;br /&gt;
                                                             keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;})&lt;br /&gt;
        print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Step &amp;quot;&amp;lt;/font&amp;gt; + str(step) + &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;, Minibatch Loss= &amp;quot;&amp;lt;/font&amp;gt; + \&lt;br /&gt;
              &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;{:.4f}&amp;quot;&amp;lt;/font&amp;gt;.format(loss) + &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;, Training Accuracy= &amp;quot;&amp;lt;/font&amp;gt; + \&lt;br /&gt;
              &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;{:.3f}&amp;quot;&amp;lt;/font&amp;gt;.format(acc))&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Optimization Finished!&amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Calculate accuracy for 256 MNIST test images&amp;lt;/font&amp;gt;&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Testing Accuracy:&amp;quot;&amp;lt;/font&amp;gt;, \&lt;br /&gt;
      sess.run(accuracy, feed_dict={X: mnist.test.images[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;256&amp;lt;/font&amp;gt;],&lt;br /&gt;
                                    Y: mnist.test.labels[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;256&amp;lt;/font&amp;gt;],&lt;br /&gt;
                                    keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;}))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Step 1, Minibatch Loss= 41724.0586, Training Accuracy= 0.156'''&lt;br /&gt;
    '''Step 10, Minibatch Loss= 17748.7500, Training Accuracy= 0.242'''&lt;br /&gt;
    '''Step 20, Minibatch Loss= 8307.6162, Training Accuracy= 0.578'''&lt;br /&gt;
    '''Step 30, Minibatch Loss= 3108.5703, Training Accuracy= 0.766'''&lt;br /&gt;
    '''Step 40, Minibatch Loss= 3273.2749, Training Accuracy= 0.727'''&lt;br /&gt;
    '''Step 50, Minibatch Loss= 2754.2861, Training Accuracy= 0.820'''&lt;br /&gt;
    '''Step 60, Minibatch Loss= 2467.7925, Training Accuracy= 0.844'''&lt;br /&gt;
    '''Step 70, Minibatch Loss= 1423.8140, Training Accuracy= 0.914'''&lt;br /&gt;
    '''Step 80, Minibatch Loss= 1651.4656, Training Accuracy= 0.875'''&lt;br /&gt;
    '''Step 90, Minibatch Loss= 2105.9263, Training Accuracy= 0.867'''&lt;br /&gt;
    '''Step 100, Minibatch Loss= 1153.5090, Training Accuracy= 0.867'''&lt;br /&gt;
    '''Step 110, Minibatch Loss= 1751.1400, Training Accuracy= 0.898'''&lt;br /&gt;
    '''Step 120, Minibatch Loss= 1446.2119, Training Accuracy= 0.922'''&lt;br /&gt;
    '''Step 130, Minibatch Loss= 1403.7135, Training Accuracy= 0.859'''&lt;br /&gt;
    '''Step 140, Minibatch Loss= 1089.7897, Training Accuracy= 0.930'''&lt;br /&gt;
    '''Step 150, Minibatch Loss= 1147.0751, Training Accuracy= 0.898'''&lt;br /&gt;
    '''Step 160, Minibatch Loss= 1963.3733, Training Accuracy= 0.883'''&lt;br /&gt;
    '''Step 170, Minibatch Loss= 1544.2725, Training Accuracy= 0.859'''&lt;br /&gt;
    '''Step 180, Minibatch Loss= 977.9219, Training Accuracy= 0.914'''&lt;br /&gt;
    '''Step 190, Minibatch Loss= 857.7977, Training Accuracy= 0.930'''&lt;br /&gt;
    '''Step 200, Minibatch Loss= 430.4735, Training Accuracy= 0.953'''&lt;br /&gt;
    '''Optimization Finished!'''&lt;br /&gt;
    '''Testing Accuracy: 0.94140625'''&lt;br /&gt;
&lt;br /&gt;
==Keras==&lt;br /&gt;
===Описание===&lt;br /&gt;
Keras&amp;lt;ref&amp;gt;[https://keras.io Библиотека Keras]&amp;lt;/ref&amp;gt; {{---}} библиотека для построения нейронных сетей, поддерживающая основные виды слоев и структурные элементы. Поддерживает как рекуррентные, так и сверточные нейросети, имеет в своем составе реализацию известных архитектур нейросетей (например, VGG16). Некоторое время назад слои из данной библиотеки стали доступны внутри библиотеки Tensorflow. Существуют готовые функции для работы с изображениями и текстом. Интегрирована в Apache Spark с помощью дистрибутива dist-keras. Данная библиотека позволяет на более высоком уровне работать с нейронными сетями. В качестве библиотеки для бэкенда может использоваться как Tensorflow, так и Theano.&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Сверточная нейронная сеть====&lt;br /&gt;
{{Main|Сверточные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Реализация сверточной нейронной сети для классификации текста:&lt;br /&gt;
  '''from''' __future__ '''import''' print_function&lt;br /&gt;
  '''from''' keras.preprocessing '''import''' sequence&lt;br /&gt;
  '''from''' keras.models '''import''' Sequential&lt;br /&gt;
  '''from''' keras.layers '''import''' Dense, Dropout, Activation&lt;br /&gt;
  '''from''' keras.layers '''import''' Embedding&lt;br /&gt;
  '''from''' keras.layers '''import''' Conv1D, GlobalMaxPooling1D&lt;br /&gt;
  '''from''' keras.datasets '''import''' imdb&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# set parameters:&amp;lt;/font&amp;gt;&lt;br /&gt;
  max_features = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5000&amp;lt;/font&amp;gt;&lt;br /&gt;
  maxlen = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;400&amp;lt;/font&amp;gt;&lt;br /&gt;
  batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;&lt;br /&gt;
  embedding_dims = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;50&amp;lt;/font&amp;gt;&lt;br /&gt;
  filters = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;250&amp;lt;/font&amp;gt;&lt;br /&gt;
  kernel_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;&lt;br /&gt;
  hidden_dims = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;250&amp;lt;/font&amp;gt;&lt;br /&gt;
  epochs = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)&lt;br /&gt;
  print(len(x_train), &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'train sequences'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  print(len(x_test), &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'test sequences'&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''25000 train sequences'''&lt;br /&gt;
    '''25000 test sequences'''&lt;br /&gt;
&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Pad sequences (samples x time)'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  x_train = sequence.pad_sequences(x_train, maxlen=maxlen)&lt;br /&gt;
  x_test = sequence.pad_sequences(x_test, maxlen=maxlen)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'x_train shape:'&amp;lt;/font&amp;gt;, x_train.shape)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'x_test shape:'&amp;lt;/font&amp;gt;, x_test.shape)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Pad sequences (samples x time)'''&lt;br /&gt;
    '''x_train shape: (25000, 400)'''&lt;br /&gt;
    '''x_test shape: (25000, 400)'''&lt;br /&gt;
&lt;br /&gt;
  model = Sequential()&lt;br /&gt;
  &lt;br /&gt;
  model.add(Embedding(max_features,&lt;br /&gt;
                      embedding_dims,&lt;br /&gt;
                      input_length=maxlen))&lt;br /&gt;
  model.add(Dropout(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))  &lt;br /&gt;
  model.add(Conv1D(filters,&lt;br /&gt;
                   kernel_size,&lt;br /&gt;
                   padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'valid'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                   activation=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'relu'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                   strides=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(GlobalMaxPooling1D())&lt;br /&gt;
  model.add(Dense(hidden_dims))&lt;br /&gt;
  model.add(Dropout(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Activation(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'relu'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Dense(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Activation(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'sigmoid'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &lt;br /&gt;
  model.compile(loss=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'binary_crossentropy'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                optimizer=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'adam'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                metrics=[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'accuracy'&amp;lt;/font&amp;gt;])&lt;br /&gt;
  model.fit(x_train, y_train,&lt;br /&gt;
            batch_size=batch_size,&lt;br /&gt;
            epochs=epochs,&lt;br /&gt;
            validation_data=(x_test, y_test))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Train on 25000 samples, validate on 25000 samples'''&lt;br /&gt;
    '''Epoch 1/2'''&lt;br /&gt;
    '''25000/25000 [==============================] - 136s 5ms/step - loss: 0.4107 - acc: 0.7923 - val_loss: 0.2926 - val_acc: 0.8746'''&lt;br /&gt;
    '''Epoch 2/2'''&lt;br /&gt;
    '''25000/25000 [==============================] - 136s 5ms/step - loss: 0.2294 - acc: 0.9082 - val_loss: 0.3200 - val_acc: 0.8652'''&lt;br /&gt;
&lt;br /&gt;
==Другие библиотеки для машинного обучения на Python==&lt;br /&gt;
===Вспомогательные библиотеки===&lt;br /&gt;
* NumPy&amp;lt;ref&amp;gt;[http://www.numpy.org Библиотека NumPy]&amp;lt;/ref&amp;gt; {{---}} библиотека, добавляющая поддержку больших многомерных массивов и матриц вместе с большой библиотекой  высокоуровневых математических функций для операций с этими массивами. Данная библиотека предоставляет реализации вычислительных алгоритмов (в виде функций и операторов), оптимизированные для работы с многомерными массивами. В результате любой алгоритм, который может быть выражен в виде последовательности операций над массивами (матрицами) и реализованный с использованием NumPy, работает так же быстро, как эквивалентный код, выполняемый в MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/products/matlab.html MATLAB]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* SciPy&amp;lt;ref&amp;gt;[https://www.scipy.org Библиотека SciPy]&amp;lt;/ref&amp;gt; {{---}} открытая библиотека высококачественных научных инструментов для языка программирования Python. SciPy содержит модули для оптимизации, интегрирования, специальных функций, обработки сигналов, обработки изображений, генетических алгоритмов, решения обыкновенных дифференциальных уравнений и других задач, обычно решаемых в науке и при инженерной разработке;&lt;br /&gt;
* Pandas&amp;lt;ref&amp;gt;[https://pandas.pydata.org Библиотека Pandas]&amp;lt;/ref&amp;gt; {{---}} библиотека Python, которая является мощным инструментом для анализа данных. Пакет дает возможность строить сводные таблицы, выполнять группировки, предоставляет удобный доступ к табличным данным и позволяет строить графики на полученных наборах данных при помощи библиотеки Matplotlib;&lt;br /&gt;
* Matplotlib&amp;lt;ref&amp;gt;[https://matplotlib.org Библиотека Matplotlib]&amp;lt;/ref&amp;gt; {{---}} библиотека Python для построения качественных двумерных графиков. Matplotlib является гибким, легко конфигурируемым пакетом, который вместе с NumPy, SciPy и IPython&amp;lt;ref&amp;gt;[https://ipython.org IPython Notebook]&amp;lt;/ref&amp;gt; предоставляет возможности, подобные MATLAB.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для глубокого обучения===&lt;br /&gt;
* PyTorch&amp;lt;ref&amp;gt;[https://pytorch.org Библиотека PyTorch]&amp;lt;/ref&amp;gt; {{---}} библиотека для глубокого обучения, созданная на базе Torch&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Torch_(machine_learning) Torch]&amp;lt;/ref&amp;gt; и развиваемая компанией Facebook. Две ключевые функциональности данной библиотеки {{---}} тензорные вычисления с развитой поддержкой ускорения на GPU и глубокие нейронные сети на базе системы autodiff;&lt;br /&gt;
* Theano&amp;lt;ref&amp;gt;[http://deeplearning.net/software/theano/ Библиотека Theano]&amp;lt;/ref&amp;gt; {{---}} расширение языка программирования Python, позволяющее эффективно вычислять математические выражения, содержащие многомерные массивы. Библиотека предоставляет базовый набор инструментов для конфигурации нейронных сетей и их обучения. Наибольшее признание данная библиотека получила в задачах машинного обучения при решении задач оптимизации. Она позволяет использовать возможности GPU без изменения кода программы, что делает ее незаменимой при выполнении ресурсоемких задач;&lt;br /&gt;
* Caffe&amp;lt;ref&amp;gt;[http://caffe.berkeleyvision.org Библиотека Caffe]&amp;lt;/ref&amp;gt; {{---}} фреймворк для обучения нейронных сетей, созданный университетом Беркли. Как и Tensorflow, использует cuDNN для работы с видеокартами NVIDIA;&lt;br /&gt;
* Microsoft Cognitive Toolkit (CNTK)&amp;lt;ref&amp;gt;[https://www.microsoft.com/en-us/cognitive-toolkit/ Библиотека CNTK]&amp;lt;/ref&amp;gt; {{---}} фреймворк от корпорации Microsoft, предоставляющий реализации архитектур различных нейронных сетей.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для обработки естественного языка===&lt;br /&gt;
* NLTK&amp;lt;ref&amp;gt;[https://www.nltk.org Библиотека NLTK]&amp;lt;/ref&amp;gt; {{---}} пакет библиотек и программ для символьной и статистической обработки естественного языка, написанных на языке программирования Python;&lt;br /&gt;
* Gensim&amp;lt;ref&amp;gt;[https://radimrehurek.com/gensim/ Библиотека Gensim]&amp;lt;/ref&amp;gt; {{---}} инструмент для автоматической обработки языка, основанный на машинном обучении. В Gensim реализованы алгоритмы дистрибутивной семантики word2vec и doc2vec, он позволяет решать задачи тематического моделирования и выделять основные темы текста или документа.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для градиентного бустинга===&lt;br /&gt;
* [[XGBoost|Xgboost]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&amp;lt;ref&amp;gt;[https://xgboost.readthedocs.io/en/latest/python/index.html Библиотека Xgboost]&amp;lt;/ref&amp;gt; {{---}} библиотека с реализацией градиентного бустинга, которая для выбора разбиения использует сортировку и модели, основанные на анализе гистограмм;&lt;br /&gt;
* LightGBM&amp;lt;ref&amp;gt;[http://www.dmtk.io Библиотека LightGBM]&amp;lt;/ref&amp;gt; {{---}} фреймворк с реализацией градиентного бустинга от корпорации Microsoft. Является частью проекта Microsoft DMTK, посвященного реализации подходов машинного обучения для .Net;&lt;br /&gt;
* [[CatBoost|CatBoost]]&amp;lt;ref&amp;gt;[https://catboost.ai Библиотека CatBoost]&amp;lt;/ref&amp;gt; {{---}} библиотека с градиентным бустингом от компании Яндекс, в которой реализуется особый подход к обработке категориальных признаков, основанный на подмене категориальных признаков статистиками на основе предсказываемого значения.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70938</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70938"/>
				<updated>2019-04-09T00:15:13Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия#Пример на языке Java}}&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java}}&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java_2}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон#Пример на языке Java}}&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети#Пример на языке Java}}&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память#Пример на языке Java}}&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)#Пример на языке Java}}&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%80%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=70937</id>
		<title>Рекуррентные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BA%D1%83%D1%80%D1%80%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B5_%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=70937"/>
				<updated>2019-04-09T00:15:08Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: /* Пример кода */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Рекуррентная нейронная сеть''' (англ. ''recurrent neural network'', ''RNN'') {{---}} вид [[:Нейронные_сети,_перцептрон|нейронных сетей]], где связи между элементами образуют направленную последовательность.&lt;br /&gt;
&lt;br /&gt;
== Описание ==&lt;br /&gt;
[[File:RNN.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ RNN и ее развернутое представление]]]&lt;br /&gt;
[[File:RNN_layer.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Схема слоя рекуррентной сети]]]&lt;br /&gt;
Рекуррентные нейронные сети {{---}} сети с циклами, которые хорошо подходят для обработки последовательностей.&lt;br /&gt;
[[File:RNN_BP.jpg|450px|thumb|RNN с задержкой на скрытом слое]]&lt;br /&gt;
[[File:RNN_BPTT.jpg|450px|thumb|Развертка RNN]]&lt;br /&gt;
Обучение RNN аналогично обучению обычной нейронной сети. Мы также используем [[:Обратное_распространение_ошибки|алгоритм обратного распространения ошибки (backpropagation)]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, но с небольшим изменением. Поскольку одни и те же параметры используются на всех временных этапах в сети, градиент на каждом выходе зависит не только от расчетов текущего шага, но и от предыдущих временных шагов. Например, чтобы вычислить градиент для четвертого элемента последовательности, нам нужно было бы «распространить ошибку» на 3 шага и суммировать градиенты. Этот алгоритм называется «алгоритмом обратного распространения ошибки сквозь время» (англ. Backpropagation Through Time, BPTT).&amp;lt;ref name=BPTT_1&amp;gt;[http://andrew.gibiansky.com/blog/machine-learning/recurrent-neural-networks/ Backpropagation Through Time]&amp;lt;/ref&amp;gt;&amp;lt;ref name=BPTT_2&amp;gt;[http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/ Backpropagation Through Time]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Алгоритм обратного распространения ошибки сквозь время:&lt;br /&gt;
&lt;br /&gt;
[[File:RNN_BPTT_GRAD.png|400px|frameless]]&lt;br /&gt;
&lt;br /&gt;
== Области и примеры применения ==&lt;br /&gt;
Используются, когда важно соблюдать последовательность, когда важен порядок поступающих объектов.&lt;br /&gt;
* Обработка текста на естественном языке:&lt;br /&gt;
** Анализ текста;&lt;br /&gt;
** Автоматический перевод;&lt;br /&gt;
* Обработка аудио:&lt;br /&gt;
** Автоматическое распознавание речи;&lt;br /&gt;
* Обработка видео:&lt;br /&gt;
** Прогнозирование следующего кадра на основе предыдущих;&lt;br /&gt;
** Распознавание эмоций;&lt;br /&gt;
* Обработка изображений:&lt;br /&gt;
** Прогнозирование следующего пикселя на основе окружения;&lt;br /&gt;
** Генерация описания изображений.&lt;br /&gt;
&lt;br /&gt;
== Виды RNN ==&lt;br /&gt;
=== Один к одному ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_OTO.jpg|100px|left]]&lt;br /&gt;
|Архитектура по сути является обычной нейронной сетью.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Один ко многим ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_OTM.jpg|100px|left]]&lt;br /&gt;
|Один вход ко многим выходам может применяться, например, для генерации аудиозаписи. На вход подаем жанр музыки, который хотим получить, на выходе получаем последовательность аудиозаписи.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Многие к одному ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_MTO.jpg|100px|left]]&lt;br /&gt;
|Много входов и один выход может применяться, если мы хотим оценить тональность рецензии. На вход подаем слова рецензии, на выходе получаем оценку ее тональности: позитивная рецензия или негативная.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Многие ко многим ===&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_MTM1.jpg|100px|left]]&lt;br /&gt;
|Данную архитектуру можно использовать для перевода текста с одного языка на другой.&lt;br /&gt;
|-&lt;br /&gt;
|[[File:RNN_MTM2.jpg|100px|left]]&lt;br /&gt;
|Такой вариант подойдет для определения для классификации каждого слова в предложении в зависимости от контекста.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Архитектуры ==&lt;br /&gt;
=== Полностью рекуррентная сеть ===&lt;br /&gt;
Это базовая архитектура, разработанная в 1980-х. Сеть строится из узлов, каждый из которых соединён со всеми другими узлами. У каждого нейрона порог активации меняется со временем и является вещественным числом. Каждое соединение имеет переменный вещественный вес. Узлы разделяются на входные, выходные и скрытые.&lt;br /&gt;
&lt;br /&gt;
=== Рекурсивная сеть ===&lt;br /&gt;
[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией.&lt;br /&gt;
&lt;br /&gt;
=== Нейронная сеть Хопфилда ===&lt;br /&gt;
Тип рекуррентной сети, когда все соединения симметричны. Изобретена Джоном Хопфилдом в 1982 году и гарантируется, что динамика такой сети сходится к одному из положений равновесия.&lt;br /&gt;
&lt;br /&gt;
=== Двунаправленная ассоциативная память (BAM) ===&lt;br /&gt;
Вариацией сети Хопфилда является двунаправленная ассоциативная память (BAM). BAM имеет два слоя, каждый из которых может выступать в качестве входного, находить (вспоминать) ассоциацию и генерировать результат для другого слоя.&lt;br /&gt;
[[File:Elman_RNN.jpg|450px|thumb|Сеть Элмана]]&lt;br /&gt;
&lt;br /&gt;
=== Сеть Элмана ===&lt;br /&gt;
Нейронная сеть Элмана состоит из трёх слоев: x, y, z (см рис. Сеть Элмана). Дополнительно к сети добавлен набор «контекстных блоков»: u (см рис. Сеть Элмана). Средний (скрытый) слой соединён с контекстными блоками с фиксированным весом, равным единице. С каждым шагом времени на вход поступает информация, которая проходит прямой ход к выходному слою в соответствии с правилами обучения. Фиксированные обратные связи сохраняют предыдущие значения скрытого слоя в контекстных блоках (до того как скрытый слой поменяет значение в процессе обучения). Таким способом сеть сохраняет своё состояние, что может использоваться в предсказании последовательностей, выходя за пределы мощности многослойного перцептрона.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h_t = \sigma_h(W_h x_t + U_h h_{t-1} + b_h)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y_t = \sigma_y(W_y h_t + b_y)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Обозначения переменных и функций:&lt;br /&gt;
* &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt;: вектор входного слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;h_t&amp;lt;/math&amp;gt;: вектор скрытого слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;y_t&amp;lt;/math&amp;gt;: вектор выходного слоя;&lt;br /&gt;
* &amp;lt;math&amp;gt;W, U, b&amp;lt;/math&amp;gt;: матрица и вектор параметров;&lt;br /&gt;
* &amp;lt;math&amp;gt;\sigma_h, \sigma_y&amp;lt;/math&amp;gt;: функция активации.&lt;br /&gt;
&lt;br /&gt;
=== Сеть Джордана ===&lt;br /&gt;
Нейронная сеть Джордана подобна сети Элмана, но контекстные блоки связаны не со скрытым слоем, а с выходным слоем. Контекстные блоки таким образом сохраняют своё состояние. Они обладают рекуррентной связью с собой.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h_t = \sigma_h(W_h x_t + U_h y_{t-1} + b_h)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;y_t = \sigma_y(W_y h_t + b_y)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
=== Эхо-сети ===&lt;br /&gt;
Эхо-сеть (англ. Echo State Network, ESN) характеризуется одним скрытым слоем (который называется резервуаром) со случайными редкими связями между нейронами. При этом связи внутри резервуара фиксированы, но связи с выходным слоем подлежат обучению. Состояние резервуара (state) вычисляется через предыдущие состояния резервуара, а также предыдущие состояния входного и выходного сигналов. Так как эхо-сети обладают только одним скрытым слоем, они обладают достаточно низкой вычислительной сложностью.&lt;br /&gt;
&lt;br /&gt;
=== Нейронный компрессор истории ===&lt;br /&gt;
Нейронный компрессор исторических данных {{---}} это блок, позволяющий в сжатом виде хранить существенные исторические особенности процесса, который является своего рода стеком рекуррентной нейронной сети, формируемым в процессе самообучения.&lt;br /&gt;
[[File:LSTM.png|450px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Схема слоев рекуррентной сети долго-краткосрочной памяти]]]&lt;br /&gt;
&lt;br /&gt;
=== Сети долго-краткосрочной памяти ===&lt;br /&gt;
[[:Долгая_краткосрочная_память|Сеть долго-краткосрочной памяти]] (англ. Long short-term memory, LSTM) является самой популярной архитектурой рекуррентной нейронной сети на текущий момент, такая архитектура способна запоминать данные на долгое время.&amp;lt;ref name=LSTM&amp;gt;[https://www.bioinf.jku.at/publications/older/2604.pdf Sepp Hochreiter, Jurgen Schmidhuber. Long short-term memory (1997). Neural Computation.]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Управляемые рекуррентные блоки ===&lt;br /&gt;
Управляемые рекуррентные блоки (англ. Gated Recurrent Units, GRU) {{---}} обладает меньшим количеством параметров, чем у LSTM, и в ней отсутствует выходное управление. При этом производительность в моделях речевого сигнала или полифонической музыки оказалась сопоставимой с LSTM.&lt;br /&gt;
&lt;br /&gt;
== Пример кода ==&lt;br /&gt;
===Пример кода на Python с использованием библиотеки Keras.&amp;lt;ref name=KerasRNN&amp;gt;[https://keras.io/layers/recurrent/ Keras RNN]&amp;lt;/ref&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Импорты&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''from''' keras.preprocessing '''import''' sequence&lt;br /&gt;
  '''from''' keras.models '''import''' Sequential&lt;br /&gt;
  '''from''' keras.layers '''import''' Dense, Activation, Embedding&lt;br /&gt;
  '''from''' keras.layers '''import''' LSTM&lt;br /&gt;
  '''from''' keras.datasets '''import''' imdb&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Устанавливаем seed для обеспечения повторяемости результатов&amp;lt;/font&amp;gt;&lt;br /&gt;
  np.random.seed(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Указываем количество слов из частотного словаря, которое будет использоваться (отсортированы по частоте использования)&amp;lt;/font&amp;gt;&lt;br /&gt;
  max_features = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5000&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Загружаем данные (датасет IMDB содержит 25000 рецензий на фильмы с правильным ответом для обучения и 25000 рецензий на фильмы с правильным ответом для тестирования)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words = max_features)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Устанавливаем максимальную длину рецензий в словах, чтобы они все были одной длины&amp;lt;/font&amp;gt;&lt;br /&gt;
  maxlen = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;80&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Заполняем короткие рецензии пробелами, а длинные обрезаем&amp;lt;/font&amp;gt;&lt;br /&gt;
  X_train = sequence.pad_sequences(X_train, maxlen = maxlen)&lt;br /&gt;
  X_test = sequence.pad_sequences(X_test, maxlen = maxlen)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Создаем модель последовательной сети&amp;lt;/font&amp;gt;&lt;br /&gt;
  model = Sequential()&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем слой для векторного представления слов (5000 слов, каждое представлено вектором из 32 чисел, отключаем входной сигнал с вероятностью 20% для предотвращения переобучения)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(Embedding(max_features, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;, dropout = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем слой долго-краткосрочной памяти (100 элементов для долговременного хранения информации, отключаем входной сигнал с вероятностью 20%, отключаем рекуррентный сигнал с вероятностью 20%)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(LSTM(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;100&amp;lt;/font&amp;gt;, dropout_W = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;, dropout_U = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем полносвязный слой из 1 элемента для классификации, в качестве функции активации будем использовать сигмоидальную функцию&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(Dense(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, activation = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'sigmoid'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Компилируем модель нейронной сети&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.compile(loss = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'binary_crossentropy'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                optimizer = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'adam'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                metrics = [&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'accuracy'&amp;lt;/font&amp;gt;])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Обучаем нейронную сеть (данные для обучения, ответы к данным для обучения, количество рецензий после анализа которого будут изменены веса, число эпох обучения, тестовые данные, показывать progress bar или нет)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.fit(X_train, y_train, &lt;br /&gt;
            batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;,&lt;br /&gt;
            nb_epoch = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;,&lt;br /&gt;
            validation_data = (X_test, y_test),&lt;br /&gt;
            verbose = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Проверяем качество обучения на тестовых данных (если есть данные, которые не участвовали в обучении, лучше использовать их, но в нашем случае таковых нет)&amp;lt;/font&amp;gt;&lt;br /&gt;
  scores = model.evaluate(X_test, y_test, batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Точность на тестовых данных: %.2f%%'&amp;lt;/font&amp;gt; % (scores[1] * &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;100&amp;lt;/font&amp;gt;))&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Сверточные_нейронные_сети|Сверточные нейронные сети]]&lt;br /&gt;
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]&lt;br /&gt;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Нейронные сети]]&lt;br /&gt;
[[Категория: Рекуррентные нейронные сети]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%BE%D0%BB%D0%B3%D0%B0%D1%8F_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE%D1%81%D1%80%D0%BE%D1%87%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C&amp;diff=70936</id>
		<title>Долгая краткосрочная память</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%BE%D0%BB%D0%B3%D0%B0%D1%8F_%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE%D1%81%D1%80%D0%BE%D1%87%D0%BD%D0%B0%D1%8F_%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D1%8C&amp;diff=70936"/>
				<updated>2019-04-09T00:14:13Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: /* Примеры кода */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Долгая краткосрочная память''' (англ. ''Long short-term memory'', ''LSTM'') {{---}} особая разновидность архитектуры [[:Рекуррентные_нейронные_сети|рекуррентных нейронных сетей]], способная к обучению долговременным зависимостям, предложенная в 1997 году Сеппом Хохрайтером и Юргеном Шмидхубером&amp;lt;ref name=LSTM&amp;gt;[https://www.bioinf.jku.at/publications/older/2604.pdf Sepp Hochreiter, Jurgen Schmidhuber. Long short-term memory (1997). Neural Computation.]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Описание ==&lt;br /&gt;
[[File:LSTM.png|650px|thumb|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Схема слоев долго-краткосрочной памяти]]]&lt;br /&gt;
[[:Рекуррентные_нейронные_сети|Рекуррентные нейронные сети]] добавляют память к искуственным нейронным сетям, но реализуемая память получается короткой {{---}} на каждом шаге обучения информация в памяти смешивается с новой и через несколько итераций полностью перезаписывается.&lt;br /&gt;
&lt;br /&gt;
LSTM-модули разработаны специально, чтобы избежать проблемы долговременной зависимости, запоминая значения как на короткие, так и на длинные промежутки времени. Это объясняется тем, что LSTM-модуль не использует функцию активации внутри своих рекуррентных компонентов. Таким образом, хранимое значение не размывается во времени и градиент не исчезает при использовании метода обратного распространения ошибки во времени (англ. Backpropagation Through Time, BPTT)&amp;lt;ref name=BPTT_1&amp;gt;[http://andrew.gibiansky.com/blog/machine-learning/recurrent-neural-networks/ Backpropagation Through Time]&amp;lt;/ref&amp;gt;&amp;lt;ref name=BPTT_2&amp;gt;[http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/ Backpropagation Through Time]&amp;lt;/ref&amp;gt; при тренировке сети.&lt;br /&gt;
&lt;br /&gt;
Ключевые компоненты LSTM-модуля: состояние ячейки и различные фильтры. О состоянии ячейки можно говорить, как о памяти сети, которая передает соответствующую информацию по всей цепочке модулей. Таким образом, даже информация из ранних временных шагов может быть получена на более поздних, нивелируя эффект кратковременной памяти. &lt;br /&gt;
[[File:Lstm-cell-state.png|none|250px|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Состояние ячейки]]] &lt;br /&gt;
По мере того, как происходит обучение, состояние ячейки изменяется, информация добавляется или удаляется из состояния ячейки структурами, называемыми фильтрами. Фильтры контролируют поток информации на входах и на выходах модуля на основании некоторых условий. Они состоят из слоя сигмоидальной&amp;lt;ref name=Sigmoid_function&amp;gt;[https://en.wikipedia.org/wiki/Sigmoid_function Сигмоида.]&amp;lt;/ref&amp;gt; нейронной сети и операции поточечного умножения.&lt;br /&gt;
[[File:Lstm-gates.png|none|100px|[http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Фильтры]]]&lt;br /&gt;
Сигмоидальный слой возвращает числа в диапазоне [0; 1], которые обозначают, какую долю каждого блока информации следует пропустить дальше по сети. Умножение на это значение используется для пропуска или запрета потока информации внутрь и наружу памяти. Например, входной фильтр контролирует меру вхождения нового значения в память, а фильтр забывания контролирует меру сохранения значения в памяти. Выходной фильтр контролирует меру того, в какой степени значение, находящееся в памяти, используется при расчёте выходной функции активации.&lt;br /&gt;
&lt;br /&gt;
== Основные компоненты ==&lt;br /&gt;
* Состояние ячейки&lt;br /&gt;
* Фильтры, контролирующие состояние ячейки&lt;br /&gt;
** Забывания&lt;br /&gt;
** Входной&lt;br /&gt;
** Выходной&lt;br /&gt;
&lt;br /&gt;
== Принцип работы ==&lt;br /&gt;
&lt;br /&gt;
Сперва “слой фильтра забывания” (англ. ''forget gate layer'') определяет, какую информацию можно забыть или оставить. Значения предыдущего выхода &amp;lt;math&amp;gt;h_{t-1}&amp;lt;/math&amp;gt; и текущего входа &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; пропускаются через сигмоидальный слой. Полученные значения находятся в диапозоне [0; 1]. Значения, которые ближе к 0 будут забыты, а к 1 оставлены.&lt;br /&gt;
[[File:Lstm-1.png|none|650px]]&lt;br /&gt;
&lt;br /&gt;
Далее решается, какая новая информация будет храниться в состоянии ячейки. Этот этап состоит из двух частей. Сначала сигмоидальный слой под названием “слой входного фильтра” (англ. ''input layer gate'') определяет, какие значения следует обновить. Затем tanh-слой&amp;lt;ref name=Hyperbolic_function&amp;gt;[https://en.wikipedia.org/wiki/Hyperbolic_function Гиперболические функции.]&amp;lt;/ref&amp;gt; строит вектор новых значений-кандидатов &amp;lt;math&amp;gt;\tilde{C}_t&amp;lt;/math&amp;gt;, которые можно добавить в состояние ячейки.&lt;br /&gt;
[[File:Lstm-2.png|none|650px]]&lt;br /&gt;
&lt;br /&gt;
Для замены старого состояния ячейки &amp;lt;math&amp;gt;C_{t-1}&amp;lt;/math&amp;gt; на новое состояние &amp;lt;math&amp;gt;C_t&amp;lt;/math&amp;gt;. Необходимо умножить старое состояние на &amp;lt;math&amp;gt;f_t&amp;lt;/math&amp;gt;, забывая то, что решили забыть ранее. Затем прибавляем &amp;lt;math&amp;gt;i_t * \tilde{C}_t&amp;lt;/math&amp;gt;. Это новые значения-кандидаты, умноженные на &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – на сколько обновить каждое из значений состояния.&lt;br /&gt;
[[File:Lstm-3.png|none|650px]]&lt;br /&gt;
&lt;br /&gt;
На последнем этапе определяется то, какая информация будет получена на выходе. Выходные данные будут основаны на нашем состоянии ячейки, к ним будут применены некоторые фильтры. Сначала значения предыдущего выхода &amp;lt;math&amp;gt;h_{t-1}&amp;lt;/math&amp;gt; и текущего входа &amp;lt;math&amp;gt;x_t&amp;lt;/math&amp;gt; пропускаются через сигмоидальный слой, который решает, какая информация из состояния ячейки будет выведена. Затем значения состояния ячейки проходят через tanh-слой, чтобы получить на выходе значения из диапазона от -1 до 1, и перемножаются с выходными значениями сигмоидального слоя, что позволяет выводить только требуемую информацию.&lt;br /&gt;
[[File:Lstm-4.png|none|650px]]&lt;br /&gt;
&lt;br /&gt;
Полученные таким образом &amp;lt;math&amp;gt;h_t&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;C_t&amp;lt;/math&amp;gt; передаются далее по цепочке.&lt;br /&gt;
&lt;br /&gt;
== Вариации ==&lt;br /&gt;
=== Cмотровые глазки ===&lt;br /&gt;
Одна из популярных вариаций LSTM, предложенная Герсом и Шмидхубером&amp;lt;ref name=LSTM-peephole-connections&amp;gt;[ftp://ftp.idsia.ch/pub/juergen/TimeCount-IJCNN2000.pdf Gers, Schmidhuber. Recurrent Nets that Time and Count (2000).]&amp;lt;/ref&amp;gt;, характеризуется добавлением так называемых “смотровых глазков” (англ. ''peephole connections''). С их помощью слои фильтров могут видеть состояние ячейки.&lt;br /&gt;
[[File:Lstm-peephole-connections.png|none|650px]]&lt;br /&gt;
На схеме выше “глазки” есть у каждого слоя, но во многих работах они добавляются лишь к некоторым слоям.&lt;br /&gt;
&lt;br /&gt;
=== Объединенные фильтры ===&lt;br /&gt;
Другие модификации включают объединенные фильтры “забывания” и входные фильтры. В этом случае решения, какую информацию следует забыть, а какую запомнить, принимаются не отдельно, а совместно. Информация забывается только тогда, когда необходимо записать что-то на её место. Добавление новой информации в состояние ячейки выполняется только тогда, когда забываем старую.&lt;br /&gt;
[[File:Lstm-mod-1.png|none|650px]]&lt;br /&gt;
&lt;br /&gt;
=== Управляемые рекуррентные нейроны ===&lt;br /&gt;
Немного больше отличаются от стандартных LSTM управляемые рекуррентные нейроны (англ. ''Gated recurrent units, GRU''), впервые описанные в работе Кюнгхюна Чо (англ. Kyunghyun Cho)&amp;lt;ref name=Cho&amp;gt;[https://arxiv.org/pdf/1406.1078v3.pdf Cho. Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation (2014).]&amp;lt;/ref&amp;gt;. У них на один фильтр меньше, и они немного иначе соединены. Фильтры «забывания» и входа объединяют в один фильтр «обновления» (англ. ''update gate''). Этот фильтр определяет сколько информации сохранить от последнего состояния, и сколько информации получить от предыдущего слоя. Кроме того, состояние ячейки объединяется со скрытым состоянием, есть и другие небольшие изменения. Фильтр сброса состояния (англ. ''reset gate'') работает почти так же, как фильтр забывания, но расположен немного иначе. На следующие слои отправляется полная информация о состоянии, выходного фильтра нет. В большинстве случаем GRU работают так же, как LSTM, самое значимое отличие в том, что GRU немного быстрее и проще в эксплуатации, однако обладает немного меньшими выразительными возможностями. В результате модели проще, чем LSTM и их популярность неуклонно возрастает. Эффективность при решении задач моделирования музыкальных и речевых сигналов сопоставима с использованием долгой краткосрочной памяти.&lt;br /&gt;
[[File:Lstm-gru.png|none|650px]]&lt;br /&gt;
&lt;br /&gt;
=== Глубокие управляемые рекуррентные нейроны ===&lt;br /&gt;
Существует множество других модификаций, как, например, глубокие управляемые рекуррентные нейронные сети (англ. ''Depth Gated RNNs''), представленные в работе Каишенга Яо (англ. Kaisheng Yao)&amp;lt;ref name=Yao&amp;gt;[https://arxiv.org/pdf/1508.03790v2.pdf SeppKaisheng Yao. Depth-Gated Recurrent Neural Networks (2015).]&amp;lt;/ref&amp;gt;. Глубокие управляемые рекуррентные нейронные сети привносят фильтр глубины для подключения ячеек памяти соседних слоев. Это вводит линейную зависимость между нижними и верхними рекуррентными единицами. Важно отметить, что линейная зависимость проходит через функцию стробирования, которая называется фильтром забывания. Данная архитектура способна улучшить машинный перевод и языковое моделирование.&lt;br /&gt;
&lt;br /&gt;
=== Механизм часов ===&lt;br /&gt;
Есть и другие способы решения проблемы долговременных зависимостей, например, механизм часов (англ. ''Clockwork RNN'', CW-RNN) Яна Кутника&amp;lt;ref name=Jan&amp;gt;[https://arxiv.org/pdf/1402.3511v1.pdf Jan Koutnik. A Clockwork RNN (2014).]&amp;lt;/ref&amp;gt;. CW-RNN {{---}} мощная модификация стандартной архитектуры RNN, в которой скрытый слой разделен на отдельные модули, каждый из которых обрабатывает входные данные со своей временной детализацией, производя вычисления только при заданной тактовой частоте. Стандартная модель RNN не ставновится сложнее, CW-RNN уменьшает количество параметров RNN, улучшает точность и скорость обучения сети в задачах генерации звуковых сигналов.&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
=== Keras ===&lt;br /&gt;
Пример кода с использованием библиотеки Keras.&amp;lt;ref name=KerasRNN&amp;gt;[https://keras.io/layers/recurrent/ Keras RNN with LSTM layer]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Импорты&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''import''' keras.backend '''as''' K&lt;br /&gt;
  '''from''' keras.preprocessing '''import''' sequence&lt;br /&gt;
  '''from''' keras.models '''import''' Sequential&lt;br /&gt;
  '''from''' keras.layers '''import''' Dense, Activation, Embedding&lt;br /&gt;
  '''from''' keras.layers '''import''' LSTM&lt;br /&gt;
  '''from''' keras.datasets '''import''' imdb&lt;br /&gt;
  &lt;br /&gt;
  '''def''' f1(y_true, y_pred):&lt;br /&gt;
    '''def''' recall(y_true, y_pred):&lt;br /&gt;
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))&lt;br /&gt;
        possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))&lt;br /&gt;
        recall = true_positives / (possible_positives + K.epsilon())&lt;br /&gt;
        return recall&lt;br /&gt;
  &lt;br /&gt;
    '''def''' precision(y_true, y_pred):&lt;br /&gt;
        true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))&lt;br /&gt;
        predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))&lt;br /&gt;
        precision = true_positives / (predicted_positives + K.epsilon())&lt;br /&gt;
        return precision&lt;br /&gt;
  &lt;br /&gt;
    precision = precision(y_true, y_pred)&lt;br /&gt;
    recall = recall(y_true, y_pred)&lt;br /&gt;
    return 2*((precision*recall)/(precision+recall+K.epsilon()))&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Устанавливаем seed для обеспечения повторяемости результатов&amp;lt;/font&amp;gt;&lt;br /&gt;
  np.random.seed(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Указываем количество слов из частотного словаря, которое будет использоваться (отсортированы по частоте использования)&amp;lt;/font&amp;gt;&lt;br /&gt;
  max_features = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5000&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Загружаем данные (датасет IMDB содержит 25000 рецензий на фильмы с правильным ответом для обучения и 25000 рецензий на фильмы с правильным ответом для тестирования)&amp;lt;/font&amp;gt;&lt;br /&gt;
  (X_train, y_train), (X_test, y_test) = imdb.load_data(nb_words = max_features)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Устанавливаем максимальную длину рецензий в словах, чтобы они все были одной длины&amp;lt;/font&amp;gt;&lt;br /&gt;
  maxlen = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;80&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Заполняем короткие рецензии пробелами, а длинные обрезаем&amp;lt;/font&amp;gt;&lt;br /&gt;
  X_train = sequence.pad_sequences(X_train, maxlen = maxlen)&lt;br /&gt;
  X_test = sequence.pad_sequences(X_test, maxlen = maxlen)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Создаем модель последовательной сети&amp;lt;/font&amp;gt;&lt;br /&gt;
  model = Sequential()&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем слой для векторного представления слов (5000 слов, каждое представлено вектором из 32 чисел, отключаем входной сигнал с вероятностью 20% для предотвращения переобучения)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(Embedding(max_features, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;, dropout = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем слой долго-краткосрочной памяти (100 элементов для долговременного хранения информации, отключаем входной сигнал с вероятностью 20%, отключаем рекуррентный сигнал с вероятностью 20%)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(LSTM(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;100&amp;lt;/font&amp;gt;, dropout_W = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;, dropout_U = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Добавляем полносвязный слой из 1 элемента для классификации, в качестве функции активации будем использовать сигмоидальную функцию&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.add(Dense(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, activation = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'sigmoid'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Компилируем модель нейронной сети&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.compile(loss = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'binary_crossentropy'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                optimizer = &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'adam'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                metrics = [&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'accuracy'&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'f1'&amp;lt;/font&amp;gt;])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Обучаем нейронную сеть (данные для обучения, ответы к данным для обучения, количество рецензий после анализа которого будут изменены веса, число эпох обучения, тестовые данные, показывать progress bar или нет)&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.fit(X_train, y_train, &lt;br /&gt;
            batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;,&lt;br /&gt;
            nb_epoch = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;,&lt;br /&gt;
            validation_data = (X_test, y_test),&lt;br /&gt;
            verbose = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Проверяем качество обучения на тестовых данных (если есть данные, которые не участвовали в обучении, лучше использовать их, но в нашем случае таковых нет)&amp;lt;/font&amp;gt;&lt;br /&gt;
  scores = model.evaluate(X_test, y_test, batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Точность на тестовых данных: %.2f%%'&amp;lt;/font&amp;gt; % (scores[1] * &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;100&amp;lt;/font&amp;gt;))&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'F1 на тестовых данных: %.2f%%'&amp;lt;/font&amp;gt; % (scores[2] * &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;100&amp;lt;/font&amp;gt;))&lt;br /&gt;
&lt;br /&gt;
Результат:&lt;br /&gt;
  Точность на тренировочных данных: 89.64%&lt;br /&gt;
  F1 на тренировочных данных: 89.55%&lt;br /&gt;
  &lt;br /&gt;
  Точность на тестовых данных: 83.01%&lt;br /&gt;
  F1 на тестовых данных: 82.48%&lt;br /&gt;
&lt;br /&gt;
=== TensorFlow ===&lt;br /&gt;
Пример кода с библиотекой TensorFlow&amp;lt;ref&amp;gt;[https://www.tensorflow.org/ TensorFlow]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Импорты&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''from''' __future__ '''import''' print_function&lt;br /&gt;
  '''import''' tensorflow '''as''' tf&lt;br /&gt;
  '''from''' tensorflow.contrib '''import''' rnn&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Импорт MNIST датасета&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''from''' tensorflow.examples.tutorials.mnist '''import''' input_data&lt;br /&gt;
  mnist = input_data.read_data_sets(&amp;quot;/tmp/data/&amp;quot;, one_hot=True)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Определение параметров обучения&amp;lt;/font&amp;gt;&lt;br /&gt;
  learning_rate = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.001&amp;lt;/font&amp;gt;&lt;br /&gt;
  training_steps = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10000&amp;lt;/font&amp;gt;&lt;br /&gt;
  batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;128&amp;lt;/font&amp;gt;&lt;br /&gt;
  display_step = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;200&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Определение параметров сети&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_input = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;28&amp;lt;/font&amp;gt;&lt;br /&gt;
  timesteps = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;28&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_hidden = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;128&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_classes = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Входные данные для графа&amp;lt;/font&amp;gt;&lt;br /&gt;
  X = tf.placeholder(&amp;quot;float&amp;quot;, [None, timesteps, num_input])&lt;br /&gt;
  Y = tf.placeholder(&amp;quot;float&amp;quot;, [None, num_classes])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Определение весов&amp;lt;/font&amp;gt;&lt;br /&gt;
  weights = {&lt;br /&gt;
    'out': tf.Variable(tf.random_normal([num_hidden, num_classes]))&lt;br /&gt;
  }&lt;br /&gt;
  biases = {&lt;br /&gt;
    'out': tf.Variable(tf.random_normal([num_classes]))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  def RNN(x, weights, biases):&lt;br /&gt;
      x = tf.unstack(x, timesteps, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
      &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Определение LSTM ячейки&amp;lt;/font&amp;gt;&lt;br /&gt;
      lstm_cell = rnn.BasicLSTMCell(num_hidden, forget_bias=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;)&lt;br /&gt;
      &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Получение выхода LSTM ячейки&amp;lt;/font&amp;gt;&lt;br /&gt;
      outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)&lt;br /&gt;
      return tf.matmul(outputs[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;], weights['out']) + biases['out']&lt;br /&gt;
  &lt;br /&gt;
  logits = RNN(X, weights, biases)&lt;br /&gt;
  prediction = tf.nn.softmax(logits)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Определение функции потерь и оптимизатора&amp;lt;/font&amp;gt;&lt;br /&gt;
  loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(&lt;br /&gt;
      logits=logits, labels=Y))&lt;br /&gt;
  optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)&lt;br /&gt;
  train_op = optimizer.minimize(loss_op)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Оценка модели&amp;lt;/font&amp;gt;&lt;br /&gt;
  correct_pred = tf.equal(tf.argmax(prediction, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;), tf.argmax(Y, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Инициализация&amp;lt;/font&amp;gt;&lt;br /&gt;
  init = tf.global_variables_initializer()&lt;br /&gt;
  &lt;br /&gt;
  with tf.Session() as sess:&lt;br /&gt;
      sess.run(init)&lt;br /&gt;
  &lt;br /&gt;
      for step in range(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, training_steps+&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;):&lt;br /&gt;
          batch_x, batch_y = mnist.train.next_batch(batch_size)&lt;br /&gt;
          batch_x = batch_x.reshape((batch_size, timesteps, num_input))&lt;br /&gt;
          &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Запуск оптимизатора (обратное распространение ошибки)&amp;lt;/font&amp;gt;&lt;br /&gt;
          sess.run(train_op, feed_dict={X: batch_x, Y: batch_y})&lt;br /&gt;
          if step % display_step == &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt; or step == &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;:&lt;br /&gt;
              loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, Y: batch_y})&lt;br /&gt;
              print(&amp;quot;Step &amp;quot; + str(step) + &amp;quot;, Minibatch Loss= &amp;quot; + \&lt;br /&gt;
                  &amp;quot;{:.4f}&amp;quot;.format(loss) + &amp;quot;, Training Accuracy= &amp;quot; + \&lt;br /&gt;
                  &amp;quot;{:.3f}&amp;quot;.format(acc))&lt;br /&gt;
      print(&amp;quot;Optimization Finished!&amp;quot;)&lt;br /&gt;
  &lt;br /&gt;
      test_len = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;128&amp;lt;/font&amp;gt;&lt;br /&gt;
      test_data = mnist.test.images[:test_len].reshape((&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;, timesteps, num_input))&lt;br /&gt;
      test_label = mnist.test.labels[:test_len]&lt;br /&gt;
      print(&amp;quot;Testing Accuracy:&amp;quot;, \&lt;br /&gt;
          sess.run(accuracy, feed_dict={X: test_data, Y: test_label}))&lt;br /&gt;
&lt;br /&gt;
Результат:&lt;br /&gt;
  Точность на тренировочных данных: 91.40%&lt;br /&gt;
  F1 на тренировочных данных: 91.05%&lt;br /&gt;
  &lt;br /&gt;
  Точность на тестовых данных: 85.15%&lt;br /&gt;
  F1 на тестовых данных: 84.28%&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]&lt;br /&gt;
*[[:Нейронные_сети,_перцептрон|Нейронные сети, перцептрон]]&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;
[[Категория: Нейронные сети]]&lt;br /&gt;
[[Категория: Рекуррентные нейронные сети]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://colah.github.io/posts/2015-08-Understanding-LSTMs/ Understanding LSTM Networks]&lt;br /&gt;
* [https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21 Illustrated Guide to LSTM’s and GRU’s: A step by step explanation]&lt;br /&gt;
* [https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0 The fall of RNN / LSTM]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Long_short-term_memory Long short-term memory] - статья на Википедии&lt;br /&gt;
* [https://www.coursera.org/lecture/nlp-sequence-models/long-short-term-memory-lstm-KXoay Long Short Term Memory (LSTM)] - курс Andrew Ng&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70935</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70935"/>
				<updated>2019-04-09T00:12:51Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия#Пример на языке Java}}&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java}}&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java_2}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон#Пример на языке Java}}&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)#Пример на языке Java}}&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&amp;diff=70934</id>
		<title>Нейронные сети, перцептрон</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&amp;diff=70934"/>
				<updated>2019-04-09T00:12:30Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: /* Пример на языке Java= */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.&lt;br /&gt;
&lt;br /&gt;
[[File:Нейронная_сеть.png|700px|thumb|[https://neuralnet.info/chapter/%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/#%D0%92-%D1%86%D0%B5%D0%BB%D0%BE%D0%BC-%D0%BE%D0%B1-%D0%98%D0%9D%D0%A1 Упрощение биологической нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]&amp;lt;/ref&amp;gt;. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]&amp;lt;/ref&amp;gt;, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.&lt;br /&gt;
&lt;br /&gt;
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.&lt;br /&gt;
&lt;br /&gt;
==Структура нейронной сети==&lt;br /&gt;
&lt;br /&gt;
[[File:Искусственный_нейрон_схема.png|700px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD Схема искусственного нейрона]]]&lt;br /&gt;
&lt;br /&gt;
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.&lt;br /&gt;
&lt;br /&gt;
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция &amp;lt;tex&amp;gt;\mathbb{R}^n \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt;, которая преобразует несколько входных параметров в один выходной.&lt;br /&gt;
&lt;br /&gt;
Как видно на рисунке справа, у нейрона есть &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; входов &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, у каждого из которого есть вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы &amp;lt;tex&amp;gt;x_i \cdot w_i&amp;lt;/tex&amp;gt; направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют &amp;lt;tex&amp;gt;net&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Просто так передавать взвешенную сумму &amp;lt;tex&amp;gt;net&amp;lt;/tex&amp;gt; на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается &amp;lt;tex&amp;gt;\phi(net)&amp;lt;/tex&amp;gt;. Таким образом, выходов искусственного нейрона является &amp;lt;tex&amp;gt;\phi(net)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:&lt;br /&gt;
* Функция единичного скачка. Если &amp;lt;tex&amp;gt;net &amp;gt; threshold&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\phi(net) = 1&amp;lt;/tex&amp;gt;, а иначе &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Сигмоидальная функция. &amp;lt;tex&amp;gt;\phi(net) = \frac{1}{1 + exp(-a \cdot net)}&amp;lt;/tex&amp;gt;, где параметр &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; характеризует степень крутизны функции;&lt;br /&gt;
* Гиперболический тангенс. &amp;lt;tex&amp;gt;\phi(net) = tanh(\frac{net}{a})&amp;lt;/tex&amp;gt;, где параметр &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; также определяет степень крутизны графика функции;&lt;br /&gt;
* Rectified linear units (ReLU). &amp;lt;tex&amp;gt;ReLU(x) = \begin{cases}&lt;br /&gt;
      x &amp;amp; x \geq 0 \\&lt;br /&gt;
      0 &amp;amp; x &amp;lt; 0&lt;br /&gt;
   \end{cases} = \max(x, 0)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Виды нейронных сетей==&lt;br /&gt;
&lt;br /&gt;
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.&lt;br /&gt;
&lt;br /&gt;
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.&lt;br /&gt;
&lt;br /&gt;
===Однослойные нейронные сети===&lt;br /&gt;
&lt;br /&gt;
[[File:Single-layer-neural-net-scheme.png|500px|thumb|[https://studfiles.net/preview/3170620/page:3/ Схема однослойной нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.&lt;br /&gt;
&lt;br /&gt;
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы &amp;lt;tex&amp;gt;x_1, x_2, \ldots x_n&amp;lt;/tex&amp;gt; поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Многослойные нейронные сети===&lt;br /&gt;
&lt;br /&gt;
[[File:Multi-layer-neural-net-scheme.png|500px|thumb|[https://wiki.loginom.ru/articles/multilayer-neural-net.html Схема многослойной нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.&lt;br /&gt;
&lt;br /&gt;
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.&lt;br /&gt;
&lt;br /&gt;
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Сети прямого распространения===&lt;br /&gt;
&lt;br /&gt;
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.&lt;br /&gt;
&lt;br /&gt;
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.&lt;br /&gt;
&lt;br /&gt;
Однако сигнал в нейронных сетях может идти и в обратную сторону.&lt;br /&gt;
&lt;br /&gt;
===Сети с обратными связями===&lt;br /&gt;
&lt;br /&gt;
[[File:Сети_с_обратными_связями.png|400px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%A1%D0%B5%D1%82%D0%B8-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8 Схема сети с обратными связями]]]&lt;br /&gt;
&lt;br /&gt;
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.&lt;br /&gt;
&lt;br /&gt;
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).&lt;br /&gt;
&lt;br /&gt;
==Обучение нейронной сети==&lt;br /&gt;
&lt;br /&gt;
'''Обучение нейронной сети''' {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.&lt;br /&gt;
&lt;br /&gt;
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов {{---}} элементов, которые усиливают или ослабляют входной сигнал.&lt;br /&gt;
&lt;br /&gt;
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.&lt;br /&gt;
&lt;br /&gt;
'''Обучающая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.&lt;br /&gt;
&lt;br /&gt;
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.&lt;br /&gt;
&lt;br /&gt;
'''Тестовая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.&lt;br /&gt;
&lt;br /&gt;
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и [[Обучение без учителя|обучение без учителя]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.&lt;br /&gt;
&lt;br /&gt;
==Перцептрон==&lt;br /&gt;
&lt;br /&gt;
[[File:Перцептрон.png|350px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9F%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема перцептрона]]]&lt;br /&gt;
&lt;br /&gt;
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.&lt;br /&gt;
&lt;br /&gt;
===История===&lt;br /&gt;
&lt;br /&gt;
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.&lt;br /&gt;
&lt;br /&gt;
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.&lt;br /&gt;
&lt;br /&gt;
===Описание===&lt;br /&gt;
&lt;br /&gt;
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.&lt;br /&gt;
&lt;br /&gt;
Принцип работы перцептрона следующий:&lt;br /&gt;
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'');&lt;br /&gt;
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1'';&lt;br /&gt;
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами;&lt;br /&gt;
#* Одному A-элементу может соответствовать несколько S-элементов;&lt;br /&gt;
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог ​&amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;​, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';&lt;br /&gt;
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал;&lt;br /&gt;
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей);&lt;br /&gt;
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем&lt;br /&gt;
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';&lt;br /&gt;
#* eсли порог не превышен, то выход перцептрона равен ''-1''.&lt;br /&gt;
&lt;br /&gt;
Для элементов перцептрона используют следующие названия:&lt;br /&gt;
* S-элементы называют сенсорами;&lt;br /&gt;
* A-элементы называют ассоциативными;&lt;br /&gt;
* R-элементы называют реагирующими.&lt;br /&gt;
&lt;br /&gt;
===Классификация перцептронов===&lt;br /&gt;
&lt;br /&gt;
[[File:Однслойный_перцептрон.png|300px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема однослойного перцептрона]]]&lt;br /&gt;
&lt;br /&gt;
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}}  перцептрон, у которого имеется только по одному слою S, A и R элементов.&lt;br /&gt;
&lt;br /&gt;
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.&lt;br /&gt;
&lt;br /&gt;
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.&lt;br /&gt;
&lt;br /&gt;
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.&lt;br /&gt;
&lt;br /&gt;
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.&lt;br /&gt;
&lt;br /&gt;
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:&lt;br /&gt;
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;&lt;br /&gt;
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.&lt;br /&gt;
&lt;br /&gt;
===Обучение перцептрона===&lt;br /&gt;
&lt;br /&gt;
Задача обучения перцептрона {{---}} подобрать такие &amp;lt;tex&amp;gt;w_0, w_1, w_2, \ldots, w_n&amp;lt;/tex&amp;gt;, чтобы &amp;lt;tex&amp;gt;sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))&amp;lt;/tex&amp;gt; как можно чаще совпадал с &amp;lt;tex&amp;gt;y(x)&amp;lt;/tex&amp;gt; {{---}} значением в обучающей выборке (здесь &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член &amp;lt;tex&amp;gt;w_0&amp;lt;/tex&amp;gt;, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что &amp;lt;tex&amp;gt;x = (1, x_1, x_2, \ldots, x_n)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n&amp;lt;/tex&amp;gt; можно заменить на &amp;lt;tex&amp;gt;w^T \cdot x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': &amp;lt;tex&amp;gt;E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; {{---}} множество примеров, которые перцептрон с весами &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; классифицирует неправильно.&lt;br /&gt;
&lt;br /&gt;
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на &amp;lt;tex&amp;gt;y(x)&amp;lt;/tex&amp;gt; здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.&lt;br /&gt;
&lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;E_P(w)&amp;lt;/tex&amp;gt; можно оптимизировать градиентным спуском. На очередном шаге получаем: &amp;lt;tex&amp;gt;w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм такой {{---}} мы последовательно проходим примеры &amp;lt;tex&amp;gt;x_1, x_2, \ldots&amp;lt;/tex&amp;gt; из обучающего множества, и для каждого &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* если он классифицирован правильно, не меняем ничего;&lt;br /&gt;
* а если неправильно, прибавляем &amp;lt;tex&amp;gt;\eta \triangledown_w E_P(w)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ошибка на примере &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.&lt;br /&gt;
&lt;br /&gt;
===Применение===&lt;br /&gt;
&lt;br /&gt;
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости;&lt;br /&gt;
* Прогнозирование и распознавание образов;&lt;br /&gt;
* Управление агентами&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Пример использования с помощью scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org Библиотека scikit-learn для Python]&amp;lt;/ref&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Будем классифицировать с помощью перцептрона датасет MNIST&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
  # Load required libraries&lt;br /&gt;
  from sklearn import datasets&lt;br /&gt;
  from sklearn.preprocessing import StandardScaler&lt;br /&gt;
  from sklearn.linear_model import Perceptron      #Single-layer perceptron&lt;br /&gt;
  from sklearn.neural_network import MLPClassifier #Multilayer perceptron &lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
  from sklearn.metrics import accuracy_score&lt;br /&gt;
  import numpy as np&lt;br /&gt;
&lt;br /&gt;
  # Load the mnist dataset&lt;br /&gt;
  mnist = datasets.load_digits()&lt;br /&gt;
&lt;br /&gt;
  # Create our X and y data&lt;br /&gt;
  n_samples = len(mnist.images)&lt;br /&gt;
  X = mnist.images.reshape((n_samples, -1))&lt;br /&gt;
  y = mnist.target&lt;br /&gt;
&lt;br /&gt;
  # Split the data into 70% training data and 30% test data&lt;br /&gt;
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)&lt;br /&gt;
&lt;br /&gt;
  # Train the scaler, which standarizes all the features to have mean=0 and unit variance&lt;br /&gt;
  sc = StandardScaler()&lt;br /&gt;
  sc.fit(X_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the scaler to the X training data&lt;br /&gt;
  X_train_std = sc.transform(X_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the SAME scaler to the X test data&lt;br /&gt;
  X_test_std = sc.transform(X_test)&lt;br /&gt;
&lt;br /&gt;
  # Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1&lt;br /&gt;
  ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)&lt;br /&gt;
  # Create a multilayer perceptron object&lt;br /&gt;
  mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(256, 512, 128), random_state=1)&lt;br /&gt;
&lt;br /&gt;
  # Train the perceptrons&lt;br /&gt;
  ppn.fit(X_train_std, y_train)&lt;br /&gt;
  mppn.fit(X_train_std, y_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the trained perceptrons on the X data to make predicts for the y test data&lt;br /&gt;
  y_pred = ppn.predict(X_test_std)&lt;br /&gt;
  multi_y_pred = mppn.predict(X_test_std)&lt;br /&gt;
&lt;br /&gt;
  # View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)&lt;br /&gt;
  print('Single-layer perceptron accuracy: %.4f' % accuracy_score(y_test, y_pred))&lt;br /&gt;
  print('Multilayer perceptron accuracy: %.4f' % accuracy_score(y_test, multi_y_pred))&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
  Single-layer perceptron accuracy: 0.9574&lt;br /&gt;
  Multilayer perceptron accuracy: 0.9759&lt;br /&gt;
&lt;br /&gt;
====Пример использования с помощью tensorflow&amp;lt;ref&amp;gt;[https://www.tensorflow.org/ Библиотека tensorflow для Python]&amp;lt;/ref&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Будем классифицировать цифры из того же датасета MNIST.&lt;br /&gt;
&lt;br /&gt;
  # Load required libraries&lt;br /&gt;
  import tensorflow as tf&lt;br /&gt;
  from tensorflow.examples.tutorials.mnist import input_data&lt;br /&gt;
&lt;br /&gt;
  #Load MNIST dataset&lt;br /&gt;
  mnist = input_data.read_data_sets(&amp;quot;MNIST_data/&amp;quot;, one_hot=True)&lt;br /&gt;
&lt;br /&gt;
  #placeholder for test data&lt;br /&gt;
  x = tf.placeholder(tf.float32, [None, 784])&lt;br /&gt;
  #placeholder for weights and bias&lt;br /&gt;
  W = tf.Variable(tf.zeros([784, 10]))&lt;br /&gt;
  b = tf.Variable(tf.zeros([10]))&lt;br /&gt;
  #tensorflow model&lt;br /&gt;
  y = tf.nn.softmax(tf.matmul(x, W) + b)&lt;br /&gt;
  &lt;br /&gt;
  #loss function&lt;br /&gt;
  y_ = tf.placeholder(tf.float32, [None, 10])&lt;br /&gt;
  cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))&lt;br /&gt;
&lt;br /&gt;
  #gradient descent step&lt;br /&gt;
  train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)&lt;br /&gt;
&lt;br /&gt;
  init = tf.initialize_all_variables()&lt;br /&gt;
  sess = tf.Session()&lt;br /&gt;
  sess.run(init)&lt;br /&gt;
  for i in range(1000):&lt;br /&gt;
    batch_xs, batch_ys = mnist.train.next_batch(100)&lt;br /&gt;
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})&lt;br /&gt;
  correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))&lt;br /&gt;
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))&lt;br /&gt;
  print(&amp;quot;Accuracy: %s&amp;quot; % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))&lt;br /&gt;
&lt;br /&gt;
[[File:Tensorflow-mnist-failures.png|400px|thumb|Правильные метки {{---}} 5, 4, 9, 7. Результат классификации {{---}} 6, 6, 4, 4.]]&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
  Accuracy: 0.9164&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На рисунке справа показаны четыре типичных изображения, на которых классификаторы ошибаются. Согласитесь, случаи действительно тяжелые.&lt;br /&gt;
&lt;br /&gt;
====Пример на языке Java====&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test datasets and build MLP classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Print the result à la Weka explorer:&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]&lt;br /&gt;
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]&lt;br /&gt;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.&lt;br /&gt;
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Нейронные сети]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&amp;diff=70933</id>
		<title>Нейронные сети, перцептрон</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B5%D0%B9%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8,_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD&amp;diff=70933"/>
				<updated>2019-04-09T00:12:14Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Искусственная нейронная сеть (ИНС)''' (англ. ''Artificial neural network (ANN)'') {{---}} упрощенная модель биологической нейронной сети, представляющая собой совокупность искусственных нейронов, взаимодействующих между собой.&lt;br /&gt;
&lt;br /&gt;
[[File:Нейронная_сеть.png|700px|thumb|[https://neuralnet.info/chapter/%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5/#%D0%92-%D1%86%D0%B5%D0%BB%D0%BE%D0%BC-%D0%BE%D0%B1-%D0%98%D0%9D%D0%A1 Упрощение биологической нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
Основные принципы работы нейронных сетей были описаны еще в 1943 году Уорреном Мак-Каллоком и Уолтером Питтсом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Artificial_neuron Artificial neuron, Wikipedia]&amp;lt;/ref&amp;gt;. В 1957 году нейрофизиолог Фрэнк Розенблатт разработал первую нейронную сеть&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]&amp;lt;/ref&amp;gt;, а в 2010 году большие объемы данных для обучения открыли возможность использовать нейронные сети для машинного обучения.&lt;br /&gt;
&lt;br /&gt;
На данный момент нейронные сети используются в многочисленных областях машинного обучения и решают проблемы различной сложности.&lt;br /&gt;
&lt;br /&gt;
==Структура нейронной сети==&lt;br /&gt;
&lt;br /&gt;
[[File:Искусственный_нейрон_схема.png|700px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9-%D0%BD%D0%B5%D0%B9%D1%80%D0%BE%D0%BD Схема искусственного нейрона]]]&lt;br /&gt;
&lt;br /&gt;
Хорошим примером биологической нейронной сети является человеческий мозг. Наш мозг {{---}} сложнейшая биологическая нейронная сеть, которая принимает информацию от органов чувств и каким-то образом ее обрабатывает (узнавание лиц, возникновение ощущений и т.д.). Мозг же, в свою очередь, состоит из нейронов, взаимодействующих между собой.&lt;br /&gt;
&lt;br /&gt;
Для построения искусственной нейронной сети будем использовать ту же структуру. Как и биологическая нейронная сеть, искусственная состоит из нейронов, взаимодействующих между собой, однако представляет собой упрощенную модель. Так, например, искусственный нейрон, из которых состоит ИНС, имеет намного более простую структуру: у него есть несколько входов, на которых он принимает различные сигналы, преобразует их и передает другим нейронам. Другими словами, искусственный нейрон {{---}} это такая функция &amp;lt;tex&amp;gt;\mathbb{R}^n \rightarrow \mathbb{R}&amp;lt;/tex&amp;gt;, которая преобразует несколько входных параметров в один выходной.&lt;br /&gt;
&lt;br /&gt;
Как видно на рисунке справа, у нейрона есть &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; входов &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, у каждого из которого есть вес &amp;lt;tex&amp;gt;w_i&amp;lt;/tex&amp;gt;, на который умножается сигнал, проходящий по связи. После этого взвешенные сигналы &amp;lt;tex&amp;gt;x_i \cdot w_i&amp;lt;/tex&amp;gt; направляются в сумматор, который аггрегирует все сигналы во взвешенную сумму. Эту сумму также называют &amp;lt;tex&amp;gt;net&amp;lt;/tex&amp;gt;. Таким образом, &amp;lt;tex&amp;gt;net = \sum_{i=1}^{i=n} w_i \cdot x_i = w^T \cdot x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Просто так передавать взвешенную сумму &amp;lt;tex&amp;gt;net&amp;lt;/tex&amp;gt; на выход достаточно бессмысленно {{---}} нейрон должен ее как-то обработать и сформировать адекватный выходной сигнал. Для этих целей используют [[Практики реализации нейронных сетей#Функции активации|функцию активации]], которая преобразует взвешенную сумму в какое-то число, которое и будет являться выходом нейрона. Функция активации обозначается &amp;lt;tex&amp;gt;\phi(net)&amp;lt;/tex&amp;gt;. Таким образом, выходов искусственного нейрона является &amp;lt;tex&amp;gt;\phi(net)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для разных типов нейронов используют самые разные функции активации, но одними из самых популярных являются:&lt;br /&gt;
* Функция единичного скачка. Если &amp;lt;tex&amp;gt;net &amp;gt; threshold&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\phi(net) = 1&amp;lt;/tex&amp;gt;, а иначе &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Сигмоидальная функция. &amp;lt;tex&amp;gt;\phi(net) = \frac{1}{1 + exp(-a \cdot net)}&amp;lt;/tex&amp;gt;, где параметр &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; характеризует степень крутизны функции;&lt;br /&gt;
* Гиперболический тангенс. &amp;lt;tex&amp;gt;\phi(net) = tanh(\frac{net}{a})&amp;lt;/tex&amp;gt;, где параметр &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; также определяет степень крутизны графика функции;&lt;br /&gt;
* Rectified linear units (ReLU). &amp;lt;tex&amp;gt;ReLU(x) = \begin{cases}&lt;br /&gt;
      x &amp;amp; x \geq 0 \\&lt;br /&gt;
      0 &amp;amp; x &amp;lt; 0&lt;br /&gt;
   \end{cases} = \max(x, 0)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Виды нейронных сетей==&lt;br /&gt;
&lt;br /&gt;
Разобравшись с тем, как устроен нейрон в нейронной сети, осталось понять, как их в этой сети располагать и соединять.&lt;br /&gt;
&lt;br /&gt;
Как правило, в большинстве нейронных сетей есть так называемый ''входной слой'', который выполняет только одну задачу {{---}} распределение входных сигналов остальным нейронам. Нейроны этого слоя не производят никаких вычислений. В остальном нейронные сети делятся на основные категории, представленные ниже.&lt;br /&gt;
&lt;br /&gt;
===Однослойные нейронные сети===&lt;br /&gt;
&lt;br /&gt;
[[File:Single-layer-neural-net-scheme.png|500px|thumb|[https://studfiles.net/preview/3170620/page:3/ Схема однослойной нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
'''Однослойная нейронная сеть''' (англ. ''Single-layer neural network'') {{---}} сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.&lt;br /&gt;
&lt;br /&gt;
Как видно из схемы однослойной нейронной сети, представленной справа, сигналы &amp;lt;tex&amp;gt;x_1, x_2, \ldots x_n&amp;lt;/tex&amp;gt; поступают на входной слой (который не считается за слой нейронной сети), а затем сигналы распределяются на выходной слой обычных нейронов. На каждом ребре от нейрона входного слоя к нейрону выходного слоя написано число {{---}} вес соответствующей связи.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Многослойные нейронные сети===&lt;br /&gt;
&lt;br /&gt;
[[File:Multi-layer-neural-net-scheme.png|500px|thumb|[https://wiki.loginom.ru/articles/multilayer-neural-net.html Схема многослойной нейронной сети]]]&lt;br /&gt;
&lt;br /&gt;
'''Многослойная нейронная сеть''' (англ. ''Multilayer neural network'') {{---}} нейронная сеть, состоящая из входного, выходного и расположенного(ых) между ними одного (нескольких) скрытых слоев нейронов.&lt;br /&gt;
&lt;br /&gt;
Помимо входного и выходного слоев эти нейронные сети содержат промежуточные, ''скрытые слои''. Такие сети обладают гораздо большими возможностями, чем однослойные нейронные сети, однако методы обучения нейронов скрытого слоя были разработаны относительно недавно.&lt;br /&gt;
&lt;br /&gt;
Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям на станках. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Сети прямого распространения===&lt;br /&gt;
&lt;br /&gt;
'''Сети прямого распространения''' (англ. ''Feedforward neural network'') (feedforward сети) {{---}} искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.&lt;br /&gt;
&lt;br /&gt;
Все сети, описанные выше, являлись сетями прямого распространения, как следует из определения. Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.&lt;br /&gt;
&lt;br /&gt;
Однако сигнал в нейронных сетях может идти и в обратную сторону.&lt;br /&gt;
&lt;br /&gt;
===Сети с обратными связями===&lt;br /&gt;
&lt;br /&gt;
[[File:Сети_с_обратными_связями.png|400px|thumb|[https://neuralnet.info/chapter/%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-%D0%B8%D0%BD%D1%81/#%D0%A1%D0%B5%D1%82%D0%B8-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8-%D1%81%D0%B2%D1%8F%D0%B7%D1%8F%D0%BC%D0%B8 Схема сети с обратными связями]]]&lt;br /&gt;
&lt;br /&gt;
'''[[Рекуррентные нейронные сети|Сети с обратными связями]]''' (англ. ''Recurrent neural network'') {{---}} искусственные нейронные сети, в которых выход нейрона может вновь подаваться на его вход. В более общем случае это означает возможность распространения сигнала от выходов к входам.&lt;br /&gt;
&lt;br /&gt;
В сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах. В сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).&lt;br /&gt;
&lt;br /&gt;
==Обучение нейронной сети==&lt;br /&gt;
&lt;br /&gt;
'''Обучение нейронной сети''' {{---}} поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.&lt;br /&gt;
&lt;br /&gt;
Это определение «обучения нейронной сети» соответствует и биологическим нейросетям. Наш мозг состоит из огромного количества связанных друг с другом нейросетей, каждая из которых в отдельности состоит из нейронов одного типа (с одинаковой функцией активации). Наш мозг обучается благодаря изменению синапсов {{---}} элементов, которые усиливают или ослабляют входной сигнал.&lt;br /&gt;
&lt;br /&gt;
Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ», а как только мы подадим немного измененный сигнал, вместо правильного ответа получим бессмыслицу. Мы ждем от сети способности ''обобщать'' какие-то признаки и решать задачу на различных входных данных. Именно с этой целью и создаются ''обучающие выборки''.&lt;br /&gt;
&lt;br /&gt;
'''Обучающая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.&lt;br /&gt;
&lt;br /&gt;
После обучения сети, то есть когда сеть выдает корректные результаты для всех входных сигналов из обучающей выборки, ее можно использовать на практике. Однако прежде чем сразу использовать нейронную сеть, обычно производят оценку качества ее работы на так называемой ''тестовой выборке''.&lt;br /&gt;
&lt;br /&gt;
'''Тестовая выборка''' {{---}} конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.&lt;br /&gt;
&lt;br /&gt;
Само обучение нейронной сети можно разделить на два подхода: [[Обучение с учителем|обучение с учителем]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и [[Обучение без учителя|обучение без учителя]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. В первом случае веса меняются так, чтобы ответы сети минимально отличались от уже готовых правильных ответов, а во втором случае сеть самостоятельно классифицирует входные сигналы.&lt;br /&gt;
&lt;br /&gt;
==Перцептрон==&lt;br /&gt;
&lt;br /&gt;
[[File:Перцептрон.png|350px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9F%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема перцептрона]]]&lt;br /&gt;
&lt;br /&gt;
'''Перцептрон''' (англ. ''Perceptron'') {{---}} простейший вид нейронных сетей. В основе лежит математическая модель восприятия информации мозгом, состоящая из сенсоров, ассоциативных и реагирующих элементов.&lt;br /&gt;
&lt;br /&gt;
===История===&lt;br /&gt;
&lt;br /&gt;
Идею перцептрона предложил нейрофизиолог Фрэнк Розенблатт. Он предложил схему устройства, моделирующего процесс человеческого восприятия, и назвал его ''«перцептроном»'' (от латинского ''perceptio'' {{---}} восприятие). В 1960 году Розенблатт представил первый нейрокомпьютер {{---}} «Марк-1», который был способен распознавать некоторые буквы английского алфавита.&lt;br /&gt;
&lt;br /&gt;
Таким образом перцептрон является одной из первых '''моделей нейросетей''', а «Марк-1» {{---}} первым в мире '''нейрокомпьютером'''.&lt;br /&gt;
&lt;br /&gt;
===Описание===&lt;br /&gt;
&lt;br /&gt;
В основе перцептрона лежит математическая модель восприятия информации мозгом. Разные исследователи по-разному его определяют. В самом общем своем виде (как его описывал Розенблатт) он представляет систему из элементов трех разных типов: сенсоров, ассоциативных элементов и реагирующих элементов.&lt;br /&gt;
&lt;br /&gt;
Принцип работы перцептрона следующий:&lt;br /&gt;
# Первыми в работу включаются S-элементы. Они могут находиться либо в состоянии покоя (сигнал равен ''0''), либо в состоянии возбуждения (сигнал равен ''1'');&lt;br /&gt;
# Далее сигналы от S-элементов передаются A-элементам по так называемым S-A связям. Эти связи могут иметь веса, равные только ''-1'', ''0'' или ''1'';&lt;br /&gt;
# Затем сигналы от сенсорных элементов, прошедших по S-A связям, попадают в A-элементы, которые еще называют ассоциативными элементами;&lt;br /&gt;
#* Одному A-элементу может соответствовать несколько S-элементов;&lt;br /&gt;
#* Если сигналы, поступившие на A-элемент, в совокупности превышают некоторый его порог ​&amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;​, то этот A-элемент возбуждается и выдает сигнал, равный ''1'';&lt;br /&gt;
#* В противном случае (сигнал от S-элементов не превысил порога A-элемента), генерируется нулевой сигнал;&lt;br /&gt;
# Далее сигналы, которые произвели возбужденные A-элементы, направляются к сумматору (R-элемент), действие которого нам уже известно. Однако, чтобы добраться до R-элемента, они проходят по A-R связям, у которых тоже есть веса (которые уже могут принимать любые значения, в отличие от S-A связей);&lt;br /&gt;
# R-элемент складывает друг с другом взвешенные сигналы от A-элементов, а затем&lt;br /&gt;
#* если превышен определенный порог, генерирует выходной сигнал, равный ''1'';&lt;br /&gt;
#* eсли порог не превышен, то выход перцептрона равен ''-1''.&lt;br /&gt;
&lt;br /&gt;
Для элементов перцептрона используют следующие названия:&lt;br /&gt;
* S-элементы называют сенсорами;&lt;br /&gt;
* A-элементы называют ассоциативными;&lt;br /&gt;
* R-элементы называют реагирующими.&lt;br /&gt;
&lt;br /&gt;
===Классификация перцептронов===&lt;br /&gt;
&lt;br /&gt;
[[File:Однслойный_перцептрон.png|300px|thumb|[https://neuralnet.info/chapter/%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D1%8B/#%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D0%BB%D0%BE%D0%B9%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B5%D1%80%D1%81%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD Схема однослойного перцептрона]]]&lt;br /&gt;
&lt;br /&gt;
'''Перцептрон с одним скрытым слоем''' ('''элементарный перцептрон''', англ. ''elementary perceptron'') {{---}}  перцептрон, у которого имеется только по одному слою S, A и R элементов.&lt;br /&gt;
&lt;br /&gt;
'''Однослойный персептрон''' (англ. ''Single-layer perceptron'') {{---}} перцептрон, каждый S-элемент которого однозначно соответствует одному А-элементу, S-A связи всегда имеют вес ''1'', а порог любого А-элемента равен ''1''. Часть однослойного персептрона соответствует модели искусственного нейрона.&lt;br /&gt;
&lt;br /&gt;
Его ключевая особенность состоит в том, что каждый S-элемент однозначно соответствует одному A-элементу, все S-A связи имеют вес, равный ''+1'', а порог A элементов равен ''1''. Часть однослойного перцептрона, не содержащая входы, соответствует искусственному нейрону, как показано на картинке. Таким образом, однослойный перцептрон {{---}} это искусственный нейрон, который на вход принимает только ''0'' и ''1''.&lt;br /&gt;
&lt;br /&gt;
Однослойный персептрон также может быть и элементарным персептроном, у которого только по одному слою S,A,R-элементов.&lt;br /&gt;
&lt;br /&gt;
'''Многослойный перцептрон по Розенблатту''' (англ. ''Rosenblatt multilayer perceptron'') {{---}} перцептрон, который содержит более 1 слоя А-элементов.&lt;br /&gt;
&lt;br /&gt;
'''Многослойный перцептрон по Румельхарту''' (англ. ''Rumelhart multilater perceptron'') {{---}} частный случай многослойного персептрона по Розенблатту, с двумя особенностями:&lt;br /&gt;
* S-A связи могут иметь произвольные веса и обучаться наравне с A-R связями;&lt;br /&gt;
* Обучение производится по специальному алгоритму, который называется обучением по методу обратного распространения ошибки.&lt;br /&gt;
&lt;br /&gt;
===Обучение перцептрона===&lt;br /&gt;
&lt;br /&gt;
Задача обучения перцептрона {{---}} подобрать такие &amp;lt;tex&amp;gt;w_0, w_1, w_2, \ldots, w_n&amp;lt;/tex&amp;gt;, чтобы &amp;lt;tex&amp;gt;sign(\sigma(w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n))&amp;lt;/tex&amp;gt; как можно чаще совпадал с &amp;lt;tex&amp;gt;y(x)&amp;lt;/tex&amp;gt; {{---}} значением в обучающей выборке (здесь &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt; {{---}} функция активации). Для удобства, чтобы не тащить за собой свободный член &amp;lt;tex&amp;gt;w_0&amp;lt;/tex&amp;gt;, добавим в вектор $x$ лишнюю «виртуальную размерность» и будем считать, что &amp;lt;tex&amp;gt;x = (1, x_1, x_2, \ldots, x_n)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \ldots + w_n \cdot x_n&amp;lt;/tex&amp;gt; можно заменить на &amp;lt;tex&amp;gt;w^T \cdot x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Чтобы обучать эту функцию, сначала надо выбрать функцию ошибки, которую потом можно оптимизировать [[Стохастический градиентный спуск|градиентным спуском]]. Число неверно классифицированных примеров не подходит на эту кандидатуру, потому что эта функция кусочно-гладкая, с массой разрывов: она будет принимать только целые значения и резко меняться при переходе от одного числа неверно классифицированных примеров к другому. Поэтому использовать будем другую функцию, так называемый ''критерий перцептрона'': &amp;lt;tex&amp;gt;E_P(w) = -\sum_{x \in M} y(x)(\sigma(w^T \cdot x))&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; {{---}} множество примеров, которые перцептрон с весами &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; классифицирует неправильно.&lt;br /&gt;
&lt;br /&gt;
Иначе говоря, мы минимизируем суммарное отклонение наших ответов от правильных, но только в неправильную сторону; верный ответ ничего не вносит в функцию ошибки. Умножение на &amp;lt;tex&amp;gt;y(x)&amp;lt;/tex&amp;gt; здесь нужно для того, чтобы знак произведения всегда получался отрицательным: если правильный ответ ''−1'', значит, перцептрон выдал положительное число (иначе бы ответ был верным), и наоборот. В результате у нас получилась кусочно-линейная функция, дифференцируемая почти везде, а этого вполне достаточно.&lt;br /&gt;
&lt;br /&gt;
Теперь &amp;lt;tex&amp;gt;E_P(w)&amp;lt;/tex&amp;gt; можно оптимизировать градиентным спуском. На очередном шаге получаем: &amp;lt;tex&amp;gt;w^{(\tau+1)} = w^{(\tau)} − \eta\triangledown_w E_P(w)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм такой {{---}} мы последовательно проходим примеры &amp;lt;tex&amp;gt;x_1, x_2, \ldots&amp;lt;/tex&amp;gt; из обучающего множества, и для каждого &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* если он классифицирован правильно, не меняем ничего;&lt;br /&gt;
* а если неправильно, прибавляем &amp;lt;tex&amp;gt;\eta \triangledown_w E_P(w)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ошибка на примере &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; при этом, очевидно, уменьшается, но, конечно, совершенно никто не гарантирует, что вместе с тем не увеличится ошибка от других примеров. Это правило обновления весов так и называется {{---}} правило обучения перцептрона, и это было основной математической идеей работы Розенблатта.&lt;br /&gt;
&lt;br /&gt;
===Применение===&lt;br /&gt;
&lt;br /&gt;
* Решение задач классификации, если объекты классификации обладают свойством линейной разделимости;&lt;br /&gt;
* Прогнозирование и распознавание образов;&lt;br /&gt;
* Управление агентами&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%B5%D1%80%D1%86%D0%B5%D0%BF%D1%82%D1%80%D0%BE%D0%BD%D0%BE%D0%B2 Применения перцептрона, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Пример использования с помощью scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org Библиотека scikit-learn для Python]&amp;lt;/ref&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Будем классифицировать с помощью перцептрона датасет MNIST&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/MNIST_database Датасет MNIST]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
  # Load required libraries&lt;br /&gt;
  from sklearn import datasets&lt;br /&gt;
  from sklearn.preprocessing import StandardScaler&lt;br /&gt;
  from sklearn.linear_model import Perceptron      #Single-layer perceptron&lt;br /&gt;
  from sklearn.neural_network import MLPClassifier #Multilayer perceptron &lt;br /&gt;
  from sklearn.model_selection import train_test_split&lt;br /&gt;
  from sklearn.metrics import accuracy_score&lt;br /&gt;
  import numpy as np&lt;br /&gt;
&lt;br /&gt;
  # Load the mnist dataset&lt;br /&gt;
  mnist = datasets.load_digits()&lt;br /&gt;
&lt;br /&gt;
  # Create our X and y data&lt;br /&gt;
  n_samples = len(mnist.images)&lt;br /&gt;
  X = mnist.images.reshape((n_samples, -1))&lt;br /&gt;
  y = mnist.target&lt;br /&gt;
&lt;br /&gt;
  # Split the data into 70% training data and 30% test data&lt;br /&gt;
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)&lt;br /&gt;
&lt;br /&gt;
  # Train the scaler, which standarizes all the features to have mean=0 and unit variance&lt;br /&gt;
  sc = StandardScaler()&lt;br /&gt;
  sc.fit(X_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the scaler to the X training data&lt;br /&gt;
  X_train_std = sc.transform(X_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the SAME scaler to the X test data&lt;br /&gt;
  X_test_std = sc.transform(X_test)&lt;br /&gt;
&lt;br /&gt;
  # Create a single-layer perceptron object with the parameters: 40 iterations (epochs) over the data, and a learning rate of 0.1&lt;br /&gt;
  ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)&lt;br /&gt;
  # Create a multilayer perceptron object&lt;br /&gt;
  mppn = MLPClassifier(solver='lbfgs', alpha=1e-5, hidden_layer_sizes=(256, 512, 128), random_state=1)&lt;br /&gt;
&lt;br /&gt;
  # Train the perceptrons&lt;br /&gt;
  ppn.fit(X_train_std, y_train)&lt;br /&gt;
  mppn.fit(X_train_std, y_train)&lt;br /&gt;
&lt;br /&gt;
  # Apply the trained perceptrons on the X data to make predicts for the y test data&lt;br /&gt;
  y_pred = ppn.predict(X_test_std)&lt;br /&gt;
  multi_y_pred = mppn.predict(X_test_std)&lt;br /&gt;
&lt;br /&gt;
  # View the accuracies of the model, which is: 1 - (observations predicted wrong / total observations)&lt;br /&gt;
  print('Single-layer perceptron accuracy: %.4f' % accuracy_score(y_test, y_pred))&lt;br /&gt;
  print('Multilayer perceptron accuracy: %.4f' % accuracy_score(y_test, multi_y_pred))&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
  Single-layer perceptron accuracy: 0.9574&lt;br /&gt;
  Multilayer perceptron accuracy: 0.9759&lt;br /&gt;
&lt;br /&gt;
====Пример использования с помощью tensorflow&amp;lt;ref&amp;gt;[https://www.tensorflow.org/ Библиотека tensorflow для Python]&amp;lt;/ref&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Будем классифицировать цифры из того же датасета MNIST.&lt;br /&gt;
&lt;br /&gt;
  # Load required libraries&lt;br /&gt;
  import tensorflow as tf&lt;br /&gt;
  from tensorflow.examples.tutorials.mnist import input_data&lt;br /&gt;
&lt;br /&gt;
  #Load MNIST dataset&lt;br /&gt;
  mnist = input_data.read_data_sets(&amp;quot;MNIST_data/&amp;quot;, one_hot=True)&lt;br /&gt;
&lt;br /&gt;
  #placeholder for test data&lt;br /&gt;
  x = tf.placeholder(tf.float32, [None, 784])&lt;br /&gt;
  #placeholder for weights and bias&lt;br /&gt;
  W = tf.Variable(tf.zeros([784, 10]))&lt;br /&gt;
  b = tf.Variable(tf.zeros([10]))&lt;br /&gt;
  #tensorflow model&lt;br /&gt;
  y = tf.nn.softmax(tf.matmul(x, W) + b)&lt;br /&gt;
  &lt;br /&gt;
  #loss function&lt;br /&gt;
  y_ = tf.placeholder(tf.float32, [None, 10])&lt;br /&gt;
  cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))&lt;br /&gt;
&lt;br /&gt;
  #gradient descent step&lt;br /&gt;
  train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)&lt;br /&gt;
&lt;br /&gt;
  init = tf.initialize_all_variables()&lt;br /&gt;
  sess = tf.Session()&lt;br /&gt;
  sess.run(init)&lt;br /&gt;
  for i in range(1000):&lt;br /&gt;
    batch_xs, batch_ys = mnist.train.next_batch(100)&lt;br /&gt;
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})&lt;br /&gt;
  correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))&lt;br /&gt;
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))&lt;br /&gt;
  print(&amp;quot;Accuracy: %s&amp;quot; % sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))&lt;br /&gt;
&lt;br /&gt;
[[File:Tensorflow-mnist-failures.png|400px|thumb|Правильные метки {{---}} 5, 4, 9, 7. Результат классификации {{---}} 6, 6, 4, 4.]]&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
  Accuracy: 0.9164&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На рисунке справа показаны четыре типичных изображения, на которых классификаторы ошибаются. Согласитесь, случаи действительно тяжелые.&lt;br /&gt;
&lt;br /&gt;
====Пример на языке Java=====&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test datasets and build MLP classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Print the result à la Weka explorer:&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Сверточные нейронные сети|Сверточные нейронные сети]]&lt;br /&gt;
*[[:Рекуррентные нейронные сети|Рекуррентные нейронные сети]]&lt;br /&gt;
*[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 93-123.&lt;br /&gt;
* [https://neuralnet.info/book/ Нейронные сети {{---}} учебник ]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Нейронные сети]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=70932</id>
		<title>Логистическая регрессия</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=70932"/>
				<updated>2019-04-09T00:07:08Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: /* Пример на языке Java */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''Логистическая регрессия''' (англ. ''logistic regression'') — метод построения линейного классификатора, позволяющий оценивать апостериорные вероятности принадлежности объектов классам.&lt;br /&gt;
== Описание ==&lt;br /&gt;
Логистическая регрессия применяется для прогнозирования вероятности возникновения некоторого события по значениям множества признаков. Для этого вводится зависимая переменная $y$, принимающая значения $0$ и $1$ и множество [[Независимые случайные величины|независимых]] переменных &amp;lt;tex&amp;gt;x_1, ... x_n&amp;lt;/tex&amp;gt; на основе значений которых требуется вычислить вероятность принятия того или иного значения зависимой переменной.&lt;br /&gt;
&lt;br /&gt;
Итак, пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ {{---}} конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &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;
Рассмотрим случай двух классов: $Y = \{-1, +1\}$. В логистической регрессии строится линейный алгоритм классификации $a: X \to Y$ вида &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x, w) = \mathrm{sign}\left(\sum\limits_{j=1}^n w_j f_j(x) - w_0 \right)=\mathrm{sign}\left&amp;lt;x, w\right&amp;gt;&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
где $w_j$ $-$ вес $j$-го признака, $w_0$ $-$ порог принятия решения, $w=\left(w_0, ..., w_n\right)$ $-$ вектор весов, $\left&amp;lt;x, w\right&amp;gt;$ $-$ скалярное произведение признакового описания объекта на вектор весов. Предполагается, что искусственно введён нулевой признак: $f_{0}(x)=-1$.&lt;br /&gt;
&lt;br /&gt;
Задача обучения линейного классификатора заключается в том, чтобы по выборке  $X^m$ настроить вектор весов $w$. В логистической регрессии для этого решается задача минимизации эмпирического риска с функцией потерь специального вида: &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^m \ln\left( 1 + \exp( -y_i \langle x_i,w \rangle ) \right) \to \min_{w}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После того, как решение $w$ найдено, становится возможным не только вычислять классификацию $a(x) = \mathrm{sign}\langle x,w \rangle$ для произвольного объекта $x$, но и оценивать апостериорные вероятности его принадлежности классам:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
где $\sigma(z) = \frac1{1+e^{-z}}$ {{---}} сигмоидная функция.&lt;br /&gt;
&lt;br /&gt;
== Обоснование ==&lt;br /&gt;
'''С точки зрения [[Байесовский классификатор|байесовского классификатора]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Наиболее строгое обоснование логистической регрессии опирается на следующую теорему&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть&lt;br /&gt;
*выборка прецедентов $\mathrm{X}^l=\{\left(x_1, y_1\right), ... ,\left(x_l, y_l\right)\}$  получена согласно вероятностному распределению с плотностью &lt;br /&gt;
&amp;lt;tex&amp;gt;p\left(x, y\right)=\mathrm{P}_yp_y\left(x\right)=\mathrm{P}\left(y|x\right)p\left(x\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
где $\mathrm{P}_y$ {{---}} ''априорные вероятности'',&lt;br /&gt;
$p_y(x)$ $-$ ''функции правдоподобия'', принадлежащие экспонентному семейству плотностей (т.е. $p_y(x) = \exp \left( \langle\theta,x\rangle \cdot a(\delta) + b(\delta,\theta) + d(x,\delta) \right)$, где $a, b, d$ $-$ произвольные функции);&lt;br /&gt;
*функции правдоподобия имеют равные знаения параметра разброса $\delta$ и отличаются только значениями параметра сдвига $\theta_y$;&lt;br /&gt;
*среди признаков есть константа, скажем, $f_0(x) = -1$;&lt;br /&gt;
Тогда &lt;br /&gt;
*линейный классификатор является оптимальным байесовским классификатором;&lt;br /&gt;
*апостериорные вероятности классов оценивается по формуле &amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Напомним, что оптимальный байесовский классификатор для двух классов выглядит следущим образом:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a\left(x\right)=&lt;br /&gt;
\mathrm{sign}\left(\lambda_+\mathrm{P}\left(+1|x\right)-\lambda_-\mathrm{P}\left(-1|x\right)\right)=&lt;br /&gt;
\mathrm{sign}\left(\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)}-\frac{\lambda_-}{\lambda_+}\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим отношение апостериорных вероятностей классов  &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
и распишем функции правдоподобия, используя экспонентную формулу с параметрами $\theta_y$ и $\delta$:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)} = \exp\left(\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle+b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-}\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим получившуюся под экспонентой сумму: &lt;br /&gt;
*$\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle = \langle w, x\rangle$. Вектор $w$ не зависит от $x$ и является вектором свободных коэффициентов(весов) при константных признаках;&lt;br /&gt;
*$b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-} = \mathrm{const}\left(x\right)$. Можно считать данные слагаемые аддитивной добавкой к коэффициенту при признаке. Но так как свободные коэффициенты настраиваются по обучающей выборке, вычислять эту добавку не имеет смысла и ее можно включить в $\langle w, x\rangle$.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \mathrm{e}^{\langle w, x\rangle}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разделяющая поверхность в байесовском решающем правиле определяется уравнением &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\lambda_- \mathrm{P}\left(-1|x\right) = \lambda_+ \mathrm{P}\left(+1|x\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
которое равносильно &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\langle w, x\rangle - \ln\frac{\lambda_-}{\lambda_+} = 0&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следовательно, разделяющая поверхность линейна и первый пункт теоремы доказан.&lt;br /&gt;
&lt;br /&gt;
Используя [[Формула полной вероятности|формулу полной вероятности]] получаем следующее равенство&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(+1|x\right) + \mathrm{P}\left(-1|x\right) = \sigma\left(+\langle w ,x\rangle\right) + \sigma\left(-\langle w ,x\rangle\right) = 1&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откуда следует:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(y|x\right)=\sigma\left(\langle w, x\rangle y\right), y = \{-1, +1\}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
Таким образом, второй пункт теоремы доказан.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
=== scikit-learn ===&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.'''LogisticRegression'''] имеет несколько параметров, например:&lt;br /&gt;
* '''solver''' $-$ алгоритм, использующийся для оптимизации;&lt;br /&gt;
* '''multi_class''' $-$ классификация на 2 или много классов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки:&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' LogisticRegression&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества:&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение:&lt;br /&gt;
 clf = LogisticRegression(random_state='''0''', solver='lbfgs', multi_class='multinomial')&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание:&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
=== [[Примеры кода на Scala#Логистическая регрессия|Пример кода на Scala]] ===&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример логистической регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Линейная регрессия]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;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%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Логистическая регрессия]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Logistic_regression Wikipedia {{---}} Logistic regression]&lt;br /&gt;
* [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html scikit-learn.org {{---}} документация по sklearn.linear_model.LogisticRegression]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70931</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70931"/>
				<updated>2019-04-09T00:06:50Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия#Пример на языке Java}}&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java}}&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java_2}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test datasets and build MLP classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Print the result à la Weka explorer:&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)#Пример на языке Java}}&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=70930</id>
		<title>Логистическая регрессия</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=70930"/>
				<updated>2019-04-09T00:06:18Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: /* Примеры кода */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''Логистическая регрессия''' (англ. ''logistic regression'') — метод построения линейного классификатора, позволяющий оценивать апостериорные вероятности принадлежности объектов классам.&lt;br /&gt;
== Описание ==&lt;br /&gt;
Логистическая регрессия применяется для прогнозирования вероятности возникновения некоторого события по значениям множества признаков. Для этого вводится зависимая переменная $y$, принимающая значения $0$ и $1$ и множество [[Независимые случайные величины|независимых]] переменных &amp;lt;tex&amp;gt;x_1, ... x_n&amp;lt;/tex&amp;gt; на основе значений которых требуется вычислить вероятность принятия того или иного значения зависимой переменной.&lt;br /&gt;
&lt;br /&gt;
Итак, пусть объекты задаются $n$ числовыми признаками $f_j : X \to R, j = 1 ... n$ и пространство признаковых описаний в таком случае $X = R^n$. Пусть $Y$ {{---}} конечное множество меток классов и задана обучающая выборка пар «объект-ответ» &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;
Рассмотрим случай двух классов: $Y = \{-1, +1\}$. В логистической регрессии строится линейный алгоритм классификации $a: X \to Y$ вида &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x, w) = \mathrm{sign}\left(\sum\limits_{j=1}^n w_j f_j(x) - w_0 \right)=\mathrm{sign}\left&amp;lt;x, w\right&amp;gt;&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
где $w_j$ $-$ вес $j$-го признака, $w_0$ $-$ порог принятия решения, $w=\left(w_0, ..., w_n\right)$ $-$ вектор весов, $\left&amp;lt;x, w\right&amp;gt;$ $-$ скалярное произведение признакового описания объекта на вектор весов. Предполагается, что искусственно введён нулевой признак: $f_{0}(x)=-1$.&lt;br /&gt;
&lt;br /&gt;
Задача обучения линейного классификатора заключается в том, чтобы по выборке  $X^m$ настроить вектор весов $w$. В логистической регрессии для этого решается задача минимизации эмпирического риска с функцией потерь специального вида: &amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;Q(w) = \sum\limits_{i=1}^m \ln\left( 1 + \exp( -y_i \langle x_i,w \rangle ) \right) \to \min_{w}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После того, как решение $w$ найдено, становится возможным не только вычислять классификацию $a(x) = \mathrm{sign}\langle x,w \rangle$ для произвольного объекта $x$, но и оценивать апостериорные вероятности его принадлежности классам:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
где $\sigma(z) = \frac1{1+e^{-z}}$ {{---}} сигмоидная функция.&lt;br /&gt;
&lt;br /&gt;
== Обоснование ==&lt;br /&gt;
'''С точки зрения [[Байесовский классификатор|байесовского классификатора]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Наиболее строгое обоснование логистической регрессии опирается на следующую теорему&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть&lt;br /&gt;
*выборка прецедентов $\mathrm{X}^l=\{\left(x_1, y_1\right), ... ,\left(x_l, y_l\right)\}$  получена согласно вероятностному распределению с плотностью &lt;br /&gt;
&amp;lt;tex&amp;gt;p\left(x, y\right)=\mathrm{P}_yp_y\left(x\right)=\mathrm{P}\left(y|x\right)p\left(x\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
где $\mathrm{P}_y$ {{---}} ''априорные вероятности'',&lt;br /&gt;
$p_y(x)$ $-$ ''функции правдоподобия'', принадлежащие экспонентному семейству плотностей (т.е. $p_y(x) = \exp \left( \langle\theta,x\rangle \cdot a(\delta) + b(\delta,\theta) + d(x,\delta) \right)$, где $a, b, d$ $-$ произвольные функции);&lt;br /&gt;
*функции правдоподобия имеют равные знаения параметра разброса $\delta$ и отличаются только значениями параметра сдвига $\theta_y$;&lt;br /&gt;
*среди признаков есть константа, скажем, $f_0(x) = -1$;&lt;br /&gt;
Тогда &lt;br /&gt;
*линейный классификатор является оптимальным байесовским классификатором;&lt;br /&gt;
*апостериорные вероятности классов оценивается по формуле &amp;lt;tex&amp;gt;\mathbb{P}\{y|x\} = \sigma\left( y \langle x,w \rangle\right),\;\; y\in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Напомним, что оптимальный байесовский классификатор для двух классов выглядит следущим образом:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a\left(x\right)=&lt;br /&gt;
\mathrm{sign}\left(\lambda_+\mathrm{P}\left(+1|x\right)-\lambda_-\mathrm{P}\left(-1|x\right)\right)=&lt;br /&gt;
\mathrm{sign}\left(\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)}-\frac{\lambda_-}{\lambda_+}\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим отношение апостериорных вероятностей классов  &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
и распишем функции правдоподобия, используя экспонентную формулу с параметрами $\theta_y$ и $\delta$:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P_+}p_+(x)}{\mathrm{P}_-p_-(x)} = \exp\left(\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle+b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-}\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим получившуюся под экспонентой сумму: &lt;br /&gt;
*$\langle\left(c_+(\delta)\theta_+-c_-(\delta)\theta_-\right), x\rangle = \langle w, x\rangle$. Вектор $w$ не зависит от $x$ и является вектором свободных коэффициентов(весов) при константных признаках;&lt;br /&gt;
*$b_+(\delta, \theta_+)-b_-(\delta, \theta_-) + \ln\frac{\mathrm{P}_+}{\mathrm{P}_-} = \mathrm{const}\left(x\right)$. Можно считать данные слагаемые аддитивной добавкой к коэффициенту при признаке. Но так как свободные коэффициенты настраиваются по обучающей выборке, вычислять эту добавку не имеет смысла и ее можно включить в $\langle w, x\rangle$.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\frac{\mathrm{P}\left(+1|x\right)}{\mathrm{P}\left(-1|x\right)} = \mathrm{e}^{\langle w, x\rangle}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Разделяющая поверхность в байесовском решающем правиле определяется уравнением &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\lambda_- \mathrm{P}\left(-1|x\right) = \lambda_+ \mathrm{P}\left(+1|x\right)&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
которое равносильно &lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\langle w, x\rangle - \ln\frac{\lambda_-}{\lambda_+} = 0&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следовательно, разделяющая поверхность линейна и первый пункт теоремы доказан.&lt;br /&gt;
&lt;br /&gt;
Используя [[Формула полной вероятности|формулу полной вероятности]] получаем следующее равенство&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(+1|x\right) + \mathrm{P}\left(-1|x\right) = \sigma\left(+\langle w ,x\rangle\right) + \sigma\left(-\langle w ,x\rangle\right) = 1&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Откуда следует:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{P}\left(y|x\right)=\sigma\left(\langle w, x\rangle y\right), y = \{-1, +1\}&amp;lt;/tex&amp;gt;,&amp;lt;/center&amp;gt;&lt;br /&gt;
Таким образом, второй пункт теоремы доказан.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
=== scikit-learn ===&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.'''LogisticRegression'''] имеет несколько параметров, например:&lt;br /&gt;
* '''solver''' $-$ алгоритм, использующийся для оптимизации;&lt;br /&gt;
* '''multi_class''' $-$ классификация на 2 или много классов.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Импортируем нужные библиотеки:&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' LogisticRegression&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
* Выберем тренировочное и тестовое множества:&lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
* Обучение:&lt;br /&gt;
 clf = LogisticRegression(random_state='''0''', solver='lbfgs', multi_class='multinomial')&lt;br /&gt;
 model = clf.'''fit'''(X_train, y_train)&lt;br /&gt;
&lt;br /&gt;
* Предсказание:&lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 model.'''score'''(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
=== [[Примеры кода на Scala#Логистическая регрессия|Пример кода на Scala]] ===&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример линейной регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Линейная регрессия]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;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%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Логистическая регрессия]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Logistic_regression Wikipedia {{---}} Logistic regression]&lt;br /&gt;
* [https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html scikit-learn.org {{---}} документация по sklearn.linear_model.LogisticRegression]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=70929</id>
		<title>Линейная регрессия</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F&amp;diff=70929"/>
				<updated>2019-04-09T00:04:28Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: /* Пример кода для Scikit-learn */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Линейная регрессия''' (англ. ''linear regression'') — метод восстановления зависимости одной (объясняемой, зависимой) переменной &amp;lt;tex&amp;gt; y &amp;lt;/tex&amp;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 &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
== Задача ==&lt;br /&gt;
&lt;br /&gt;
==== Дано ====&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt; f_1(x), \dots ,f_n(x) &amp;lt;/tex&amp;gt; — числовые признаки;&lt;br /&gt;
* модель многомерной линейной регрессии: &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; f(x,\alpha) = \sum\limits_{j=1}^n \alpha_j f_j(x) &amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt; где &amp;lt;tex&amp;gt; a \in R^n &amp;lt;/tex&amp;gt;;&lt;br /&gt;
* обучающая выборка: множество из пар &amp;lt;tex&amp;gt;(x_i, y_i)_{i=1 \dots n}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; x_i &amp;lt;/tex&amp;gt; — объекты из множества &amp;lt;tex&amp;gt; X = R^n &amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; y_i &amp;lt;/tex&amp;gt; — объекты из множества &amp;lt;tex&amp;gt; X = R &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Матричные обозначения ====&lt;br /&gt;
&lt;br /&gt;
Перейдем к матричным обозначениям:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\underset{l \times n}{F} = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
  f_1(x_1) &amp;amp; \dots &amp;amp; f_n(x_1) \\&lt;br /&gt;
  \dots &amp;amp; \dots &amp;amp; \dots \\&lt;br /&gt;
  f_n(x_1) &amp;amp; \dots &amp;amp; f_n(x_l)&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
,&lt;br /&gt;
&lt;br /&gt;
\underset{l \times 1}{y} = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
  y_1 \\&lt;br /&gt;
  \dots \\&lt;br /&gt;
  y_l&lt;br /&gt;
\end{pmatrix},&lt;br /&gt;
&lt;br /&gt;
\underset{n \times 1}{\alpha} = &lt;br /&gt;
\begin{pmatrix}&lt;br /&gt;
  \alpha_1 \\&lt;br /&gt;
  \dots \\&lt;br /&gt;
  \alpha_l&lt;br /&gt;
\end{pmatrix}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где&lt;br /&gt;
* &amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt; — матрица объектов-признаков, где строки соответствуют объектам а столбцы — признакам;&lt;br /&gt;
* &amp;lt;tex&amp;gt; y &amp;lt;/tex&amp;gt; — вектор ответов, или целевой вектор;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \alpha &amp;lt;/tex&amp;gt; — вектор коэффициентов.&lt;br /&gt;
&lt;br /&gt;
==== Постановка задачи ====&lt;br /&gt;
&lt;br /&gt;
В этих трех векторно-матричных обозначениях очень удобно расписать постановку задачи наименьших квадратов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; Q(\alpha, X^l) = \sum\limits_{i=1}^n (f(x_i, \alpha) - y_i)^2 = || F\alpha - y ||^2 \rightarrow \underset{\alpha}{min} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Необходимо найти вектор &amp;lt;tex&amp;gt; \alpha &amp;lt;/tex&amp;gt; при известной матрице &amp;lt;tex&amp;gt; F &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;
&lt;br /&gt;
=== Нормальная система уравнений ===&lt;br /&gt;
&lt;br /&gt;
Запишем необходимые условия минимума в матричном виде:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \frac{\partial Q }{\partial \alpha } (\alpha) = 2F^T (F\alpha - y) = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда следует нормальная система задачи МНК:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; F^T F \alpha = F^T y &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt; F^T F — n \times n &amp;lt;/tex&amp;gt; матрица.&lt;br /&gt;
&lt;br /&gt;
Мы получили систему уравнений, откуда можем выразить искомый вектор &amp;lt;tex&amp;gt; \alpha &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Решение системы ====&lt;br /&gt;
&amp;lt;tex&amp;gt; \alpha^* = (F^T F)^{-1} F^T y = F^+ y &amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt; где &amp;lt;tex&amp;gt; F^+ &amp;lt;/tex&amp;gt; — псевдо-обратная матрица.&lt;br /&gt;
&lt;br /&gt;
Значение функционала: &amp;lt;tex&amp;gt; Q(\alpha^*) = ||P_F y - y||^2 &amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt; где &amp;lt;tex&amp;gt; P_F = F F^+ = F (F^T F)^{-1} F^T &amp;lt;/tex&amp;gt; — ''проекционная матрица''.&lt;br /&gt;
&lt;br /&gt;
==== Проблемы ====&lt;br /&gt;
&lt;br /&gt;
В случае мультиколлинеарности (столбцы матрицы &amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt; линейно-зависимы) нам не удастся найти обратную матрицу к &amp;lt;tex&amp;gt; F^T F &amp;lt;/tex&amp;gt; (она будет вырождена).&lt;br /&gt;
&lt;br /&gt;
Если же столбцы матрицы &amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt; почти линейно-зависимы, то у нас возникнет масса вычислительных проблем с обращением этой матрицы.&lt;br /&gt;
&lt;br /&gt;
=== Решение МНК через сингулярное разложение ===&lt;br /&gt;
&lt;br /&gt;
Воспользуемся понятием [[ Сингулярное разложение | сингулярного разложения ]], которое позволяет произвольную прямоугольную матрицу представить в виде произведения трех матриц:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; F = V D U^T &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Найдем псевдо-обратную матрицу: &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; F^+ = (U D V^T V D U^T)^{-1} U D V^T = U D^{-1} V^T = \sum\limits_{j=1}^n \frac{ 1 }{ \sqrt{ \lambda_j } } u_j v_j^T &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь, зная псевдо-обратную матрицу, найдем решение задачи наименьших квадратов: &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; \alpha^* = F^+ y = U D^{-1} V^T y = \sum\limits_{j=1}^n \frac{ 1 }{ \sqrt{ \lambda_j } } u_j (v_j^T y) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Найдем вектор, которым наша линейная модель аппроксимирует целевой вектор &amp;lt;tex&amp;gt; y &amp;lt;/tex&amp;gt;: &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; F \alpha^* = P_F y = (V D U^T) U D^{-1} V^T y = V V^T y = \sum\limits_{j=1}^n v_j (v_j^T y) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Квадрат нормы вектора коэффициентов: &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; || \alpha^* ||^2 = ||D^{-1} V^T y||^2 = \sum\limits_{j=1}^n \frac{ 1 }{ \lambda_j } (v_j^T y)^2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В 3-х из 4-х формул сингулярные числа оказались в знаменателе. Если имеются сингулярные числа приближающиеся к 0, то мы получаем проблему мультиколлинеарности. Близкие к 0 собственные значения или сингулярные числа — показатель того, что среди признаков есть почти линейно-зависимый.&lt;br /&gt;
&lt;br /&gt;
== Проблема мультиколлинеарности и переобучения ==&lt;br /&gt;
&lt;br /&gt;
Если имеются сингулярные числа близкие к 0, то:&lt;br /&gt;
&lt;br /&gt;
* матрица &amp;lt;tex&amp;gt; \sum = F^T F &amp;lt;/tex&amp;gt; плохо обусловлена;&lt;br /&gt;
* решение становится неустойчивым и неинтерпретируемым, слишком большие коэффициенты &amp;lt;tex&amp;gt; || \alpha_j || &amp;lt;/tex&amp;gt; разных знаков;&lt;br /&gt;
* возникает переобучение: &amp;lt;br&amp;gt; на обучении &amp;lt;tex&amp;gt; Q( \alpha^*, X^l ) = ||F \alpha^* - y||^2 &amp;lt;/tex&amp;gt; мало; &amp;lt;br&amp;gt; на контроле &amp;lt;tex&amp;gt; Q( \alpha^*, X^k ) = ||F' \alpha^* - y'||^2 &amp;lt;/tex&amp;gt; велико.&lt;br /&gt;
&lt;br /&gt;
Стратегии устранения мультиколлинеарности и переобучения:&lt;br /&gt;
&lt;br /&gt;
* отбор признаков, то есть выкидываем те признаки, которые могут оказаться линейно-зависимыми: &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; f_1, \dots, f_n \rightarrow f_{j_1} \dots, f_{j_m}, m \leq n &amp;lt;/tex&amp;gt;;&lt;br /&gt;
* регуляризация (накладываем дополнительные ограничения на вектор коэффициентов): &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; || \alpha || \rightarrow min &amp;lt;/tex&amp;gt;;&lt;br /&gt;
* преобразование признаков, чтобы в новом признаковом пространстве признаков оказалось меньше, но они хорошо восстанавливали бы исходные: &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt; f_1, \dots, f_n \rightarrow g_1 \dots, g_m, m \ll n &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
=== Пример кода для Scikit-learn ===&lt;br /&gt;
&lt;br /&gt;
 '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
 '''from''' sklearn '''import''' datasets, linear_model&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# generate dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = datasets.make_regression(n_samples=1_000, n_features=1, noise=8, shuffle=True)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# test and train data sizes&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_size = 700&lt;br /&gt;
 test_size = 300&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# split the data into training/testing sets&amp;lt;/font&amp;gt;&lt;br /&gt;
 X_train = X[:-train_size]&lt;br /&gt;
 X_test = X[-test_size:]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# split the targets into training/testing sets&amp;lt;/font&amp;gt;&lt;br /&gt;
 y_train = y[:-train_size]&lt;br /&gt;
 y_test = y[-test_size:]&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# create linear regression object&amp;lt;/font&amp;gt;&lt;br /&gt;
 regr = linear_model.LinearRegression()&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# train the model using the training sets&amp;lt;/font&amp;gt;&lt;br /&gt;
 regr.fit(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# make predictions using the testing set&amp;lt;/font&amp;gt;&lt;br /&gt;
 y_pred = regr.predict(X_test)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# plot outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
 plt.scatter(X_test, y_test, color='red', s=5)&lt;br /&gt;
 plt.plot(X_test, y_pred, color='blue', linewidth=2)&lt;br /&gt;
  &lt;br /&gt;
 plt.xticks(())&lt;br /&gt;
 plt.yticks(())&lt;br /&gt;
 &lt;br /&gt;
 plt.show()&lt;br /&gt;
&lt;br /&gt;
Возможный результат исполнения программы:&lt;br /&gt;
&lt;br /&gt;
[[Файл: Linear_regression_example.png]]&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример линейной регресии с применением &amp;lt;code&amp;gt;weka.classifiers.functions.LinearRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимомсть:&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.functions.LinearRegression;&lt;br /&gt;
  '''import''' weka.core.Instance;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Load Data set&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;dataset/house.arff&amp;quot;)));&lt;br /&gt;
  data.setClassIndex(data.numAttributes() - 1);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Build model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new LinearRegression();&lt;br /&gt;
  '''try''' { model.buildClassifier(data); }&lt;br /&gt;
  '''catch''' (Exception e) { e.printStackTrace(); }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//output model&amp;lt;/font&amp;gt;&lt;br /&gt;
  System.out.printf(&amp;quot;model parameters: %s%n&amp;quot;, model);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Now Predicting the cost&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' myHouse = data.lastInstance();&lt;br /&gt;
  '''var''' price  = model.classifyInstance(myHouse);&lt;br /&gt;
  System.out.printf(&amp;quot;predicted price = %s%n&amp;quot;, price)&lt;br /&gt;
&lt;br /&gt;
==Применение==&lt;br /&gt;
&lt;br /&gt;
Перечислим несколько примеров реального применения линейной регрессии:&lt;br /&gt;
&lt;br /&gt;
* для предсказания скидки на продукты на основе поведения покупателей в прошлом;&lt;br /&gt;
* экономисты использую линейную регрессия для предсказания экономического роста страны или региона;&lt;br /&gt;
* застройщики при помощи данного метода могут предсказать, сколько домов он продаст в ближайшие месяцы и по какой цене;&lt;br /&gt;
* цены на нефть могут быть предсказаны с использованием линейной регрессии.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Вариации регрессии]]&lt;br /&gt;
* [[Логистическая регрессия]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
* [[Переобучение]]&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%BD%D0%BE%D0%B3%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Многомерная линейная регрессия]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%29 machinelearning.ru {{---}} Линейная регрессия (пример)]&lt;br /&gt;
* [https://www.coursera.org/learn/vvedenie-mashinnoe-obuchenie/home/info Coursera {{---}} &amp;quot;Введение в машинное обучение&amp;quot;, Неделя 4, ]&lt;br /&gt;
* [http://www.ccas.ru/voron/download/Regression.pdf Лекции по алгоритмам восстановления регрессии К. В. Воронцов]&lt;br /&gt;
* [https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py Scikit-Learn {{---}} Linear Regression Example]&lt;br /&gt;
* [https://www.quora.com/What-are-some-real-world-applications-of-simple-linear-regression What are some real-world applications of &amp;quot;simple&amp;quot; linear regression?]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70928</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70928"/>
				<updated>2019-04-09T00:02:46Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
Пример линейной регресии с применением &amp;lt;code&amp;gt;weka.classifiers.functions.LinearRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.LinearRegression;&lt;br /&gt;
  '''import''' weka.core.Instance;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Load Data set&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;dataset/house.arff&amp;quot;)));&lt;br /&gt;
  data.setClassIndex(data.numAttributes() - 1);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Build model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new LinearRegression();&lt;br /&gt;
  '''try''' { model.buildClassifier(data); }&lt;br /&gt;
  '''catch''' (Exception e) { e.printStackTrace(); }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//output model&amp;lt;/font&amp;gt;&lt;br /&gt;
  System.out.printf(&amp;quot;model parameters: %s%n&amp;quot;, model);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Now Predicting the cost&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' myHouse = data.lastInstance();&lt;br /&gt;
  '''var''' price  = model.classifyInstance(myHouse);&lt;br /&gt;
  System.out.printf(&amp;quot;predicted price = %s%n&amp;quot;, price)&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
Пример линейной регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java}}&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Пример на языке Java_2}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test datasets and build MLP classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Print the result à la Weka explorer:&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)#Пример на языке Java}}&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B8&amp;diff=70927</id>
		<title>Вариации регрессии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B8&amp;diff=70927"/>
				<updated>2019-04-08T23:59:41Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: /* Лассо-регрессия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Регрессия''' (англ. ''Regression'') {{---}} метод моделирования зависимости между зависимой переменной &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; и одной или несколькими независимыми переменными &amp;lt;tex&amp;gt;x_1, x_2, \dots, x_n&amp;lt;/tex&amp;gt;. В случае нескольких независимых переменных регрессия называется '''множественной''' (англ. ''multivariate regression''). Цель регрессионного анализа состоит в том, чтобы оценить значение непрерывной выходной переменной по значениям входных переменных.&lt;br /&gt;
&lt;br /&gt;
==Линейная регрессия==&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
&lt;br /&gt;
'''Линейная регрессия''' (англ. ''linear regression'') {{---}} разновидность регрессии для моделирования линейной зависимости между зависимой и независимой переменными.&lt;br /&gt;
&lt;br /&gt;
==Логистическая регрессия==&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
'''Логистическая регрессия''' (англ. ''logistic regression'') {{---}} разновидность регрессии для прогнозирования вероятности некоторого события по значениям независимых переменных. Зависимая переменная &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в этом случае принимает значения &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; (рассматриваемое событие не произошло или произошло соответственно).&lt;br /&gt;
&lt;br /&gt;
==Гребневая регрессия (ридж-регрессия)==&lt;br /&gt;
'''Гребневая регрессия или ридж-регрессия''' (англ. ''ridge regression'') {{---}} один из методов [[Уменьшение размерности|понижения размерности]]. Применяется для борьбы с избыточностью данных, когда независимые переменные коррелируют друг с другом, вследствие чего проявляется неустойчивость оценок коэффициентов многомерной линейной регрессии. &lt;br /&gt;
&lt;br /&gt;
===Мотивация===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Мультиколлинеарность''' (англ. ''multicollinearity'') {{---}} наличие линейной зависимости между независимыми переменными регрессионной модели. Различают ''полную коллинеарность'' и ''частичную'' или просто ''мультиколлинеарность'' {{---}} наличие сильной корреляции между независимыми переменными.&lt;br /&gt;
}}&lt;br /&gt;
Рассмотрим пример линейной модели: &amp;lt;tex&amp;gt;y = b_1 x_1 + b_2 x_2 + b_3 x_3 + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть имеет место зависимость &amp;lt;tex&amp;gt;x_1 = x_2 + x_ 3&amp;lt;/tex&amp;gt;. Добавим к первому коэффициенту произвольное число &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, а из двух других коэффициентов это же число вычтем.&lt;br /&gt;
Получаем (без случайной ошибки):&lt;br /&gt;
:&amp;lt;tex&amp;gt;y = (b_1 + a)x_1 + (b_2 - a)x_2 + (b_3 - a)x_3 = b_1 x_1 + b_2 x_2 + b_3 x_3 + a(x_1 - x_2 - x_3) = b_1 x_1 + b_2 x_2 + b_3 x_3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Несмотря на относительно произвольное изменение коэффициентов модели мы получили исходную модель, то есть такая модель неидентифицируема.&lt;br /&gt;
&lt;br /&gt;
На практике чаще встречается проблема сильной корреляции между независимыми переменными. В этом случае оценки параметров модели получить можно, но они будут неустойчивыми.&lt;br /&gt;
&lt;br /&gt;
===Описание===&lt;br /&gt;
Напомним задачу многомерной линейной регрессии:&lt;br /&gt;
&lt;br /&gt;
Рассматривается линейная зависимость &amp;lt;tex&amp;gt;f(x, \beta) = \langle \beta, x \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Находим вектор &amp;lt;tex&amp;gt;\beta^*&amp;lt;/tex&amp;gt;, при котором достигается минимум среднего квадрата ошибки:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q(\beta) = ||F \beta - y||^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^*=\arg \min\limits_\beta Q(\beta)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Методом наименьших квадратов находим решение:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^* = (F^T F)^{-1} F^T y&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В условиях мультиколлинеарности матрица &amp;lt;tex&amp;gt;F^T F&amp;lt;/tex&amp;gt; становится плохо обусловленной.&lt;br /&gt;
&lt;br /&gt;
Для решения этой проблемы наложим ограничение на величину коэффициентов &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;||\overrightarrow{\beta}||_2^2 \leq t^2&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Функционал &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; с учетом ограничения принимает вид:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{\lambda}(\beta) = ||F \beta - y||^2 + \lambda ||\beta||^2&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; {{---}} неотрицательный параметр.&lt;br /&gt;
&lt;br /&gt;
Решением в этом случае будет&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^* = (F^T F + \lambda I_n)^{-1} F^T y&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это изменение увеличивает собственные значения матрицы &amp;lt;tex&amp;gt;F^T F&amp;lt;/tex&amp;gt;, но не изменяет ее собственные вектора. В результате имеем хорошо обусловленную матрицу.&lt;br /&gt;
&lt;br /&gt;
Диагональная матрица &amp;lt;tex&amp;gt;\lambda I_n&amp;lt;/tex&amp;gt; называется '''гребнем'''.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Пример кода для Scikit-learn====&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' Ridge&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 ridge_regression = Ridge(alpha=0.1)  &amp;lt;font color = green&amp;gt;# alpha {{---}} величина регуляризации&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 ridge_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(ridge_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(ridge_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8171822749108134&lt;br /&gt;
&lt;br /&gt;
====Пример на языке Java====&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
&lt;br /&gt;
==Лассо-регрессия==&lt;br /&gt;
[[Файл: Ridge_and_Lasso_Regression.png|400px|thumb|Рис.1. Сравнение Лассо- и Ридж- регрессии, пример для двумерного пространства независимых переменных.&amp;lt;br/&amp;gt;Бирюзовые области изображают ограничения на коэффициенты &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, эллипсы {{---}} некоторые значения функции наименьшей квадратичной ошибки.]]&lt;br /&gt;
&lt;br /&gt;
'''Метод регрессии лассо''' (англ. ''LASSO, Least Absolute Shrinkage and Selection Operator'') похож на гребневую регрессию, но он использует другое ограничение на коэффициенты &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;||\overrightarrow{\beta}||_1 \leq t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функционал &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; принимает следующий вид:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{\lambda}(\beta) = ||F \beta - y||^2 + \lambda ||\beta||&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основное различие лассо- и ридж-регрессии заключается в том, что первая может приводить к обращению некоторых независимых переменных в ноль, тогда как вторая уменьшает их до значений, близких к нулю. Рассмотрим для простоты двумерное пространство независимых переменных. В случае лассо-регрессии органичение на коэффициенты представляет собой ромб (&amp;lt;tex&amp;gt;|\beta_1| + |\beta_2| \leq t&amp;lt;/tex&amp;gt;), в случае ридж-регрессии {{---}} круг (&amp;lt;tex&amp;gt;\beta_1^2 + \beta_2^2 \leq t^2&amp;lt;/tex&amp;gt;). Необходимо минимизировать функцию ошибки, но при этом соблюсти ограничения на коэффициенты. С геометрической точки зрения задача состоит в том, чтобы найти точку касания линии, отражающей функцию ошибки с фигурой, отражающей ограничения на &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. Из рисунка 1 интуитивно понятно, что в случае лассо-регрессии эта точка с большой вероятностью будет находиться на углах ромба, то есть лежать на оси, тогда как в случае ридж-регрессии такое происходит очень редко. Если точка пересечения лежит на оси, один из коэффициентов будет равен нулю, а значит, значение соответствующей независимой переменной не будет учитываться.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Пример кода для Scikit-learn====&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' Lasso&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 lasso_regression = Lasso(alpha=0.1) &amp;lt;font color = green&amp;gt;# alpha {{---}} величина регуляризации&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 lasso_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(lasso_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(lasso_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8173906804156383&lt;br /&gt;
&lt;br /&gt;
====Пример на языке Java====&lt;br /&gt;
&lt;br /&gt;
Пример Лассо-регрессии с применением &amp;lt;code&amp;gt;smile.regression.LASSO&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.LASSO;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lasso   = new LASSO(dataset.x(), dataset.y(), 10);&lt;br /&gt;
  lasso.predict(testX);&lt;br /&gt;
&lt;br /&gt;
==Байесовская регрессия==&lt;br /&gt;
Описанные выше методы никак не учитывали наличие в данных шума, тогда как в реальных данных он скорее всего будет присутствовать. Предположим, что в данных все же есть некоторый шум, и что он распределен нормально. Тогда задачу линейной регрессии можно записать в следующем виде:&lt;br /&gt;
:&amp;lt;tex&amp;gt;f(x, \beta) = \langle \beta, x \rangle + \varepsilon&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\varepsilon \sim N(0, \sigma^2)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Решением этой задачи мы и будем заниматься в этом разделе.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Bayessian_regression_noise.jpg|250px|thumb|Рис.2. Регрессия и шум в данных.&amp;lt;br/&amp;gt;Синяя точка {{---}} значение из датасета, красная {{---}} значение, полученное в результате работы алгоритма регрессии. Также на рисунке зеленой линией изображена предсказанная функция, а черной {{---}} гауссово распределение шума.]]&lt;br /&gt;
&lt;br /&gt;
'''Байесовская линейная регрессия''' (англ. ''Bayesian linear regression'') {{---}} подход в линейной регрессии, в котором предполагается что шум распределен нормально.&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 синяя точка показывает значения из датасета, красная {{---}} значение, предсказанное регрессией. Поскольку центр гауссианы находится в красной точке, маленькие отклонения синей точки от красной более вероятны, а большие менее вероятны.&lt;br /&gt;
&lt;br /&gt;
Для решения поставленной задачи регрессии воспользуемся методом максимального правдоподобия.&lt;br /&gt;
&lt;br /&gt;
Запишем правдоподобие:&lt;br /&gt;
:&amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2) = N(x \beta, \sigma^2)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где &amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2)&amp;lt;/tex&amp;gt; {{---}} плотность распределения значения &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; из датасета, которая, как мы ранее предположили, соответствует нормальному распределению с центром в точке &amp;lt;tex&amp;gt;x \beta&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;
:&amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2) = \prod\limits_{i=1}^n N(x_i \beta, \sigma^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку нас интересует только максимум, положим &amp;lt;tex&amp;gt;\sigma = 1&amp;lt;/tex&amp;gt;:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\arg\max p(y|x, \beta) = \arg\max \prod\limits_{i=1}^n N(x_i \beta, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Прологарифмируем это выражение:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\arg\max \ln p(y|x, \beta) = \arg\max \ln \prod\limits_{i=1}^n N(x_i \beta, 1) \\&lt;br /&gt;
 = \arg\max \ln {\left( \frac{1}{(\sqrt{2 \pi})^n} \exp{\left(-\frac{1}{2} \sum\limits_{i-1}^n (y_i - x_i \beta)^2\right)}\right )} \\&lt;br /&gt;
 = \arg\max - \sum\limits_{i=1}^n (y_i - x_i \beta)^2 \\&lt;br /&gt;
 = \arg\min \sum\limits_{i=1}^n (y_i - x_i \beta)^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, оказывается, что метод максимального правдоподобия с учетом шума в данных сводится к оценке по методу наименьших квадратов, которую мы уже видели в обынчой линейной регрессии.&lt;br /&gt;
&lt;br /&gt;
===Пример кода для Scikit-learn===&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' BayesianRidge&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 bayesian_regression = BayesianRidge()&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 bayesian_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(bayesian_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(bayesian_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8170548749907206&lt;br /&gt;
&lt;br /&gt;
==Логическая регрессия==&lt;br /&gt;
'''Логическая регрессия''' (англ. ''logic regression'') {{---}} обобщенный метод регрессии, применяемый в основном в случае, когда независимые переменные имеют двоичную природу (при этом зависимая переменная не обязательно двоичная). Задачей логической регрессии является определение независимых переменных, которые могут быть выражены как результат вычисления [[Определение булевой функции|булевой функции]] от других независимых переменных.&lt;br /&gt;
&lt;br /&gt;
Обычно в методах регрессии не учитывается связь между переменными. Предполагается, что влияние каждой переменной на результат не зависит от значений других переменных. Однако это предположение зачастую неверно.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x_1, x_2, \dots, x_k&amp;lt;/tex&amp;gt; {{---}} двоичные независимые переменные, и пусть &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} зависимая переменная. Будем пытаться натренировать модели регрессии вида &amp;lt;tex&amp;gt;g(E(y)) = b_0 + b_1 L_1 + \dots + b_n L_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L_j&amp;lt;/tex&amp;gt; {{---}} булева функция от переменных &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; (например &amp;lt;tex&amp;gt;L_j = (x_2 \lor \overline{x_4}) \land x_7&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Для каждого типа модели необходимо определить функцию, которая отражает качество рассматриваемой модели. Например, для линейной регрессии такой функцией может быть остаточная сумма квадратов. Целью метода логической регрессии является минимизация выбранной функции качества посредством настройки параметров &amp;lt;tex&amp;gt;b_j&amp;lt;/tex&amp;gt; одновременно с булевыми выражениями &amp;lt;tex&amp;gt;L_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Logic_tree_moves.jpg|400px|thumb|Рис.3. Допустимые действия в процессе роста дерева.&amp;lt;br/&amp;gt;Элементы, появившиеся в результате применения операции, выделены черным фоном.]]&lt;br /&gt;
&lt;br /&gt;
Может показаться не совсем понятным, как же применить регрессию к булевым выражениям. Рассмотрим в общих чертах алгоритм логической регрессии. &lt;br /&gt;
Логическая регрессия, как и другие методы регрессии, перебирает различные выражения в попытках минимизировать функцию потерь. Для &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; переменных можно составить &amp;lt;tex&amp;gt;2^{2^k}&amp;lt;/tex&amp;gt; различных выражений. Нужно найти более эффективный метод для поиска наилучшего выражения, чем простой перебор всех вариантов. &lt;br /&gt;
&lt;br /&gt;
Любое логическое выражение можно представить в виде дерева, где в узлах расположены операции, а листья представляют собой переменные. Будем называть такие деревья '''логическими деревьями''' (англ. ''logic trees''). Будем называть '''соседями''' (англ. ''neighbours'') логического дерева такие деревья, которые могут быть получены из него за один шаг. Допустимые шаги проиллюстрированы на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим самый простой алгоритм поиска наилучшего дерева {{---}} '''жадный поиск''' (англ. ''greedy search'').&lt;br /&gt;
# В качестве стартового дерева выберем одну переменную, которая дает минимальное значение функции потерь среди всех остальных переменных. &lt;br /&gt;
# Перебираем соседей текущего дерева и выбираем такое, что оно уменьшает значение функции потерь по сравнению с текущим, а также дает наименьший результат среди остальных соседей.&lt;br /&gt;
# Если такого дерева не существует, алгоритм завершается. Если оно все же есть, выбираем его в качестве текущего и повторяем второй шаг.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм склонен к переобучению, а также в некоторых ситуациях может остановиться преждевременно, так и не дойдя до наилучшего дерева. Существует также алгоритм под названием '''имитация отжига''' (англ. ''simulated annealing'') который показывает лучшие результаты, чем описанный жадный поиск.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Общие понятия]]&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://datareview.info/article/10-tipov-regressii-kakoy-vyibrat/ 10 типов регрессии {{---}} какой выбрать?]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%29 machinelearning.ru {{---}} Линейная регрессия (пример)]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%A0%D0%B8%D0%B4%D0%B6-%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Ридж-регрессия]&lt;br /&gt;
* [http://www.ccas.ru/voron/download/Regression.pdf Лекции по алгоритмам восстановления регрессии К. В. Воронцов]&lt;br /&gt;
* [https://towardsdatascience.com/ridge-and-lasso-regression-a-complete-guide-with-python-scikit-learn-e20e34bcbf0b Ridge and Lasso Regression: A Complete Guide with Python Scikit-Learn]&lt;br /&gt;
* [https://habr.com/ru/company/ods/blog/322076/ Habr {{---}} Базовые принципы машинного обучения на примере линейной регрессии]&lt;br /&gt;
* [http://kooperberg.fhcrc.org/logic/documents/documents.html Documents on Logic Regression]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B8&amp;diff=70926</id>
		<title>Вариации регрессии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B8&amp;diff=70926"/>
				<updated>2019-04-08T23:55:58Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: /* Пример на языке Java= */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Регрессия''' (англ. ''Regression'') {{---}} метод моделирования зависимости между зависимой переменной &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; и одной или несколькими независимыми переменными &amp;lt;tex&amp;gt;x_1, x_2, \dots, x_n&amp;lt;/tex&amp;gt;. В случае нескольких независимых переменных регрессия называется '''множественной''' (англ. ''multivariate regression''). Цель регрессионного анализа состоит в том, чтобы оценить значение непрерывной выходной переменной по значениям входных переменных.&lt;br /&gt;
&lt;br /&gt;
==Линейная регрессия==&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
&lt;br /&gt;
'''Линейная регрессия''' (англ. ''linear regression'') {{---}} разновидность регрессии для моделирования линейной зависимости между зависимой и независимой переменными.&lt;br /&gt;
&lt;br /&gt;
==Логистическая регрессия==&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
'''Логистическая регрессия''' (англ. ''logistic regression'') {{---}} разновидность регрессии для прогнозирования вероятности некоторого события по значениям независимых переменных. Зависимая переменная &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в этом случае принимает значения &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; (рассматриваемое событие не произошло или произошло соответственно).&lt;br /&gt;
&lt;br /&gt;
==Гребневая регрессия (ридж-регрессия)==&lt;br /&gt;
'''Гребневая регрессия или ридж-регрессия''' (англ. ''ridge regression'') {{---}} один из методов [[Уменьшение размерности|понижения размерности]]. Применяется для борьбы с избыточностью данных, когда независимые переменные коррелируют друг с другом, вследствие чего проявляется неустойчивость оценок коэффициентов многомерной линейной регрессии. &lt;br /&gt;
&lt;br /&gt;
===Мотивация===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Мультиколлинеарность''' (англ. ''multicollinearity'') {{---}} наличие линейной зависимости между независимыми переменными регрессионной модели. Различают ''полную коллинеарность'' и ''частичную'' или просто ''мультиколлинеарность'' {{---}} наличие сильной корреляции между независимыми переменными.&lt;br /&gt;
}}&lt;br /&gt;
Рассмотрим пример линейной модели: &amp;lt;tex&amp;gt;y = b_1 x_1 + b_2 x_2 + b_3 x_3 + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть имеет место зависимость &amp;lt;tex&amp;gt;x_1 = x_2 + x_ 3&amp;lt;/tex&amp;gt;. Добавим к первому коэффициенту произвольное число &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, а из двух других коэффициентов это же число вычтем.&lt;br /&gt;
Получаем (без случайной ошибки):&lt;br /&gt;
:&amp;lt;tex&amp;gt;y = (b_1 + a)x_1 + (b_2 - a)x_2 + (b_3 - a)x_3 = b_1 x_1 + b_2 x_2 + b_3 x_3 + a(x_1 - x_2 - x_3) = b_1 x_1 + b_2 x_2 + b_3 x_3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Несмотря на относительно произвольное изменение коэффициентов модели мы получили исходную модель, то есть такая модель неидентифицируема.&lt;br /&gt;
&lt;br /&gt;
На практике чаще встречается проблема сильной корреляции между независимыми переменными. В этом случае оценки параметров модели получить можно, но они будут неустойчивыми.&lt;br /&gt;
&lt;br /&gt;
===Описание===&lt;br /&gt;
Напомним задачу многомерной линейной регрессии:&lt;br /&gt;
&lt;br /&gt;
Рассматривается линейная зависимость &amp;lt;tex&amp;gt;f(x, \beta) = \langle \beta, x \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Находим вектор &amp;lt;tex&amp;gt;\beta^*&amp;lt;/tex&amp;gt;, при котором достигается минимум среднего квадрата ошибки:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q(\beta) = ||F \beta - y||^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^*=\arg \min\limits_\beta Q(\beta)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Методом наименьших квадратов находим решение:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^* = (F^T F)^{-1} F^T y&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В условиях мультиколлинеарности матрица &amp;lt;tex&amp;gt;F^T F&amp;lt;/tex&amp;gt; становится плохо обусловленной.&lt;br /&gt;
&lt;br /&gt;
Для решения этой проблемы наложим ограничение на величину коэффициентов &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;||\overrightarrow{\beta}||_2^2 \leq t^2&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Функционал &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; с учетом ограничения принимает вид:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{\lambda}(\beta) = ||F \beta - y||^2 + \lambda ||\beta||^2&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; {{---}} неотрицательный параметр.&lt;br /&gt;
&lt;br /&gt;
Решением в этом случае будет&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^* = (F^T F + \lambda I_n)^{-1} F^T y&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это изменение увеличивает собственные значения матрицы &amp;lt;tex&amp;gt;F^T F&amp;lt;/tex&amp;gt;, но не изменяет ее собственные вектора. В результате имеем хорошо обусловленную матрицу.&lt;br /&gt;
&lt;br /&gt;
Диагональная матрица &amp;lt;tex&amp;gt;\lambda I_n&amp;lt;/tex&amp;gt; называется '''гребнем'''.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Пример кода для Scikit-learn====&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' Ridge&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 ridge_regression = Ridge(alpha=0.1)  &amp;lt;font color = green&amp;gt;# alpha {{---}} величина регуляризации&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 ridge_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(ridge_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(ridge_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8171822749108134&lt;br /&gt;
&lt;br /&gt;
====Пример на языке Java====&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
&lt;br /&gt;
==Лассо-регрессия==&lt;br /&gt;
[[Файл: Ridge_and_Lasso_Regression.png|400px|thumb|Рис.1. Сравнение Лассо- и Ридж- регрессии, пример для двумерного пространства независимых переменных.&amp;lt;br/&amp;gt;Бирюзовые области изображают ограничения на коэффициенты &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, эллипсы {{---}} некоторые значения функции наименьшей квадратичной ошибки.]]&lt;br /&gt;
&lt;br /&gt;
'''Метод регрессии лассо''' (англ. ''LASSO, Least Absolute Shrinkage and Selection Operator'') похож на гребневую регрессию, но он использует другое ограничение на коэффициенты &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;||\overrightarrow{\beta}||_1 \leq t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функционал &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; принимает следующий вид:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{\lambda}(\beta) = ||F \beta - y||^2 + \lambda ||\beta||&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основное различие лассо- и ридж-регрессии заключается в том, что первая может приводить к обращению некоторых независимых переменных в ноль, тогда как вторая уменьшает их до значений, близких к нулю. Рассмотрим для простоты двумерное пространство независимых переменных. В случае лассо-регрессии органичение на коэффициенты представляет собой ромб (&amp;lt;tex&amp;gt;|\beta_1| + |\beta_2| \leq t&amp;lt;/tex&amp;gt;), в случае ридж-регрессии {{---}} круг (&amp;lt;tex&amp;gt;\beta_1^2 + \beta_2^2 \leq t^2&amp;lt;/tex&amp;gt;). Необходимо минимизировать функцию ошибки, но при этом соблюсти ограничения на коэффициенты. С геометрической точки зрения задача состоит в том, чтобы найти точку касания линии, отражающей функцию ошибки с фигурой, отражающей ограничения на &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. Из рисунка 1 интуитивно понятно, что в случае лассо-регрессии эта точка с большой вероятностью будет находиться на углах ромба, то есть лежать на оси, тогда как в случае ридж-регрессии такое происходит очень редко. Если точка пересечения лежит на оси, один из коэффициентов будет равен нулю, а значит, значение соответствующей независимой переменной не будет учитываться.&lt;br /&gt;
&lt;br /&gt;
===Пример кода для Scikit-learn===&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' Lasso&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 lasso_regression = Lasso(alpha=0.1) &amp;lt;font color = green&amp;gt;# alpha {{---}} величина регуляризации&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 lasso_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(lasso_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(lasso_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8173906804156383&lt;br /&gt;
&lt;br /&gt;
==Байесовская регрессия==&lt;br /&gt;
Описанные выше методы никак не учитывали наличие в данных шума, тогда как в реальных данных он скорее всего будет присутствовать. Предположим, что в данных все же есть некоторый шум, и что он распределен нормально. Тогда задачу линейной регрессии можно записать в следующем виде:&lt;br /&gt;
:&amp;lt;tex&amp;gt;f(x, \beta) = \langle \beta, x \rangle + \varepsilon&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\varepsilon \sim N(0, \sigma^2)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Решением этой задачи мы и будем заниматься в этом разделе.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Bayessian_regression_noise.jpg|250px|thumb|Рис.2. Регрессия и шум в данных.&amp;lt;br/&amp;gt;Синяя точка {{---}} значение из датасета, красная {{---}} значение, полученное в результате работы алгоритма регрессии. Также на рисунке зеленой линией изображена предсказанная функция, а черной {{---}} гауссово распределение шума.]]&lt;br /&gt;
&lt;br /&gt;
'''Байесовская линейная регрессия''' (англ. ''Bayesian linear regression'') {{---}} подход в линейной регрессии, в котором предполагается что шум распределен нормально.&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 синяя точка показывает значения из датасета, красная {{---}} значение, предсказанное регрессией. Поскольку центр гауссианы находится в красной точке, маленькие отклонения синей точки от красной более вероятны, а большие менее вероятны.&lt;br /&gt;
&lt;br /&gt;
Для решения поставленной задачи регрессии воспользуемся методом максимального правдоподобия.&lt;br /&gt;
&lt;br /&gt;
Запишем правдоподобие:&lt;br /&gt;
:&amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2) = N(x \beta, \sigma^2)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где &amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2)&amp;lt;/tex&amp;gt; {{---}} плотность распределения значения &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; из датасета, которая, как мы ранее предположили, соответствует нормальному распределению с центром в точке &amp;lt;tex&amp;gt;x \beta&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;
:&amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2) = \prod\limits_{i=1}^n N(x_i \beta, \sigma^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку нас интересует только максимум, положим &amp;lt;tex&amp;gt;\sigma = 1&amp;lt;/tex&amp;gt;:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\arg\max p(y|x, \beta) = \arg\max \prod\limits_{i=1}^n N(x_i \beta, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Прологарифмируем это выражение:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\arg\max \ln p(y|x, \beta) = \arg\max \ln \prod\limits_{i=1}^n N(x_i \beta, 1) \\&lt;br /&gt;
 = \arg\max \ln {\left( \frac{1}{(\sqrt{2 \pi})^n} \exp{\left(-\frac{1}{2} \sum\limits_{i-1}^n (y_i - x_i \beta)^2\right)}\right )} \\&lt;br /&gt;
 = \arg\max - \sum\limits_{i=1}^n (y_i - x_i \beta)^2 \\&lt;br /&gt;
 = \arg\min \sum\limits_{i=1}^n (y_i - x_i \beta)^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, оказывается, что метод максимального правдоподобия с учетом шума в данных сводится к оценке по методу наименьших квадратов, которую мы уже видели в обынчой линейной регрессии.&lt;br /&gt;
&lt;br /&gt;
===Пример кода для Scikit-learn===&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' BayesianRidge&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 bayesian_regression = BayesianRidge()&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 bayesian_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(bayesian_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(bayesian_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8170548749907206&lt;br /&gt;
&lt;br /&gt;
==Логическая регрессия==&lt;br /&gt;
'''Логическая регрессия''' (англ. ''logic regression'') {{---}} обобщенный метод регрессии, применяемый в основном в случае, когда независимые переменные имеют двоичную природу (при этом зависимая переменная не обязательно двоичная). Задачей логической регрессии является определение независимых переменных, которые могут быть выражены как результат вычисления [[Определение булевой функции|булевой функции]] от других независимых переменных.&lt;br /&gt;
&lt;br /&gt;
Обычно в методах регрессии не учитывается связь между переменными. Предполагается, что влияние каждой переменной на результат не зависит от значений других переменных. Однако это предположение зачастую неверно.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x_1, x_2, \dots, x_k&amp;lt;/tex&amp;gt; {{---}} двоичные независимые переменные, и пусть &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} зависимая переменная. Будем пытаться натренировать модели регрессии вида &amp;lt;tex&amp;gt;g(E(y)) = b_0 + b_1 L_1 + \dots + b_n L_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L_j&amp;lt;/tex&amp;gt; {{---}} булева функция от переменных &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; (например &amp;lt;tex&amp;gt;L_j = (x_2 \lor \overline{x_4}) \land x_7&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Для каждого типа модели необходимо определить функцию, которая отражает качество рассматриваемой модели. Например, для линейной регрессии такой функцией может быть остаточная сумма квадратов. Целью метода логической регрессии является минимизация выбранной функции качества посредством настройки параметров &amp;lt;tex&amp;gt;b_j&amp;lt;/tex&amp;gt; одновременно с булевыми выражениями &amp;lt;tex&amp;gt;L_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Logic_tree_moves.jpg|400px|thumb|Рис.3. Допустимые действия в процессе роста дерева.&amp;lt;br/&amp;gt;Элементы, появившиеся в результате применения операции, выделены черным фоном.]]&lt;br /&gt;
&lt;br /&gt;
Может показаться не совсем понятным, как же применить регрессию к булевым выражениям. Рассмотрим в общих чертах алгоритм логической регрессии. &lt;br /&gt;
Логическая регрессия, как и другие методы регрессии, перебирает различные выражения в попытках минимизировать функцию потерь. Для &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; переменных можно составить &amp;lt;tex&amp;gt;2^{2^k}&amp;lt;/tex&amp;gt; различных выражений. Нужно найти более эффективный метод для поиска наилучшего выражения, чем простой перебор всех вариантов. &lt;br /&gt;
&lt;br /&gt;
Любое логическое выражение можно представить в виде дерева, где в узлах расположены операции, а листья представляют собой переменные. Будем называть такие деревья '''логическими деревьями''' (англ. ''logic trees''). Будем называть '''соседями''' (англ. ''neighbours'') логического дерева такие деревья, которые могут быть получены из него за один шаг. Допустимые шаги проиллюстрированы на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим самый простой алгоритм поиска наилучшего дерева {{---}} '''жадный поиск''' (англ. ''greedy search'').&lt;br /&gt;
# В качестве стартового дерева выберем одну переменную, которая дает минимальное значение функции потерь среди всех остальных переменных. &lt;br /&gt;
# Перебираем соседей текущего дерева и выбираем такое, что оно уменьшает значение функции потерь по сравнению с текущим, а также дает наименьший результат среди остальных соседей.&lt;br /&gt;
# Если такого дерева не существует, алгоритм завершается. Если оно все же есть, выбираем его в качестве текущего и повторяем второй шаг.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм склонен к переобучению, а также в некоторых ситуациях может остановиться преждевременно, так и не дойдя до наилучшего дерева. Существует также алгоритм под названием '''имитация отжига''' (англ. ''simulated annealing'') который показывает лучшие результаты, чем описанный жадный поиск.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Общие понятия]]&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://datareview.info/article/10-tipov-regressii-kakoy-vyibrat/ 10 типов регрессии {{---}} какой выбрать?]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%29 machinelearning.ru {{---}} Линейная регрессия (пример)]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%A0%D0%B8%D0%B4%D0%B6-%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Ридж-регрессия]&lt;br /&gt;
* [http://www.ccas.ru/voron/download/Regression.pdf Лекции по алгоритмам восстановления регрессии К. В. Воронцов]&lt;br /&gt;
* [https://towardsdatascience.com/ridge-and-lasso-regression-a-complete-guide-with-python-scikit-learn-e20e34bcbf0b Ridge and Lasso Regression: A Complete Guide with Python Scikit-Learn]&lt;br /&gt;
* [https://habr.com/ru/company/ods/blog/322076/ Habr {{---}} Базовые принципы машинного обучения на примере линейной регрессии]&lt;br /&gt;
* [http://kooperberg.fhcrc.org/logic/documents/documents.html Documents on Logic Regression]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B8&amp;diff=70925</id>
		<title>Вариации регрессии</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D1%86%D0%B8%D0%B8_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D0%B8&amp;diff=70925"/>
				<updated>2019-04-08T23:55:27Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Регрессия''' (англ. ''Regression'') {{---}} метод моделирования зависимости между зависимой переменной &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; и одной или несколькими независимыми переменными &amp;lt;tex&amp;gt;x_1, x_2, \dots, x_n&amp;lt;/tex&amp;gt;. В случае нескольких независимых переменных регрессия называется '''множественной''' (англ. ''multivariate regression''). Цель регрессионного анализа состоит в том, чтобы оценить значение непрерывной выходной переменной по значениям входных переменных.&lt;br /&gt;
&lt;br /&gt;
==Линейная регрессия==&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
&lt;br /&gt;
'''Линейная регрессия''' (англ. ''linear regression'') {{---}} разновидность регрессии для моделирования линейной зависимости между зависимой и независимой переменными.&lt;br /&gt;
&lt;br /&gt;
==Логистическая регрессия==&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
'''Логистическая регрессия''' (англ. ''logistic regression'') {{---}} разновидность регрессии для прогнозирования вероятности некоторого события по значениям независимых переменных. Зависимая переменная &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в этом случае принимает значения &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; (рассматриваемое событие не произошло или произошло соответственно).&lt;br /&gt;
&lt;br /&gt;
==Гребневая регрессия (ридж-регрессия)==&lt;br /&gt;
'''Гребневая регрессия или ридж-регрессия''' (англ. ''ridge regression'') {{---}} один из методов [[Уменьшение размерности|понижения размерности]]. Применяется для борьбы с избыточностью данных, когда независимые переменные коррелируют друг с другом, вследствие чего проявляется неустойчивость оценок коэффициентов многомерной линейной регрессии. &lt;br /&gt;
&lt;br /&gt;
===Мотивация===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Мультиколлинеарность''' (англ. ''multicollinearity'') {{---}} наличие линейной зависимости между независимыми переменными регрессионной модели. Различают ''полную коллинеарность'' и ''частичную'' или просто ''мультиколлинеарность'' {{---}} наличие сильной корреляции между независимыми переменными.&lt;br /&gt;
}}&lt;br /&gt;
Рассмотрим пример линейной модели: &amp;lt;tex&amp;gt;y = b_1 x_1 + b_2 x_2 + b_3 x_3 + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Пусть имеет место зависимость &amp;lt;tex&amp;gt;x_1 = x_2 + x_ 3&amp;lt;/tex&amp;gt;. Добавим к первому коэффициенту произвольное число &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, а из двух других коэффициентов это же число вычтем.&lt;br /&gt;
Получаем (без случайной ошибки):&lt;br /&gt;
:&amp;lt;tex&amp;gt;y = (b_1 + a)x_1 + (b_2 - a)x_2 + (b_3 - a)x_3 = b_1 x_1 + b_2 x_2 + b_3 x_3 + a(x_1 - x_2 - x_3) = b_1 x_1 + b_2 x_2 + b_3 x_3&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Несмотря на относительно произвольное изменение коэффициентов модели мы получили исходную модель, то есть такая модель неидентифицируема.&lt;br /&gt;
&lt;br /&gt;
На практике чаще встречается проблема сильной корреляции между независимыми переменными. В этом случае оценки параметров модели получить можно, но они будут неустойчивыми.&lt;br /&gt;
&lt;br /&gt;
===Описание===&lt;br /&gt;
Напомним задачу многомерной линейной регрессии:&lt;br /&gt;
&lt;br /&gt;
Рассматривается линейная зависимость &amp;lt;tex&amp;gt;f(x, \beta) = \langle \beta, x \rangle&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Находим вектор &amp;lt;tex&amp;gt;\beta^*&amp;lt;/tex&amp;gt;, при котором достигается минимум среднего квадрата ошибки:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q(\beta) = ||F \beta - y||^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^*=\arg \min\limits_\beta Q(\beta)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Методом наименьших квадратов находим решение:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^* = (F^T F)^{-1} F^T y&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В условиях мультиколлинеарности матрица &amp;lt;tex&amp;gt;F^T F&amp;lt;/tex&amp;gt; становится плохо обусловленной.&lt;br /&gt;
&lt;br /&gt;
Для решения этой проблемы наложим ограничение на величину коэффициентов &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;||\overrightarrow{\beta}||_2^2 \leq t^2&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Функционал &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; с учетом ограничения принимает вид:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{\lambda}(\beta) = ||F \beta - y||^2 + \lambda ||\beta||^2&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где &amp;lt;tex&amp;gt;\lambda&amp;lt;/tex&amp;gt; {{---}} неотрицательный параметр.&lt;br /&gt;
&lt;br /&gt;
Решением в этом случае будет&lt;br /&gt;
:&amp;lt;tex&amp;gt;\beta^* = (F^T F + \lambda I_n)^{-1} F^T y&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это изменение увеличивает собственные значения матрицы &amp;lt;tex&amp;gt;F^T F&amp;lt;/tex&amp;gt;, но не изменяет ее собственные вектора. В результате имеем хорошо обусловленную матрицу.&lt;br /&gt;
&lt;br /&gt;
Диагональная матрица &amp;lt;tex&amp;gt;\lambda I_n&amp;lt;/tex&amp;gt; называется '''гребнем'''.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Пример кода для Scikit-learn====&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' Ridge&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 ridge_regression = Ridge(alpha=0.1)  &amp;lt;font color = green&amp;gt;# alpha {{---}} величина регуляризации&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 ridge_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(ridge_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(ridge_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8171822749108134&lt;br /&gt;
&lt;br /&gt;
====Пример на языке Java=====&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
&lt;br /&gt;
==Лассо-регрессия==&lt;br /&gt;
[[Файл: Ridge_and_Lasso_Regression.png|400px|thumb|Рис.1. Сравнение Лассо- и Ридж- регрессии, пример для двумерного пространства независимых переменных.&amp;lt;br/&amp;gt;Бирюзовые области изображают ограничения на коэффициенты &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, эллипсы {{---}} некоторые значения функции наименьшей квадратичной ошибки.]]&lt;br /&gt;
&lt;br /&gt;
'''Метод регрессии лассо''' (англ. ''LASSO, Least Absolute Shrinkage and Selection Operator'') похож на гребневую регрессию, но он использует другое ограничение на коэффициенты &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;||\overrightarrow{\beta}||_1 \leq t&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Функционал &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; принимает следующий вид:&lt;br /&gt;
:&amp;lt;tex&amp;gt;Q_{\lambda}(\beta) = ||F \beta - y||^2 + \lambda ||\beta||&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основное различие лассо- и ридж-регрессии заключается в том, что первая может приводить к обращению некоторых независимых переменных в ноль, тогда как вторая уменьшает их до значений, близких к нулю. Рассмотрим для простоты двумерное пространство независимых переменных. В случае лассо-регрессии органичение на коэффициенты представляет собой ромб (&amp;lt;tex&amp;gt;|\beta_1| + |\beta_2| \leq t&amp;lt;/tex&amp;gt;), в случае ридж-регрессии {{---}} круг (&amp;lt;tex&amp;gt;\beta_1^2 + \beta_2^2 \leq t^2&amp;lt;/tex&amp;gt;). Необходимо минимизировать функцию ошибки, но при этом соблюсти ограничения на коэффициенты. С геометрической точки зрения задача состоит в том, чтобы найти точку касания линии, отражающей функцию ошибки с фигурой, отражающей ограничения на &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. Из рисунка 1 интуитивно понятно, что в случае лассо-регрессии эта точка с большой вероятностью будет находиться на углах ромба, то есть лежать на оси, тогда как в случае ридж-регрессии такое происходит очень редко. Если точка пересечения лежит на оси, один из коэффициентов будет равен нулю, а значит, значение соответствующей независимой переменной не будет учитываться.&lt;br /&gt;
&lt;br /&gt;
===Пример кода для Scikit-learn===&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' Lasso&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 lasso_regression = Lasso(alpha=0.1) &amp;lt;font color = green&amp;gt;# alpha {{---}} величина регуляризации&amp;lt;/font&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 lasso_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(lasso_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(lasso_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8173906804156383&lt;br /&gt;
&lt;br /&gt;
==Байесовская регрессия==&lt;br /&gt;
Описанные выше методы никак не учитывали наличие в данных шума, тогда как в реальных данных он скорее всего будет присутствовать. Предположим, что в данных все же есть некоторый шум, и что он распределен нормально. Тогда задачу линейной регрессии можно записать в следующем виде:&lt;br /&gt;
:&amp;lt;tex&amp;gt;f(x, \beta) = \langle \beta, x \rangle + \varepsilon&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\varepsilon \sim N(0, \sigma^2)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Решением этой задачи мы и будем заниматься в этом разделе.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Bayessian_regression_noise.jpg|250px|thumb|Рис.2. Регрессия и шум в данных.&amp;lt;br/&amp;gt;Синяя точка {{---}} значение из датасета, красная {{---}} значение, полученное в результате работы алгоритма регрессии. Также на рисунке зеленой линией изображена предсказанная функция, а черной {{---}} гауссово распределение шума.]]&lt;br /&gt;
&lt;br /&gt;
'''Байесовская линейная регрессия''' (англ. ''Bayesian linear regression'') {{---}} подход в линейной регрессии, в котором предполагается что шум распределен нормально.&lt;br /&gt;
&lt;br /&gt;
На рисунке 2 синяя точка показывает значения из датасета, красная {{---}} значение, предсказанное регрессией. Поскольку центр гауссианы находится в красной точке, маленькие отклонения синей точки от красной более вероятны, а большие менее вероятны.&lt;br /&gt;
&lt;br /&gt;
Для решения поставленной задачи регрессии воспользуемся методом максимального правдоподобия.&lt;br /&gt;
&lt;br /&gt;
Запишем правдоподобие:&lt;br /&gt;
:&amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2) = N(x \beta, \sigma^2)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
где &amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2)&amp;lt;/tex&amp;gt; {{---}} плотность распределения значения &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; из датасета, которая, как мы ранее предположили, соответствует нормальному распределению с центром в точке &amp;lt;tex&amp;gt;x \beta&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;
:&amp;lt;tex&amp;gt;p(y|x, \beta, \sigma^2) = \prod\limits_{i=1}^n N(x_i \beta, \sigma^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку нас интересует только максимум, положим &amp;lt;tex&amp;gt;\sigma = 1&amp;lt;/tex&amp;gt;:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\arg\max p(y|x, \beta) = \arg\max \prod\limits_{i=1}^n N(x_i \beta, 1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Прологарифмируем это выражение:&lt;br /&gt;
:&amp;lt;tex&amp;gt;\arg\max \ln p(y|x, \beta) = \arg\max \ln \prod\limits_{i=1}^n N(x_i \beta, 1) \\&lt;br /&gt;
 = \arg\max \ln {\left( \frac{1}{(\sqrt{2 \pi})^n} \exp{\left(-\frac{1}{2} \sum\limits_{i-1}^n (y_i - x_i \beta)^2\right)}\right )} \\&lt;br /&gt;
 = \arg\max - \sum\limits_{i=1}^n (y_i - x_i \beta)^2 \\&lt;br /&gt;
 = \arg\min \sum\limits_{i=1}^n (y_i - x_i \beta)^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, оказывается, что метод максимального правдоподобия с учетом шума в данных сводится к оценке по методу наименьших квадратов, которую мы уже видели в обынчой линейной регрессии.&lt;br /&gt;
&lt;br /&gt;
===Пример кода для Scikit-learn===&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# импорт библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_regression&lt;br /&gt;
 '''from''' sklearn.linear_model '''import''' BayesianRidge&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# генерируем данные для X и y&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_regression(n_samples=10000, noise=100, random_state=0)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# разделение данных на train и test&amp;lt;/font&amp;gt;&lt;br /&gt;
 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=3)&lt;br /&gt;
 &lt;br /&gt;
 bayesian_regression = BayesianRidge()&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# обучение&amp;lt;/font&amp;gt;&lt;br /&gt;
 bayesian_regression.fit(train_X, train_y)&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# предсказание результата&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(bayesian_regression.predict(test_X))&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;font color = green&amp;gt;# вывод точности предсказания&amp;lt;/font&amp;gt;&lt;br /&gt;
 ''print''(bayesian_regression.score(test_X, test_y))&lt;br /&gt;
&lt;br /&gt;
Точность предсказания для данного датасета и параметров:&lt;br /&gt;
 &amp;lt;font color = green&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;lt;/font&amp;gt; 0.8170548749907206&lt;br /&gt;
&lt;br /&gt;
==Логическая регрессия==&lt;br /&gt;
'''Логическая регрессия''' (англ. ''logic regression'') {{---}} обобщенный метод регрессии, применяемый в основном в случае, когда независимые переменные имеют двоичную природу (при этом зависимая переменная не обязательно двоичная). Задачей логической регрессии является определение независимых переменных, которые могут быть выражены как результат вычисления [[Определение булевой функции|булевой функции]] от других независимых переменных.&lt;br /&gt;
&lt;br /&gt;
Обычно в методах регрессии не учитывается связь между переменными. Предполагается, что влияние каждой переменной на результат не зависит от значений других переменных. Однако это предположение зачастую неверно.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;x_1, x_2, \dots, x_k&amp;lt;/tex&amp;gt; {{---}} двоичные независимые переменные, и пусть &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} зависимая переменная. Будем пытаться натренировать модели регрессии вида &amp;lt;tex&amp;gt;g(E(y)) = b_0 + b_1 L_1 + \dots + b_n L_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;L_j&amp;lt;/tex&amp;gt; {{---}} булева функция от переменных &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; (например &amp;lt;tex&amp;gt;L_j = (x_2 \lor \overline{x_4}) \land x_7&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Для каждого типа модели необходимо определить функцию, которая отражает качество рассматриваемой модели. Например, для линейной регрессии такой функцией может быть остаточная сумма квадратов. Целью метода логической регрессии является минимизация выбранной функции качества посредством настройки параметров &amp;lt;tex&amp;gt;b_j&amp;lt;/tex&amp;gt; одновременно с булевыми выражениями &amp;lt;tex&amp;gt;L_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Logic_tree_moves.jpg|400px|thumb|Рис.3. Допустимые действия в процессе роста дерева.&amp;lt;br/&amp;gt;Элементы, появившиеся в результате применения операции, выделены черным фоном.]]&lt;br /&gt;
&lt;br /&gt;
Может показаться не совсем понятным, как же применить регрессию к булевым выражениям. Рассмотрим в общих чертах алгоритм логической регрессии. &lt;br /&gt;
Логическая регрессия, как и другие методы регрессии, перебирает различные выражения в попытках минимизировать функцию потерь. Для &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; переменных можно составить &amp;lt;tex&amp;gt;2^{2^k}&amp;lt;/tex&amp;gt; различных выражений. Нужно найти более эффективный метод для поиска наилучшего выражения, чем простой перебор всех вариантов. &lt;br /&gt;
&lt;br /&gt;
Любое логическое выражение можно представить в виде дерева, где в узлах расположены операции, а листья представляют собой переменные. Будем называть такие деревья '''логическими деревьями''' (англ. ''logic trees''). Будем называть '''соседями''' (англ. ''neighbours'') логического дерева такие деревья, которые могут быть получены из него за один шаг. Допустимые шаги проиллюстрированы на рисунке 3.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим самый простой алгоритм поиска наилучшего дерева {{---}} '''жадный поиск''' (англ. ''greedy search'').&lt;br /&gt;
# В качестве стартового дерева выберем одну переменную, которая дает минимальное значение функции потерь среди всех остальных переменных. &lt;br /&gt;
# Перебираем соседей текущего дерева и выбираем такое, что оно уменьшает значение функции потерь по сравнению с текущим, а также дает наименьший результат среди остальных соседей.&lt;br /&gt;
# Если такого дерева не существует, алгоритм завершается. Если оно все же есть, выбираем его в качестве текущего и повторяем второй шаг.&lt;br /&gt;
&lt;br /&gt;
Этот алгоритм склонен к переобучению, а также в некоторых ситуациях может остановиться преждевременно, так и не дойдя до наилучшего дерева. Существует также алгоритм под названием '''имитация отжига''' (англ. ''simulated annealing'') который показывает лучшие результаты, чем описанный жадный поиск.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
* [[Общие понятия]]&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://datareview.info/article/10-tipov-regressii-kakoy-vyibrat/ 10 типов регрессии {{---}} какой выбрать?]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9B%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F_%28%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%29 machinelearning.ru {{---}} Линейная регрессия (пример)]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%A0%D0%B8%D0%B4%D0%B6-%D1%80%D0%B5%D0%B3%D1%80%D0%B5%D1%81%D1%81%D0%B8%D1%8F machinelearning.ru {{---}} Ридж-регрессия]&lt;br /&gt;
* [http://www.ccas.ru/voron/download/Regression.pdf Лекции по алгоритмам восстановления регрессии К. В. Воронцов]&lt;br /&gt;
* [https://towardsdatascience.com/ridge-and-lasso-regression-a-complete-guide-with-python-scikit-learn-e20e34bcbf0b Ridge and Lasso Regression: A Complete Guide with Python Scikit-Learn]&lt;br /&gt;
* [https://habr.com/ru/company/ods/blog/322076/ Habr {{---}} Базовые принципы машинного обучения на примере линейной регрессии]&lt;br /&gt;
* [http://kooperberg.fhcrc.org/logic/documents/documents.html Documents on Logic Regression]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70923</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70923"/>
				<updated>2019-04-08T23:14:58Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
Пример линейной регресии с применением &amp;lt;code&amp;gt;weka.classifiers.functions.LinearRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.LinearRegression;&lt;br /&gt;
  '''import''' weka.core.Instance;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Load Data set&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;dataset/house.arff&amp;quot;)));&lt;br /&gt;
  data.setClassIndex(data.numAttributes() - 1);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Build model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new LinearRegression();&lt;br /&gt;
  '''try''' { model.buildClassifier(data); }&lt;br /&gt;
  '''catch''' (Exception e) { e.printStackTrace(); }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//output model&amp;lt;/font&amp;gt;&lt;br /&gt;
  System.out.printf(&amp;quot;model parameters: %s%n&amp;quot;, model);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Now Predicting the cost&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' myHouse = data.lastInstance();&lt;br /&gt;
  '''var''' price  = model.classifyInstance(myHouse);&lt;br /&gt;
  System.out.printf(&amp;quot;predicted price = %s%n&amp;quot;, price)&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
Пример линейной регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Гребневая регрессия (ридж-регрессия)}}&lt;br /&gt;
&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Лассо-регрессия}}&lt;br /&gt;
&lt;br /&gt;
Пример Лассо-регрессии с применением &amp;lt;code&amp;gt;smile.regression.LASSO&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.LASSO;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lasso   = new LASSO(dataset.x(), dataset.y(), 10);&lt;br /&gt;
  lasso.predict(testX);&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test datasets and build MLP classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Print the result à la Weka explorer:&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)#Пример на языке Java}}&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70922</id>
		<title>Метод опорных векторов (SVM)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)&amp;diff=70922"/>
				<updated>2019-04-08T23:14:18Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Метод опорных векторов''' (англ. ''support vector machine'', ''SVM'') — один из наиболее популярных методов обучения, который применяется для решения задач классификации и регрессии. Основная идея метода заключается в построении гиперплоскости, разделяющей объекты выборки наиболее оптимальным способом. Алгоритм работает в предположении, что чем больше расстояние (зазор) между разделяющей гиперплоскостью и объектами разделяемых классов, тем меньше будет средняя ошибка классификатора.&lt;br /&gt;
&lt;br /&gt;
== Метод опорных векторов в задаче классификации ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим задачу бинарной классификации, в которой объектам из $X=\mathbb{R}^n$ соответствует один из двух классов $Y = \{-1, +1\}$.&lt;br /&gt;
&lt;br /&gt;
Пусть задана обучающая выборка пар &amp;quot;объект-ответ&amp;quot;: $T^\ell = (\vec{x}_i, y_i)_{i=1}^\ell$. Необходимо построить алгоритм классификации $a(\vec{x}) : X \to Y$.&lt;br /&gt;
&lt;br /&gt;
=== Разделяющая гиперплоскость ===&lt;br /&gt;
&lt;br /&gt;
[[Файл:svm_hyperplane.png|300px|thumb|right|Примеры разделяющих гиперплоскостей в $\mathbb{R}^2$]]&lt;br /&gt;
&lt;br /&gt;
В пространстве $\mathbb{R}^n$ уравнение $\langle \vec{w}, \vec{x} \rangle - b = 0$ при заданных $\vec{w}$ и $b$ определяет гиперплоскость — множество векторов $\vec{x} = (x_1, \ldots, x_n)$, принадлежащих пространству меньшей размерности $\mathbb{R}^{n-1}$. Например, для $\mathbb{R}^1$ гиперплоскостью является точка, для $\mathbb{R}^2$ — прямая, для $\mathbb{R}^3$ — плоскость и т.д. Параметр $\vec{w}$ определяет вектор нормали к гиперплоскости, а через $\frac{b}{\lVert \vec{w} \rVert}$ выражается расстояние от гиперплоскости до начала координат.&lt;br /&gt;
&lt;br /&gt;
Гиперплоскость делит $\mathbb{R}^n$ на два полупространства: $\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0$ и $\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0$. &lt;br /&gt;
&lt;br /&gt;
Говорят, что гиперплоскость разделяет два класса $C_1$ и $C_2$, если объекты этих классов лежат по разные стороны от гиперплоскости, то есть выполнено либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
либо&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}\langle \vec{w}, \vec{x} \rangle - b &amp;lt; 0, &amp;amp;&amp;amp; \forall x \in C_1 \\ \langle \vec{w}, \vec{x} \rangle - b &amp;gt; 0, &amp;amp;&amp;amp; \forall x \in C_2\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно разделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
Пусть выборка линейно разделима, то есть существует некоторая гиперплоскость, разделяющая классы $-1$ и $+1$. Тогда в качестве алгоритма классификации можно использовать линейный пороговый классификатор:&lt;br /&gt;
&lt;br /&gt;
$a(\vec{x}) = sign(\langle \vec{w}, \vec{x} \rangle - b) = sign\left(\sum\limits_{i=1}^\ell w_i x_i - b\right)$&lt;br /&gt;
&lt;br /&gt;
где $\vec{x} = (x_1, \ldots, x_n)$ — вектор значений признаков объекта, а $\vec{w} = (w_1, \ldots, w_n) \in \mathbb{R}^n$ и $b \in \mathbb{R}$ — параметры гиперплоскости.&lt;br /&gt;
&lt;br /&gt;
Но для двух линейно разделимых классов возможны различные варианты построения разделяющих гиперплоскостей. Метод опорных векторов выбирает ту гиперплоскость, которая максимизирует отступ между классами:&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Отступ''' (англ. ''margin'') — характеристика, оценивающая, насколько объект &amp;quot;погружён&amp;quot; в свой класс, насколько типичным представителем класса он является. Чем меньше значение отступа $M_i$, тем ближе объект $\vec{x}_i$ подходит к границе классов и тем выше становится вероятность ошибки. Отступ $M_i$ отрицателен тогда и только тогда, когда алгоритм $a(x)$ допускает ошибку на объекте $\vec{x}_i$. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt; Для линейного классификатора отступ определяется уравнением: $M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b)$&lt;br /&gt;
}}&lt;br /&gt;
Если выборка линейно разделима, то существует такая гиперплоскость, отступ от которой до каждого объекта положителен:&lt;br /&gt;
&lt;br /&gt;
$\exists \vec{w}, b : \; M_i(\vec{w}, b) = y_i(\langle \vec{w}, \vec{x}_i \rangle - b) &amp;gt; 0, \; i = 1\ldots\ell$&lt;br /&gt;
&lt;br /&gt;
Мы хотим построить такую разделяющую гиперплоскость, чтобы объекты обучающей выборки находились на наибольшем расстоянии от неё.&lt;br /&gt;
&lt;br /&gt;
[[Файл:SVM_margin.png|300px|thumb|right|Оптимальная разделяющая гиперплоскость в $\mathbb{R}^2$]]&lt;br /&gt;
Заметим, что при умножении $\vec{w}$ и $b$ на константу $c \neq 0$ уравнение $\langle c\vec{w}, \vec{x} \rangle - cb = 0$ определяет ту же самую гиперплоскость, что и $\langle \vec{w}, \vec{x} \rangle - b = 0$. Для удобства проведём нормировку: выберем константу $c$ таким образом, чтобы $\min M_i(\vec{w}, b) = 1$. При этом в каждом из двух классов найдётся хотя бы один &amp;quot;граничный&amp;quot; объект обучающей выборки, отступ которого равен этому минимуму: иначе можно было бы сместить гиперплоскость в сторону класса с большим отступом, тем самым увеличив минимальное расстояние от гиперплоскости до объектов обучающей выборки. &lt;br /&gt;
&lt;br /&gt;
Обозначим любой &amp;quot;граничный&amp;quot; объект из класса $+1$ как $\vec{x}_+$, из класса $-1$ как $\vec{x}_-$. Их отступ равен единице, то есть&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
M_+(\vec{w}, b) = (+1)(\langle \vec{w}, \vec{x}_+ \rangle - b) = 1 \\&lt;br /&gt;
M_-(\vec{w}, b) = (-1)(\langle \vec{w}, \vec{x}_- \rangle - b) = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Нормировка позволяет ограничить разделяющую полосу между классами: $\{x: -1 &amp;lt; \langle \vec{w}, \vec{x}_i \rangle - b &amp;lt; 1\}$. Внутри неё не может лежать ни один объект обучающей выборки. Ширину разделяющей полосы можно выразить как проекцию вектора $\vec{x}_+ - \vec{x}_-$ на нормаль к гиперплоскости $\vec{w}$. Чтобы разделяющая гиперплоскость находилась на наибольшем расстоянии от точек выборки, ширина полосы должна быть максимальной: &lt;br /&gt;
&lt;br /&gt;
$\frac{\langle \vec{x}_+ - \vec{x}_-, \vec{w} \rangle}{\lVert w \rVert} = \frac{\langle \vec{x}_+, \vec{w} \rangle - \langle \vec{x}_-, \vec{w} \rangle - b + b}{\lVert w \rVert} = \frac{(+1)\left(\langle \vec{x}_+, \vec{w} \rangle - b\right) \, + \, (-1)\left(\langle \vec{x}_-, \vec{w} \rangle - b\right)}{\lVert w \rVert} = \\ = \frac{M_+(\vec{w}, b) \, + \, M_-(\vec{w}, b)}{\lVert w \rVert} = \frac{2}{\lVert w \rVert} \to \max \; \Rightarrow \; \lVert w \rVert \to \min$&lt;br /&gt;
&lt;br /&gt;
Это приводит нас к постановке задачи оптимизации в терминах квадратичного программирования:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\lVert \vec{w} \rVert^2 \to \min\limits_{w,b} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
=== Линейно неразделимая выборка ===&lt;br /&gt;
&lt;br /&gt;
На практике линейно разделимые выборки практически не встречаются: в данных возможны выбросы и нечёткие границы между классами. В таком случае поставленная выше задача не имеет решений, и необходимо ослабить ограничения, позволив некоторым объектам попадать на &amp;quot;территорию&amp;quot; другого класса. Для каждого объекта отнимем от отступа некоторую положительную величину $\xi_i$, но потребуем чтобы эти введённые поправки были минимальны. Это приведёт к следующей постановке задачи, называемой также ''SVM с мягким отступом'' (англ. ''soft-margin SVM''):&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{1}{2} \lVert \vec{w} \rVert^2 \color{brown}{+ C \sum\limits_{i=1}^\ell \xi_i} \to \min\limits_{w, b, \color{brown}{\xi}} \\&lt;br /&gt;
M_i(\vec{w}, b) \geq 1 \color{brown}{- \xi_i}, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\color{brown}{\xi_i \geq 0, \quad i = 1, \ldots, \ell} \\&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Мы не знаем, какой из функционалов $\frac{1}{2} \lVert \vec{w} \rVert^2$ и $\sum\limits_{i=1}^\ell \xi_i$ важнее, поэтому вводим коэффициент $C$, который будем оптимизировать с помощью кросс-валидации. В итоге мы получили задачу, у которой всегда есть единственное решение.&lt;br /&gt;
&lt;br /&gt;
Заметим, что мы можем упростить постановку задачи:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\xi_i \geq 0 \\&lt;br /&gt;
\xi_i \geq 1 - M_i(\vec{w}, b) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases} &lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\begin{cases} &lt;br /&gt;
\xi_i \geq \max(0, 1 - M_i(\vec{w}, b)) \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \xi_i \to \min&lt;br /&gt;
\end{cases}&lt;br /&gt;
\,\Rightarrow\,&lt;br /&gt;
\xi_i = (1- M_i(\vec{w}, b))_+$&lt;br /&gt;
&lt;br /&gt;
Получим эквивалентную задачу безусловной минимизации:&lt;br /&gt;
&lt;br /&gt;
$\frac{1}{2} \lVert \vec{w} \rVert^2 + C \sum\limits_{i=1}^\ell \left(1 - M_i(\vec{w}, b)\right)_+ \to \min\limits_{w, b}$&lt;br /&gt;
&lt;br /&gt;
Теперь научимся её решать.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=kkt&lt;br /&gt;
|author=Условия Каруша—Куна—Таккера&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть поставлена задача нелинейного программирования с ограничениями:&lt;br /&gt;
$$&lt;br /&gt;
\begin{cases}&lt;br /&gt;
f(x) \to \min\limits_{x \in X} \\&lt;br /&gt;
g_i(x) \leq 0,\;i=1\ldots m \\&lt;br /&gt;
h_j(x) = 0,\;j=1\ldots k&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Если $x$ — точка локального минимума при наложенных ограничениях, то существуют такие множители $\mu_i, i = 1\ldots m$, $\;\lambda_j, j = 1\ldots k$, что для функции Лагранжа $L(x; \mu, \lambda)$ выполняются условия:&lt;br /&gt;
&lt;br /&gt;
$$\begin{cases}\frac{\partial L}{\partial x} = 0, \quad L(x; \mu, \lambda) = f(x) + \sum\limits_{i=1}^m \mu_i g_i(x) + \sum\limits_{j=1}^k \lambda_j h_j(x) \\ g_i(x) \leq 0,\;h_j(x) = 0 \quad \text{(исходные ограничения)} \\ \mu_i \geq 0 \quad \text{(двойственные ограничения)} \\ \mu_i g_i(x) = 0 \quad \text{(условие дополняющей нежёсткости)} \end{cases}$$&lt;br /&gt;
&lt;br /&gt;
При этом искомая точка является седловой точкой функции Лагранжа: минимумом по $x$ и максимумом по двойственным переменным $\mu$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По теореме Каруша—Куна—Таккера, поставленная нами задача минимизации эквивалентна двойственной задаче поиска седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\mathscr{L}(\vec{w},b,\xi; \lambda, \eta) = \frac{1}{2} \lVert w \rVert^2 - \sum\limits_{i=1}^\ell \lambda_i \left(M_i(\vec{w}, b) - 1\right) - \sum\limits_{i=1}^\ell \xi_i \left(\lambda_i + \eta_i - C\right)$&lt;br /&gt;
&lt;br /&gt;
$\lambda_i$ — переменные, двойственные к ограничениям $M_i \geq 1 - \xi_i$&lt;br /&gt;
&lt;br /&gt;
$\eta_i$ — переменные, двойственные к ограничениям $\xi_i \geq 0$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запишем необходимые условия седловой точки функции Лагранжа:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = 0, \quad \frac{\partial \mathscr{L}}{\partial b} = 0, \quad \frac{\partial \mathscr{L}}{\partial \xi} = 0 \\&lt;br /&gt;
\xi_i \geq 0, \quad \lambda_i \geq 0, \quad \eta_i \geq 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\lambda_i = 0 \;\text{либо}\; M_i(\vec{w},b) = 1 - \xi_i, &amp;amp;&amp;amp; i = 1, \ldots, \ell \\&lt;br /&gt;
\eta_i = 0 \;\text{либо}\; \xi_i = 0, &amp;amp;&amp;amp; i = 1, \ldots, \ell&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Продифференцируем функцию Лагранжа и приравняем к нулю производные. Получим следующие ограничения:&lt;br /&gt;
&lt;br /&gt;
$\begin{array}{lcl}&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial w} = \vec{w} - \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i = 0 &amp;amp; \Rightarrow &amp;amp; \vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial b} = -\sum\limits_{i=1}^\ell \lambda_i y_i = 0 &amp;amp; \Rightarrow &amp;amp; \sum\limits_{i=1}^\ell \lambda_i y_i = 0 \\&lt;br /&gt;
\frac{\partial \mathscr{L}}{\partial \xi_i} = -\lambda_i - \eta_i + C = 0 &amp;amp; \Rightarrow &amp;amp; \eta_i + \lambda_i = C, \quad i = 1, \ldots, \ell&lt;br /&gt;
\end{array}$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заметим, что $\eta_i \geq 0$, $\lambda_i \geq 0$, $C &amp;gt; 0$, поэтому из последнего ограничения получаем $0 \leq \eta_i \leq C$, $0 \leq \lambda_i \leq C$. &lt;br /&gt;
&lt;br /&gt;
Диапазон значений $\lambda_i$ (которые, как указано выше, соответствуют ограничениям на величину отступа) позволяет нам разделить объекты обучающей выборки на три типа:&lt;br /&gt;
&lt;br /&gt;
# $\lambda_i = 0 \; \Rightarrow \; \eta_i = C; \; \xi_i = 0; \; M_i \geq 1 \;$ — периферийные (неинформативные) объекты &amp;lt;br&amp;gt; Эти объекты лежат в своём классе, классифицируются верно и не влияют на выбор разделяющей гиперплоскости (см. уравнение для $\vec{w}$)&lt;br /&gt;
# $0 &amp;lt; \lambda_i &amp;lt; C \; \Rightarrow \; 0 &amp;lt; \eta_i &amp;lt; C; \; \xi_i = 0; \; M_i = 1 \;$ — опорные граничные объекты &amp;lt;br&amp;gt; Эти объекты лежат ровно на границе разделяющей полосы на стороне своего класса&lt;br /&gt;
# $\lambda_i = C \; \Rightarrow \; \eta_i = 0; \; \xi_i &amp;gt; 0; \; M_i &amp;lt; 1 \;$ — опорные объекты-нарушители &amp;lt;br&amp;gt; Эти объекты лежат внутри разделяющей полосы или на стороне чужого класса&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Опорный объект''' (опорный вектор, англ. ''support vector'') — объект $\vec{x}_i$, соответствующий которому множитель Лагранжа отличен от нуля: $\lambda_i \neq 0$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь подставим ограничения, которые мы получили при дифференцировании, в функцию Лагранжа. Получим следующую постановку двойственной задачи, которая зависит только от двойственных переменных $\lambda$:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \langle \vec{x}_i, \vec{x}_j \rangle \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
Это также задача квадратичного программирования. Решение задачи лежит в пересечении $\ell$-мерного куба с ребром $C$ и гиперплоскости $\langle \lambda, y \rangle = 0$, что является выпуклым многогранником размерности $\ell-1$. В этом многограннике нужно найти минимум выпуклого квадратичного функционала. Следовательно, данная задача имеет единственное решение.&lt;br /&gt;
&lt;br /&gt;
Существуют различные методы поиска решения: можно воспользоваться универсальным солвером задачи квадратичного программирования ([https://www.ibm.com/analytics/cplex-optimizer CPLEX], [http://www.gurobi.com/ Gurobi]), либо алгоритмом, учитывающим специфические особенности SVM ([https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ SMO], [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.9956 INCAS]).&lt;br /&gt;
&lt;br /&gt;
После того, как мы получили вектор коэффициентов $\vec{\lambda}$, можем выразить решение прямой задачи через решение двойственной:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
\vec{w} = \sum\limits_{i=1}^\ell \lambda_i y_i \vec{x}_i \\&lt;br /&gt;
b = \langle \vec{w}, \vec{x}_i \rangle - y_i, \quad \forall i: \lambda_i &amp;gt; 0, M_i = 1&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
На практике для повышения вычислительной устойчивости рекомендуется при расчёте $b$ брать медиану по опорным граничным объектам:&lt;br /&gt;
&lt;br /&gt;
$b = med\{ \langle \vec{w}, \vec{x}_i \rangle - y_i : \lambda_i &amp;gt; 0, M_i = 1, i = 1, \ldots, \ell\}$&lt;br /&gt;
&lt;br /&gt;
Теперь можем переписать наш линейный классификатор, выразив $\vec{w}$ через $\vec{\lambda}$:&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \langle \vec{x}_i, \vec{x} \rangle - b\right)$&lt;br /&gt;
&lt;br /&gt;
=== Нелинейное обобщение, kernel trick ===&lt;br /&gt;
&lt;br /&gt;
Существует ещё один подход к решению проблемы линейной разделимости, известный как трюк с ядром (kernel trick). Если выборка объектов с признаковым описанием из $X = \mathbb{R}^n$ не является линейно разделимой, мы можем предположить, что существует некоторое пространство $H$, вероятно, большей размерности, при переходе в которое выборка станет линейно разделимой. Пространство $H$ здесь называют спрямляющим, а функцию перехода $\psi : X \to H$ — спрямляющим отображением. Построение SVM в таком случае происходит так же, как и раньше, но в качестве векторов признаковых описаний используются векторы $\psi(\vec{x})$, а не $\vec{x}$. Соответственно, скалярное произведение $\langle \vec{x}_1, \vec{x}_2 \rangle$ в пространстве $X$ везде заменяется скалярным произведением $\langle \psi(\vec{x}_1), \psi(\vec{x}_2) \rangle$ в пространстве $H$. Отсюда следует, что пространство $H$ должно быть гильбертовым, так как в нём должно быть определено скалярное произведение.&lt;br /&gt;
&lt;br /&gt;
Обратим внимание на то, что постановка задачи и алгоритм классификации не используют в явном виде признаковое описание и оперируют только скалярными произведениями признаков объектов. Это даёт возможность заменить скалярное произведение в пространстве $X$ на [[Ядра|ядро]] — функцию, являющуюся скалярным произведением в некотором $H$. При этом можно вообще не строить спрямляющее пространство в явном виде, и вместо подбора $\psi$ подбирать непосредственно ядро. &lt;br /&gt;
&lt;br /&gt;
Постановка задачи с применением ядер приобретает вид:&lt;br /&gt;
&lt;br /&gt;
$\begin{cases}&lt;br /&gt;
-\mathscr{L}(\lambda) = -\sum\limits_{i=1}^\ell \lambda_i + \frac{1}{2} \sum\limits_{i=1}^\ell \sum\limits_{j=1}^\ell \lambda_i \lambda_j y_i y_j \color{brown}{K(\vec{x}_i, \vec{x}_j)} \to \min\limits_\lambda \\&lt;br /&gt;
0 \leq \lambda_i \leq C, \quad i = 1, \ldots, \ell \\&lt;br /&gt;
\sum\limits_{i=1}^\ell \lambda_i y_i = 0&lt;br /&gt;
\end{cases}$&lt;br /&gt;
&lt;br /&gt;
$a(x) = sign \left(\sum\limits_{i=1}^\ell \lambda_i y_i \color{brown}{K(\vec{x}_i, \vec{x})} - b\right)$&lt;br /&gt;
&lt;br /&gt;
== Преимущества и недостатки SVM ==&lt;br /&gt;
&lt;br /&gt;
Преимущества SVM перед методом стохастического градиента и нейронными сетями:&lt;br /&gt;
&lt;br /&gt;
* Задача выпуклого квадратичного программирования хорошо изучена и имеет единственное решение.&lt;br /&gt;
* Метод опорных векторов эквивалентен двухслойной нейронной сети, где число нейронов на скрытом слое определяется автоматически как число опорных векторов.&lt;br /&gt;
* Принцип оптимальной разделяющей гиперплоскости приводит к максимизации ширины разделяющей полосы, а следовательно, к более уверенной классификации.&lt;br /&gt;
&lt;br /&gt;
Недостатки классического SVM:&lt;br /&gt;
&lt;br /&gt;
* Неустойчивость к шуму: выбросы в исходных данных становятся опорными объектами-нарушителями и напрямую влияют на построение разделяющей гиперплоскости.&lt;br /&gt;
* Не описаны общие методы построения ядер и спрямляющих пространств, наиболее подходящих для конкретной задачи.&lt;br /&gt;
* Нет отбора признаков.&lt;br /&gt;
* Необходимо подбирать константу $C$ при помощи кросс-валидации.&lt;br /&gt;
&lt;br /&gt;
== Модификации ==&lt;br /&gt;
&lt;br /&gt;
Существуют различные дополнения и модификации метода опорных векторов, направленные на устранение описанных недостатков:&lt;br /&gt;
&lt;br /&gt;
* [http://jmlr.csail.mit.edu/papers/v1/tipping01a.html Метод релевантных векторов (Relevance Vector Machine, RVM)]&lt;br /&gt;
* [https://papers.nips.cc/paper/2450-1-norm-support-vector-machines.pdf 1-norm SVM (LASSO SVM)]&lt;br /&gt;
* [http://www3.stat.sinica.edu.tw/statistica/oldpdf/A16n214.pdf Doubly Regularized SVM (ElasticNet SVM)]&lt;br /&gt;
* [https://arxiv.org/abs/1901.09643v1 Support Features Machine (SFM)]&lt;br /&gt;
* [http://www.robots.ox.ac.uk/~minhhoai/papers/SVMFeatureWeight_PR.pdf Relevance Features Machine (RFM)]&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.SVM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/SVM.html/ Smile, SVM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.SVM;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.math.kernel.GaussianKernel;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' train   = parser.parse(&amp;quot;USPS Train&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.train&amp;quot;));&lt;br /&gt;
  '''var''' test    = parser.parse(&amp;quot;USPS Test&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.test&amp;quot;));&lt;br /&gt;
  '''var''' classes = Arrays.stream(test.labels()).max().orElse(0) + 1;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build SVM classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' svm     = new SVM&amp;lt;&amp;gt;(new GaussianKernel(8.0), 5.0, classes, SVM.Multiclass.ONE_VS_ONE);&lt;br /&gt;
  svm.learn(train.x(), train.labels());&lt;br /&gt;
  svm.finish();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// calculate test error rate&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' error = 0;&lt;br /&gt;
  for (int i = 0; i &amp;lt; test.x().length; i++) {&lt;br /&gt;
   if (svm.predict(test.x()[i]) != test.labels()[i]) {&lt;br /&gt;
     error++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  System.out.format(&amp;quot;USPS error rate = %.2f%%\n&amp;quot;, 100.0 * error / test.x().length);&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Общие понятия]]&lt;br /&gt;
* [[Ядра]]&lt;br /&gt;
* [[Обзор библиотек для машинного обучения на Python]]&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%B0%D1%88%D0%B8%D0%BD%D0%B0_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 machinelearning.ru — Машина опорных векторов]&lt;br /&gt;
* [https://www.youtube.com/watch?v=Adi67_94_gc&amp;amp;list=PLJOzdkh8T5kp99tGTEFjH_b9zqEQiiBtC&amp;amp;index=5 Лекция &amp;quot;Линейные методы классификации: метод опорных векторов&amp;quot;]  — К.В. Воронцов, курс &amp;quot;Машинное обучение&amp;quot; 2014&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2 Wikipedia — Метод опорных векторов]&lt;br /&gt;
* Alexey Nefedov — [https://svmtutorial.online/ Support Vector Machines: A Simple Tutorial]&lt;br /&gt;
* John Platt — [https://www.microsoft.com/en-us/research/publication/sequential-minimal-optimization-a-fast-algorithm-for-training-support-vector-machines/ Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines]&lt;br /&gt;
* Shai Fine, Katya Scheinberg — [http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.9956 INCAS: An Incremental Active Set Method for SVM]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация]]&lt;br /&gt;
[[Категория: Регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70921</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70921"/>
				<updated>2019-04-08T23:10:26Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
Пример линейной регресии с применением &amp;lt;code&amp;gt;weka.classifiers.functions.LinearRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.LinearRegression;&lt;br /&gt;
  '''import''' weka.core.Instance;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Load Data set&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;dataset/house.arff&amp;quot;)));&lt;br /&gt;
  data.setClassIndex(data.numAttributes() - 1);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Build model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new LinearRegression();&lt;br /&gt;
  '''try''' { model.buildClassifier(data); }&lt;br /&gt;
  '''catch''' (Exception e) { e.printStackTrace(); }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//output model&amp;lt;/font&amp;gt;&lt;br /&gt;
  System.out.printf(&amp;quot;model parameters: %s%n&amp;quot;, model);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Now Predicting the cost&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' myHouse = data.lastInstance();&lt;br /&gt;
  '''var''' price  = model.classifyInstance(myHouse);&lt;br /&gt;
  System.out.printf(&amp;quot;predicted price = %s%n&amp;quot;, price)&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
Пример линейной регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Гребневая регрессия (ридж-регрессия)}}&lt;br /&gt;
&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Лассо-регрессия}}&lt;br /&gt;
&lt;br /&gt;
Пример Лассо-регрессии с применением &amp;lt;code&amp;gt;smile.regression.LASSO&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.LASSO;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lasso   = new LASSO(dataset.x(), dataset.y(), 10);&lt;br /&gt;
  lasso.predict(testX);&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test datasets and build MLP classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Print the result à la Weka explorer:&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.SVM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/SVM.html/ Smile, SVM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.SVM;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.math.kernel.GaussianKernel;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' train   = parser.parse(&amp;quot;USPS Train&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.train&amp;quot;));&lt;br /&gt;
  '''var''' test    = parser.parse(&amp;quot;USPS Test&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.test&amp;quot;));&lt;br /&gt;
  '''var''' classes = Arrays.stream(test.labels()).max().orElse(0) + 1;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build SVM classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' svm     = new SVM&amp;lt;&amp;gt;(new GaussianKernel(8.0), 5.0, classes, SVM.Multiclass.ONE_VS_ONE);&lt;br /&gt;
  svm.learn(train.x(), train.labels());&lt;br /&gt;
  svm.finish();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// calculate test error rate&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' error = 0;&lt;br /&gt;
  for (int i = 0; i &amp;lt; test.x().length; i++) {&lt;br /&gt;
   if (svm.predict(test.x()[i]) != test.labels()[i]) {&lt;br /&gt;
     error++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  System.out.format(&amp;quot;USPS error rate = %.2f%%\n&amp;quot;, 100.0 * error / test.x().length);&lt;br /&gt;
&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81&amp;diff=70887</id>
		<title>Дерево решений и случайный лес</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81&amp;diff=70887"/>
				<updated>2019-04-08T14:23:35Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Дерево решений {{---}} логический алгоритм классификации, решающий задачи классификации и регрессии. Представляет собой объединение логических условий в структуру дерева.&lt;br /&gt;
&lt;br /&gt;
==Дерево решений==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1. &lt;br /&gt;
|neat = &lt;br /&gt;
|definition=&lt;br /&gt;
'''Дерево решений''' (англ. ''decision tree, DT'') {{---}} алгоритм классификации &amp;lt;tex&amp;gt;a(x) = (V_{внутр}, v_0, V_{лист}, S_v, \beta_v)&amp;lt;/tex&amp;gt;, задающийся деревом (связным ациклическим графом), где:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V = V_{внутр} \cup V_{лист} &amp;lt;/tex&amp;gt; {{---}} множество вершин , &amp;lt;tex&amp;gt;v_0 \in V&amp;lt;/tex&amp;gt; {{---}} корень дерева;&lt;br /&gt;
* &amp;lt;tex&amp;gt; S_v : D_v \rightarrow V_v &amp;lt;/tex&amp;gt; {{---}} функция перехода по значению предиката в множество детей вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \beta_v : X \rightarrow D_v &amp;lt;/tex&amp;gt; {{---}} предикат ветвления, &amp;lt;tex&amp;gt;v \in V_{внутр}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|D_v| &amp;lt; \infty&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Для листьев &amp;lt;tex&amp;gt;v \in V_{лист}&amp;lt;/tex&amp;gt; определена метка класса &amp;lt;tex&amp;gt;y_v \in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Бинарное дерево решений''' {{---}}  частный случай дерева решений, для которого &amp;lt;tex&amp;gt; D_v = \{0,1\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:BinDT.jpg |300px|thumb|right|Классификация объекта &amp;lt;tex&amp;gt; x \in X &amp;lt;/tex&amp;gt; бинарным решающим деревом]]&lt;br /&gt;
&lt;br /&gt;
 '''function''' classify(x):&lt;br /&gt;
   &amp;lt;tex&amp;gt;v = v_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\beta_v(x) = 1 &amp;lt;/tex&amp;gt; &lt;br /&gt;
      &amp;lt;tex&amp;gt;v := R_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''else'''&lt;br /&gt;
      &amp;lt;tex&amp;gt;v := L_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информативность ветвления===&lt;br /&gt;
Для того, чтобы оценивать качество разбиения объектов по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, введем понятие ''информационного выигрыша'' разбиения. &amp;lt;br&amp;gt;&lt;br /&gt;
Сначала оценим распределение значений классов объектов внутри каждого множества из разбиения, введя понятие ''меры неопределенности распределения''.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Частотная оценка вероятности класса &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в вершине &amp;lt;tex&amp;gt;v \in V_{внутр}&amp;lt;/tex&amp;gt; ''': &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;p_y = P(y | x \in U) = \frac{1}{|U|} \sum\nolimits_{x_i \in U}[y_i = y]&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Мера неопределенности (англ. ''impurity'') распределения &amp;lt;tex&amp;gt;p_y&amp;lt;/tex&amp;gt;''': &amp;lt;br&amp;gt;&lt;br /&gt;
* минимальна, когда &amp;lt;tex&amp;gt;p_y \in \{0,1\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* максимальна, когда &amp;lt;tex&amp;gt;p_y = \frac{1}{|Y|}&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* не зависит от перенумерации классов&lt;br /&gt;
&amp;lt;tex&amp;gt;Ф(U) = \sum\nolimits_{y \in Y} p_y L(p_y) = \frac{1}{|U|} \sum\nolimits_{x_i \in U}L(P(y_i | x_i \in U)) \rightarrow min&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt; где &amp;lt;tex&amp;gt;L(p)&amp;lt;/tex&amp;gt; убывает и &amp;lt;tex&amp;gt;L(1) = 0&amp;lt;/tex&amp;gt;, например: &amp;lt;tex&amp;gt;-log_2(p)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1 - p&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1 - p^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Примерами мер неопределенности распределения являются: &lt;br /&gt;
* Энтропия: &amp;lt;tex&amp;gt;Ф(U) = -\sum\limits_{i}^N p_i log_2p_i&amp;lt;/tex&amp;gt;, определяется для каждого множества из разбиения, &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; {{---}} количество возможных классов, и &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; {{---}} вероятность объекта принадлежать &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt;-ому классу.&lt;br /&gt;
* Критерий Джини: &amp;lt;tex&amp;gt;Ф(U) = \sum\nolimits_{i != j}p_i p_j = \sum\nolimits_{i}p_i*(1-p_i)&amp;lt;/tex&amp;gt;, максимизацию этого критерия можно интерпретировать как максимизацию числа пар объектов одного класса, оказавшихся после разбиения в одном множестве. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь определим суммарную ''неопределенность распределения'' в разбиении.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Неопределенность распределения &amp;lt;tex&amp;gt;P(y_i | x_i \in U_{\beta(x_i)})&amp;lt;/tex&amp;gt; после ветвления вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; и разбиения &amp;lt;tex&amp;gt;U = \bigcup_{k \in D_v} U_k&amp;lt;/tex&amp;gt;''': &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Ф(U_0, ... ,U_{D_v}) = \frac{1}{|U|} \sum\nolimits_{k \in D_v} \sum\nolimits_{x_i \in U_k}L(P(y_i | x_i \in U_k)) = \sum\nolimits_{k \in D_v} \frac{|U_k|}{|U|}Ф(U_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
''Информационный выигрыш'' от разбиения определяется как изменение неопределенности в системе.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Информационный выигрыш от разбиения по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;''' &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Gain(\beta, U) = Ф(U) - Ф(U_1, ... ,U_{|D_v|}) = Ф(U) - \sum\nolimits_{k \in D_v} \frac{|U_k|}{|U|}Ф(U_k) \rightarrow max_{\beta \in B} &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Рекурсивный алгоритм построения бинарного дерева решений ID3 ===&lt;br /&gt;
Покажем идею построения дерева решения на частном случае бинарного дерева. Алгоритм &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt; (англ. ''Induction of Decision Tree'') заключается в последовательном дроблении выборки на две части до тех пор, пока в каждой части не окажутся объекты только одного класса. Разделение производится по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, который выбирается из множества элементарных предикатов. На практике в качестве элементарных предикатов чаще всего берут простые пороговые условия вида &amp;lt;tex&amp;gt;\beta(x) = [f_j(x) &amp;gt;= d_j]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;Проще всего записать этот алгоритм в виде рекурсивной процедуры &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt;, которая строит дерево по заданной подвыборке &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; и возвращает его корневую вершину. &lt;br /&gt;
&lt;br /&gt;
 1:'''function''' ID3(&amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;):&lt;br /&gt;
 2:   '''if''' &amp;lt;tex&amp;gt;for all&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;u \in U&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;y_u = y&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// создать листовую вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; c меткой класса &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 3:      v = createLeafVertex(&amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 4:      '''return''' v&lt;br /&gt;
      &amp;lt;font color=green&amp;gt;// найти предикат с максимальным информационным выигрышом &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;\beta= \mathrm{arg}\max_{\beta\in B} &amp;lt;/tex&amp;gt; Gain(&amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;)&lt;br /&gt;
      &amp;lt;font color=green&amp;gt;// разбить выборку на две части &amp;lt;tex&amp;gt;U = U_0 \cup U_1&amp;lt;/tex&amp;gt; по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 5:   &amp;lt;tex&amp;gt;U_0 := \{x \in U: \beta(x) = 0\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 6:   &amp;lt;tex&amp;gt;U_1 := \{x \in U: \beta(x) = 1\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 7:   '''if''' &amp;lt;tex&amp;gt;U_0 = \emptyset&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;U_1 = \emptyset&amp;lt;/tex&amp;gt; &lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// найти класс, в котором находится большинство объектов из &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 8:      &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; = majorClass(&amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 9:      v = createLeafVertex(&amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
      '''else'''&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// создать внутреннюю вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 10:     v = createVertex()&lt;br /&gt;
 11:     &amp;lt;tex&amp;gt;\beta_v = \beta&amp;lt;/tex&amp;gt;&lt;br /&gt;
 12:     &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;U_0&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 13:     &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;U_1&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 14:  '''return''' &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Редукция решающих деревьев ==&lt;br /&gt;
Суть редукции (англ. ''pruning'') состоит в удалении поддеревьев, имеющих недостаточную статистическую надёжность. При этом дерево перестаёт безошибочно классифицировать обучающую выборку, зато качество классификации новых объектов, как правило, улучшается. Рассмотрим наиболее простые варианты редукции.&lt;br /&gt;
&lt;br /&gt;
===Предредукция===&lt;br /&gt;
Предредукция (англ. ''pre-pruning'') или критерий раннего останова досрочно прекращает дальнейшее ветвление в вершине дерева, если информативность &amp;lt;tex&amp;gt;I(\beta, U)&amp;lt;/tex&amp;gt; для всех возможных предикатов &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; не дотягивает до заданного порогового значения &amp;lt;tex&amp;gt;I_0&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Для этого на шаге 8 алгоритма &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt; условие &amp;lt;tex&amp;gt;U_0 = \emptyset&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;U_1 = \emptyset&amp;lt;/tex&amp;gt;  заменяется условием &amp;lt;tex&amp;gt;I(\beta, U) &amp;lt;= I_0 &amp;lt;/tex&amp;gt;. Порог &amp;lt;tex&amp;gt;I_0 &amp;lt;/tex&amp;gt; является управляющим параметром метода. &amp;lt;br&amp;gt;&lt;br /&gt;
Предредукция считается не самым эффективным способом избежать переобучения, так как жадное ветвление по-прежнему остаётся глобально неоптимальным. Более эффективной считается cтратегия постредукции.&lt;br /&gt;
&lt;br /&gt;
===Постредукция===&lt;br /&gt;
Постредукция (англ. ''post-pruning'') просматривает все внутренние вершины дерева и заменяет отдельные вершины либо одной из дочерних вершин (при этом вторая дочерняя удаляется), либо терминальной вершиной. Процесс замен продолжается до тех&lt;br /&gt;
пор, пока в дереве остаются вершины, удовлетворяющие критерию замены. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''Критерием замены'' является сокращение числа ошибок на контрольной выборке, отобранной заранее, и не участвовавшей в обучении дерева. Стандартная рекомендация — оставлять в контроле около 30% объектов. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Для реализации постредукции контрольная выборка &amp;lt;tex&amp;gt;X^k&amp;lt;/tex&amp;gt; пропускается через&lt;br /&gt;
построенное дерево. При этом в каждой внутренней вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; запоминается подмножество &amp;lt;tex&amp;gt;S_v \subseteq X_k&amp;lt;/tex&amp;gt; попавших в неё контрольных объектов. Если &amp;lt;tex&amp;gt;S_v = \emptyset &amp;lt;/tex&amp;gt;, то вершина &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; считается ненадёжной и заменяется терминальной по ''мажоритарному правилу'': &amp;lt;br&amp;gt;&lt;br /&gt;
в качестве &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; берётся тот класс, объектов которого больше всего в обучающей подвыборке &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;, пришедшей в вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Затем для каждой внутренней вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; вычисляется число ошибок, полученных при классификации выборки &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; следующими способами: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r(v)&amp;lt;/tex&amp;gt; — классификация поддеревом, растущим из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_L(v)&amp;lt;/tex&amp;gt; — классификация поддеревом левой дочерней вершины &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_R(v)&amp;lt;/tex&amp;gt; — классификация поддеревом правой дочерней вершины &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_c(v)&amp;lt;/tex&amp;gt; — отнесение всех объектов выборки &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; к классу &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Эти величины сравниваются, и в зависимости от того, какая из них оказалась&lt;br /&gt;
минимальной, принимается, соответственно, одно из четырёх решений: &amp;lt;br&amp;gt;&lt;br /&gt;
* сохранить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; поддеревом левой дочерней вершины &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; поддеревом правой дочерней вершины &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; терминальной вершиной класса &amp;lt;tex&amp;gt;y_v = \mathrm{arg}\min_{y\in Y}r_c(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы построения деревьев решения ==&lt;br /&gt;
Недостатки рассмотренного алгоритма ID3: &lt;br /&gt;
* Применим только для дискретных значений признаков;&lt;br /&gt;
* Переобучение;&lt;br /&gt;
* На каждом шаге решение принимается по одному атрибуту.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм [https://en.wikipedia.org/wiki/Predictive_analytics#Classification_and_regression_trees_.28CART.29 CART] (англ. ''Classification And Regression Trees'')===&lt;br /&gt;
* В отличие от ID3 работает и с непрерывными значениями признаков: на каждом шаге построения дерева последовательно сравнивает все возможные разбиения для всех атрибутов и выбирает наилучший атрибут и наилучшее разбиение для него. Разбивает объекты на две части;&lt;br /&gt;
* Использует редукцию для избежания переобучения;&lt;br /&gt;
* Обрабатывает пропущенные или аномальные значения признаков.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм [https://en.wikipedia.org/wiki/C4.5_algorithm C4.5] ===&lt;br /&gt;
* Также работает и с непрерывными значениями признаков: на каждом шаге построения дерева выбирает правило разбиения по одному из признаков. Разбивает объекты на несколько частей по этому правилу, рекурсивно запускается из полученных подмножеств;&lt;br /&gt;
* Использует редукцию для избежания переобучения;&lt;br /&gt;
* Обрабатывает пропущенные или аномальные значения признаков.&lt;br /&gt;
&lt;br /&gt;
== Случайный лес ==&lt;br /&gt;
Случайный лес {{---}} один из примеров объединения классификаторов в [[Виды_ансамблей|ансамбль]]. &amp;lt;br&amp;gt;&lt;br /&gt;
Алгоритм построения случайного леса, состоящего из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; деревьев на основе обучающей выборки &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; такой:&lt;br /&gt;
 '''for''' (n: 1,...,N):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// сгенерировать выборку &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; c помощью [[Виды_ансамблей#Бутстрэп|бутстрэпа]]&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; = bootstrap(&amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// построить решающее дерево &amp;lt;tex&amp;gt;t_n&amp;lt;/tex&amp;gt; по выборке &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;t_n&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итоговый классификатор {{---}} &amp;lt;tex&amp;gt;a(x) = \frac{1}{N} \sum\limits_{i = 1}^{N} t_i(x)&amp;lt;/tex&amp;gt;. Для задачи классификации мы выбираем решение по большинству результатов, выданных классификаторами, а в задаче регрессии {{---}} по их среднему значению. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, случайный лес {{---}} бэггинг над решающими деревьями, при обучении которых для каждого разбиения признаки выбираются из некоторого случайного подмножества признаков.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Примеры на языке Python===&lt;br /&gt;
*Для решения задач классификации и регрессии используют [https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier DecisionTreeClassifier], [https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html#sklearn.tree.DecisionTreeRegressor DecisionTreeRegressor];&lt;br /&gt;
&lt;br /&gt;
*В '''sklearn.ensemble''' также представлены методы классификации, основанные на ансамблях, в том числе: [https://scikit-learn.org/stable/modules/ensemble.html#bagging бэггинг] и [https://scikit-learn.org/stable/modules/ensemble.html#forest случайный лес], которые были описаны выше. &lt;br /&gt;
&amp;lt;br&amp;gt;Так, в этом примере создается бэггинг ансамбль из классификаторов '''KNeighborsClassifier''', каждый из которых обучен на случайных подмножествах из 50% объектов из обучающей выборки, и 50% случайно выбранных признаков.&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' BaggingClassifier&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
 bagging = BaggingClassifier(KNeighborsClassifier(), max_samples=0.5, max_features=0.5)&lt;br /&gt;
&lt;br /&gt;
Пример использования классификатора на случайном лесе:&lt;br /&gt;
Полную версию кода можно найти [https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html#sphx-glr-download-auto-examples-classification-plot-classifier-comparison-py| здесь]&lt;br /&gt;
 '''from''' sklearn '''import''' RandomForestClassifier&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_classification&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// сгенерируем случайную обучающую выборку с классификацией по n_classes классам&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,&lt;br /&gt;
                           random_state=1, n_clusters_per_class=1, n_classes=2)&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// разбиваем выборку на обучающую и тестовую &amp;lt;/font&amp;gt;&lt;br /&gt;
 X = StandardScaler().fit_transform(X)&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// создадим классификатор на случайном лесе, состоящим из n_estimators деревьев&amp;lt;/font&amp;gt;&lt;br /&gt;
 RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 score = clf.score(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
Результат классификации показан на рисунке. &lt;br /&gt;
&lt;br /&gt;
[[Файл:RFC.png |800px|thumb|center|Классификация RandomForestClassifier. Кружочками изображены объекты обучающей выборки, крестиками тестовой выборки. Справа цветом выделены границы принятия решений, в правом нижнем углу {{---}} значение accuracy.]]&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.cart&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#cart Smile, Decision Trees]&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 '''iris: 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''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''dt: DecisionTree = cart(x, y, 1000)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(dt.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, dt)&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.trees.RandomForest&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/trees/RandomForest.html Weka, Random Forest]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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.Evaluation;&lt;br /&gt;
  '''import''' weka.classifiers.trees.RandomForest;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainingDataSet = getDataSet(...);&lt;br /&gt;
  '''var''' testingDataSet = getDataSet(...);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// create random forest classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' forest = new RandomForest();&lt;br /&gt;
  forest.setMaxDepth(15);&lt;br /&gt;
  forest.setNumFeatures(2);&lt;br /&gt;
  forest.buildClassifier(trainingDataSet);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// evaluate the model on test dataset and print summary&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eval = new Evaluation(trainingDataSet);&lt;br /&gt;
  eval.evaluateModel(forest, testingDataSet);&lt;br /&gt;
  System.out.println(eval.toSummaryString());&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Виды ансамблей]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/images/3/3e/Voron-ML-Logic.pdf Логические алгоритмы классификации] {{---}} Лекция К. В. Воронцова&lt;br /&gt;
# [https://medium.com/open-machine-learning-course/open-machine-learning-course-topic-5-ensembles-of-algorithms-and-random-forest-8e05246cbba7 Случайный лес] {{---}} статья на Medium, Yury Kashnitskiy&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/tree.html Деревья решений] {{---}} scikit-learn.org&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/ensemble.html Ансамбли классификаторов] — scikit-learn.org.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация и регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=70886</id>
		<title>Бустинг, AdaBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=70886"/>
				<updated>2019-04-08T14:23:04Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
'''Бустинг''' (англ. ''boosting'') {{---}} [[Мета-обучение|мета-алгоритм машинного обучения]]. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Сильный обучающий алгоритм является классификатором, хорошо [[Корреляция случайных величин|коррелирующим]] с верной классификацией, в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (англ. ''bagging'') и стэкинг&amp;lt;ref&amp;gt;[https://dyakonov.org/2017/03/10/c%D1%82%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3-stacking-%D0%B8-%D0%B1%D0%BB%D0%B5%D0%BD%D0%B4%D0%B8%D0%BD%D0%B3-blending/#more-4558 Стекинг {{---}} Дьяконов Александр]&amp;lt;/ref&amp;gt; (англ. ''stacking''). Бэггинг, в отличии от бустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. &lt;br /&gt;
&lt;br /&gt;
Одним из недостатков бустинга является то, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, требуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.&lt;br /&gt;
&lt;br /&gt;
==Алгоритмы бустинга==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Композицией''' $T$ '''алгоритмов''' &amp;lt;tex&amp;gt;a_t(x) = C(b_t(x)),\ t = 1,...,T&amp;lt;/tex&amp;gt; называется [[Суперпозиции|суперпозиция]] алгоритмических операторов &amp;lt;tex&amp;gt;b_t\ :\ X\to R&amp;lt;/tex&amp;gt;, корректирующей операции &amp;lt;tex&amp;gt;F\ :\ R^T\to R&amp;lt;/tex&amp;gt; и решающего правила &amp;lt;tex&amp;gt; C\ :\ R\to Y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} пространство оценок,&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))), x \in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;, Алгоритмы $a_t$ называют ''базовыми алгоритмами''.}}&lt;br /&gt;
Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и &amp;lt;tex&amp;gt;C(b(x)) = \textrm{sign}(b(x))&amp;lt;/tex&amp;gt;. Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))) = \textrm{sign}\left(\sum\limits_{t=1}^T \alpha_t b_t(x)\right),\ x\in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с [[Общие понятия|точностью обучения]]. После добавления слабого классификатора, веса пересчитываются ('''«пересчёт весовых коэффициентов»'''). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.&lt;br /&gt;
&lt;br /&gt;
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек [[Общие понятия|тренировочных данных]] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был '''AdaBoost'''&amp;lt;ref&amp;gt;[http://rob.schapire.net/papers/explaining-adaboost.pdf Explaining AdaBoost {{---}} Robert E. Schapire]&amp;lt;/ref&amp;gt; (сокр. ''Adaptive Boosting''), предложенный Шапире и Фройндом.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/LogitBoost Wikipedia {{---}} LogitBoost]&amp;lt;/ref&amp;gt;, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/BrownBoost Википедия {{---}} BrownBoost]&amp;lt;/ref&amp;gt;, позволяют избежать переобучения на данных с большим количеством &amp;quot;шума&amp;quot;, откидывая зашумленные элементы.&lt;br /&gt;
&lt;br /&gt;
==Прикладное использование алгоритмов бустинга==&lt;br /&gt;
===Задача классификации объектов===&lt;br /&gt;
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов {{---}} путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.&lt;br /&gt;
&lt;br /&gt;
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение [[Общие понятия|признаков]], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели '''«мешок слов»''', с помощью локальных описателей, таких как '''SIFT'''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Wikipedia {{---}} Scale-invariant feature transform]&amp;lt;/ref&amp;gt;, и так далее. Примерами классификаторов с учителем служат наивные [[Байесовская классификация|байесовские классификаторы]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, смесь гауссиан и [[Нейронные сети, перцептрон|нейронные сети]]. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.&lt;br /&gt;
&lt;br /&gt;
===Задача ранжирования выдачи поисковых систем===&lt;br /&gt;
Благодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. ''gradient boosting'') или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.&lt;br /&gt;
&lt;br /&gt;
==AdaBoost==&lt;br /&gt;
===Описание===&lt;br /&gt;
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.&lt;br /&gt;
&lt;br /&gt;
AdaBoost вызывает слабые классификаторы &amp;lt;tex&amp;gt;h_i^t&amp;lt;/tex&amp;gt; в цикле &amp;lt;tex&amp;gt;t = 1,...,T&amp;lt;/tex&amp;gt;. После каждого вызова обновляется распределение весов &amp;lt;tex&amp;gt;D_t&amp;lt;/tex&amp;gt;, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.&lt;br /&gt;
&lt;br /&gt;
===Описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' AdaBoost($X$, $Y$, $m$):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//Инициализируем&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 1..m '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_i^1 = \frac{1}{m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &lt;br /&gt;
   '''for''' t = 1..T '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;h_t = \arg \min\limits_{h_j \in \mathcal{H}} \epsilon_j = \sum\limits_{i=1}^{m} D_i^t〚y_i\neq h_j(x_i)〛&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$\epsilon$ {{---}} Взвешенная ошибка классификации, классификатор &amp;lt;tex&amp;gt;h_t:X\to \{-1,+1\}&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' i = 1..m '''do''':&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;Z_t&amp;lt;/tex&amp;gt; {{---}} нормализующий параметр, выбранный так, чтобы &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt; являлось распределением вероятностей, то есть &amp;lt;tex&amp;gt;\sum\limits_{i-1}^{m} D_i^{t+1} = 1&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;t=1,...,T&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
       &amp;lt;tex&amp;gt;D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &amp;lt;tex&amp;gt;H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$H(x)$ {{---}} результирующий классификатор&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' $H$&lt;br /&gt;
Выражение для обновления распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt; должно быть сконструировано таким образом, чтобы выполнялось условие:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}&amp;lt;1,\ y(i) = h_t(x_i) \\ &amp;gt;1,\ y(i) \neq h_t(x_i)\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Таким образом, после выбора оптимального классификатора &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; для распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt;, объекты &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, которые классификатор &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt;, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.&lt;br /&gt;
&lt;br /&gt;
===Пример работы===&lt;br /&gt;
Рассмотрим набор данных, которые пометим как $-$ и $+$.&lt;br /&gt;
[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]&lt;br /&gt;
Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим&lt;br /&gt;
[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]&lt;br /&gt;
Рассмотрим результат после $2$-х итераций:&lt;br /&gt;
[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]&lt;br /&gt;
Как видно из последнего изображения, все, что находиться в &amp;quot;цветной&amp;quot; зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и &amp;quot;белые&amp;quot; зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:&lt;br /&gt;
[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]&lt;br /&gt;
Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.&lt;br /&gt;
&lt;br /&gt;
===Достоинства и недостатки===&lt;br /&gt;
'''Достоинства:'''&lt;br /&gt;
# Простота реализации;&lt;br /&gt;
# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов;&lt;br /&gt;
# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов;&lt;br /&gt;
# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.&lt;br /&gt;
'''Недостатки:'''&lt;br /&gt;
# Склонен к переобучению при наличии значительного уровня шума в данных;&lt;br /&gt;
# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.&lt;br /&gt;
&lt;br /&gt;
===Пример кода на python для scikit-learn===&lt;br /&gt;
Классификатор sklearn.ensemble.'''AdaBoostClassifier'''&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]&amp;lt;/ref&amp;gt; имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.&lt;br /&gt;
Наиболее важными являются: &lt;br /&gt;
# '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1);&lt;br /&gt;
# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше;&lt;br /&gt;
# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' AdaBoostClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
 &lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 &lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
 abc = AdaBoostClassifier(n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.8888888888888888&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим алгоритм с SVC в качестве базы:&lt;br /&gt;
 '''from''' sklearn.svm '''import''' SVC&lt;br /&gt;
 &lt;br /&gt;
 svc=SVC(probability='''True''', kernel=''''linear'''')&lt;br /&gt;
 &lt;br /&gt;
 abc = AdaBoostClassifier(base_estimator='''svc''', n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.9555555555555556&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.adaboost&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]&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 '''iris: 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''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(ada.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, ada)&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.AdaBoost&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/AdaBoost.html/ Smile, AdaBoost]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.AdaBoost;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
  '''import''' smile.validation.Accuracy;&lt;br /&gt;
  '''import''' smile.validation.ClassificationMeasure;&lt;br /&gt;
  '''import''' smile.validation.FMeasure;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// load train and test datasets&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(0);&lt;br /&gt;
  '''var''' train    = arffParser.parse(this.getClass().getResourceAsStream(&amp;quot;train.arff&amp;quot;));&lt;br /&gt;
  '''var''' test     = arffParser.parse(this.getClass().getResouceAsStream(&amp;quot;test.arff&amp;quot;));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// create adaboost classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' forest   = new AdaBoost(train.attributes(), train.x(), train.labels(), 200, 4);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// measure accuracy and F1-measure on test dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' measures = new ClassificationMeasure[]{new FMeasure(), new Accuracy()};&lt;br /&gt;
  '''var''' results  = forest.test(test.x(), test.labels(), measures);&lt;br /&gt;
  System.out.println(Arrays.deepToString(results));&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Байесовская классификация|Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Мета-обучение|Мета-обучение]]&lt;br /&gt;
*[[Нейронные сети, перцептрон|Нейронные сети]]&lt;br /&gt;
*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
*[[CatBoost|CatBoost]]&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=AdaBoost AdaBoost] {{---}} статья на machinelearning.ru&lt;br /&gt;
# [http://cmp.felk.cvut.cz/~sochmj1/adaboost_talk.pdf AdaBoost] {{---}} презентация по AdaBoost&lt;br /&gt;
# [https://ru.coursera.org/lecture/ml-classification/example-of-adaboost-in-action-um0cX Example of AdaBoost in action] {{---}} презентация на coursera.org&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2) Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Ансамбли]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</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=70885</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=70885"/>
				<updated>2019-04-08T14:22:24Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &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;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// load dataset&amp;lt;/font&amp;gt;&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;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// initialize the PCA-based selector&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' pca = new PrincipalComponents();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// dimensionality reduction is achieved through selecting enough eigenvectors to account&amp;lt;/font&amp;gt;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// for some percantege of the variance in the original data&amp;lt;/font&amp;gt;&lt;br /&gt;
  pca.setVarianceCovered(0.95);&lt;br /&gt;
  pca.buildEvaluator(data);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// transform the dataset&amp;lt;/font&amp;gt;&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>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=70884</id>
		<title>Байесовская классификация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=70884"/>
				<updated>2019-04-08T14:21:45Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Вероятностная постановка задачи классификации ==&lt;br /&gt;
&lt;br /&gt;
Пусть $X$ множество объектов, $Y$ конечное множество имён классов, &lt;br /&gt;
множество $X \times Y$ является вероятностным пространством с плотностью распределения $p(x,y)=P(y)p(x|y)$.&lt;br /&gt;
Вероятности появления объектов каждого из классов $P_y=P(y)$ называются ''априорными вероятностями классов''.&lt;br /&gt;
Плотности распределения $p_y(x)=p(x|y)$ называются ''функциями правдоподобия классов''.&lt;br /&gt;
&lt;br /&gt;
'''Вероятностная постановка задачи классификации разделяется на две независимые подзадачи:'''&lt;br /&gt;
* Имеется простая выборка $X^l=(x_i, y_i)^l_{i=1}$ из неизвестного распределения $p(x,y)=P_yp_y(x)$. Требуется построить ''эмпирические оценки'' априорных вероятностей $P'_y$ и функций правдоподобия $p'_y(x)$ для каждого из классов $y \in Y$.&lt;br /&gt;
* По известным плотностям распределения $p_y(x)$ и априорным вероятностям $P_y$ всех классов $y \in Y$ построить алгоритм $a(x)$, минимизирующий вероятность ошибочной классификации.&lt;br /&gt;
&lt;br /&gt;
Априорные вероятности классов $P_y$ можно оценить согласно закону больших чисел, &lt;br /&gt;
тогда частота появления объектов каждого из классов равна $P'_y=\frac{l_y}{l}$ где $l_y=|X^l_y|, y \in Y$&lt;br /&gt;
сходится по вероятности к $P_y$ при $l_y \to \infty$. Чем больше длина выборки, тем точнее выборочная оценка $P'_y$.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оптимальный байесовский классификатор ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольный алгоритм $a:X \to Y$.&lt;br /&gt;
Он разбивает множество $X$ на не пересекающиеся области $A_y=\{x \in X | a(x) = y\}, y \in Y$.&lt;br /&gt;
Вероятность того,что появится объект класса $y$ и алгоритм $a$ отнесёт его к классу $s$, равна $P_yP(A_s|y)$.&lt;br /&gt;
Каждой паре $(y,s) \in Y \times Y$ поставим в соответствие величину потери $\lambda_{ys}$ &lt;br /&gt;
при отнесении объекта класса $y$ к классу $s$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Функционал среднего риска''' {{---}} ожидаемая величина потери при классификации объектов алгоритмом $a$:&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a) = \displaystyle\sum_{y \in Y}\sum_{s \in Y}\lambda_{ys}P_yP(A_s|y) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
об оптимальности байесовского классификатора&lt;br /&gt;
|statement=&lt;br /&gt;
Если известны априорные вероятности $P_y$ и функции правдоподобия $p_y(x)$, &lt;br /&gt;
то минимум среднего риска $R(a)$ достигается алгоритмом&lt;br /&gt;
:&amp;lt;tex&amp;gt; a(x) = \displaystyle\arg\min_{s \in Y}\sum_{y \in Y}\lambda_{ys}P_yp_y(x) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Для произвольного $t \in Y$ запишем функционал среднего риска:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a)=\displaystyle\sum_{y \in Y}\sum_{s \in Y}\lambda_{ys}P_yP(A_s|y) = \sum_{y \in Y}\lambda_{yt}P_yP(A_t|y) + \sum_{s \in Y\setminus\{t\} }\sum_{y \in Y}\lambda_{ys}P_yP(A_s|y).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Применив формулу полной вероятности, $P(A_t \mid y) = 1 −\displaystyle\sum_{ s \in Y \setminus \{t\} }P(A_s \mid y)$, получим:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a) = \displaystyle\sum_{y \in Y}\lambda_{yt}P_y + \sum_{ s \in Y \setminus \{t\} } \sum_{y \in Y} (\lambda_{ys} - \lambda_{yt})P_yP(A_s|y) = &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; = const(a) + \displaystyle\sum_{ s \in Y \setminus \{t\} } \int_{A_s}\sum_{y \in Y} (\lambda_{ys}−\lambda_{yt})P_yp_y(x)dx.  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём для сокращения записи обозначение &lt;br /&gt;
$g_s(x) = \displaystyle\sum_{y \in Y}\lambda_{ys}P_yp_y(x)$, тогда &lt;br /&gt;
$R(a) = const(a) + \displaystyle\sum_{ s \in Y \setminus \{t\} }\int_{A_s}(g_s(x)−g_t(x))dx$.&lt;br /&gt;
&lt;br /&gt;
Минимум интегрла достигается, когда $A_s$ совпадает с областью неположительности подынтегрального выражения. &lt;br /&gt;
:&amp;lt;tex&amp;gt; A_s=\{x \in X \mid g_s(x) \leq g_t(x), \forall t \in Y, t \leq s\}.  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С другой стороны, $A_s=\{x \in X \mid a(x) = s\}$. Значит, $a(x) = s$ тогда и только тогда, когда &lt;br /&gt;
:$s= \displaystyle\arg\min_{t \in Y}g_t(x)$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Наивный байесовский классификатор ==&lt;br /&gt;
&lt;br /&gt;
Допустим, что объекты $x \in X$ описываются $n$ числовыми признаками $f_j:X→R,j= 1,...,n$. &lt;br /&gt;
Обозначим через $x = (\xi_1,...,\xi_n)$ произвольный элемент пространства объектов $X=R^n$, где $\xi_j=f_j(x)$.&lt;br /&gt;
&lt;br /&gt;
Предположим, что признаки $f_1(x),...,f_n(x)$ являются независимыми случайными величинами. &lt;br /&gt;
Следовательно, функции правдоподобия классов представимы в виде:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; p_y(x) = \displaystyle\prod^n_{i=1}p_{yi}(\xi_i) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где $p_{yj}(\xi_j)$ плотность распределения значений $j$-го признака для класса $y$.&lt;br /&gt;
Алгоритмы классификации исходящие из этого предположения, называются ''наивными байесовскими''.&lt;br /&gt;
&lt;br /&gt;
Подставим эмпирические оценки одномерных плотностей в байесовский классификатор. Получим алгоритм:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; a(x) = \displaystyle\arg\max_{y \in Y}(\ln\lambda_yP'_y + \sum^n_{j=1}\ln p'_{yj}(\xi_j)).  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основные его преимущества {{---}} простота реализации и низкие вычислительные затраты при обучении и классификации. &lt;br /&gt;
В тех редких случаях, когда признаки почти независимы, наивный байесовский классификатор близок к оптимальному.&lt;br /&gt;
Достаточно малое количество данных необходимо для обучения, оценки параметров и классификации. &lt;br /&gt;
&lt;br /&gt;
Основной его недостаток {{---}} низкое качество классификации в общем случае. &lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
&lt;br /&gt;
Из-за своего низкого качества классификации наивный байесовскими классификатор в основном он используется либо как эталон при экспериментальном сравнении алгоритмов, &lt;br /&gt;
либо как элементарный строительный блок в алгоритмических композициях.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим частое применение байесовского классификатора к задаче классификации документов по их содержимому, &lt;br /&gt;
а именно к классификации электронных писем на два класса {{---}} спам ($S$) и не-спам ($\displaystyle \neg S$),&lt;br /&gt;
предполагая что вероятность слов в тексте не зависит друг от друга:&lt;br /&gt;
&lt;br /&gt;
Программные спам-фильтры, построенные на принципах наивного байесовского классификатора, делают «наивное» предположение о том, что события, &lt;br /&gt;
соответствующие наличию того или иного слова в электронном письме или сообщении, являются независимыми по отношению друг к другу. &lt;br /&gt;
Это упрощение в общем случае является неверным для естественных языков:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; P(a\ very\ close\ game) = P(a) \times P(very) \times P(close) \times P(game) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Исходя из такого предположения, для решения задачи классификации сообщений лишь на 2 класса: &lt;br /&gt;
$S$ (спам) и $H = \neg S$ («хэм», то есть не спам) из теоремы Байеса можно вывести следующую формулу оценки вероятности «спамовости» всего сообщения $D$, &lt;br /&gt;
содержащего слова $W_1, W_2, ... W_N$:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\displaystyle p(S\mid D) = p(S\mid W_1, W_2, ... W_N) = \frac{p(W_1, W_2, ... W_N\mid S) \cdot p(S)}{p(W_1, W_2, ... W_N)} = &amp;lt;/tex&amp;gt; [так как $W_i$ предполагаются независимыми] &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;= \displaystyle\frac{\prod_{i} p(W_i\mid S) \cdot p(S)}{p(W_1, W_2, ... W_N)} = \frac{\prod_{i}p(S\mid W_i)}{\prod_i(p(S\mid W_i)) + \left(\frac{p(\neg S)}{p(S)}\right)^{1-N} \cdot \prod_i p(\neg S\mid W_i)} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат $p$ обычно сравнивают с некоторым порогом (например, $0.5$), чтобы решить, является ли сообщение спамом или нет. Если $p$ ниже, чем порог, сообщение рассматривают как вероятный «ham», иначе его рассматривают как вероятный спам.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\displaystyle\ln{p(S\mid D)\over p(\neg S\mid D)} &amp;gt; h&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB GaussianNB] реализует наивный байесовский классификатор в предположении что изначальное распределение было гауссовым:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; P(x_i \mid y) = \displaystyle\frac{1}{\sqrt{2\pi\sigma^2_y}}\exp(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.metrics '''import''' f1_score, accuracy_score&lt;br /&gt;
 '''from''' sklearn.naive_bayes '''import''' GaussianNB&lt;br /&gt;
 iris = datasets.load_iris()&lt;br /&gt;
 gnb = GaussianNB()&lt;br /&gt;
 pred = gnb.fit(iris.data, iris.target).predict(iris.data)&lt;br /&gt;
 accuracy = accuracy_score(iris.target, pred)&lt;br /&gt;
 f1 = f1_score(iris.target, pred, average=&amp;quot;micro&amp;quot;)&lt;br /&gt;
 '''print'''(''&amp;quot;accruracy:&amp;quot;'', accuracy, ''&amp;quot;f1:&amp;quot;'', f1)&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 accruracy: 0.96 f1: 0.96&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.bayes.NaiveBayes&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/bayes/NaiveBayes.html/ Weka, Naive Bayes]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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.bayes.NaiveBayes;&lt;br /&gt;
  '''import''' weka.classifiers.evaluation.Evaluation;&lt;br /&gt;
  '''import''' weka.core.converters.ConverterUtils;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// load dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' source = new DataSource(&amp;quot;/iris.arff&amp;quot;);&lt;br /&gt;
  '''var''' dataset = source.getDataSet();	&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// set class index to the last attribute&amp;lt;/font&amp;gt;&lt;br /&gt;
  dataset.setClassIndex(dataset.numAttributes() - 1);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// create and build the classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' nb = new NaiveBayes();&lt;br /&gt;
  nb.buildClassifier(dataset);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// cross validate model&amp;lt;/font&amp;gt;&lt;br /&gt;
  var eval = new Evaluation(dataset);&lt;br /&gt;
  eval.crossValidateModel(nb, dataset, 10, new Random(41));&lt;br /&gt;
  System.out.println(&amp;quot;Estimated Accuracy: &amp;quot;+ Double.toString(eval.pctCorrect()));&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Байесовские сети|Байесовские сети]]&lt;br /&gt;
*[[:Независимые события|Независимые события]]&lt;br /&gt;
*[[:Формула Байеса|Формула Байеса]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B1%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%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 Википедия {{---}} Наивный байесовский классификатор] &lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/6/6d/Voron-ML-1.pdf К.В.Воронцов Математические методы обучения по прецедентам]&lt;br /&gt;
* [https://scikit-learn.org/stable/modules/naive_bayes.html Scikit-learn 1.9. Supervised learning - Naive Bayes]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация и регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=70883</id>
		<title>Байесовская классификация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=70883"/>
				<updated>2019-04-08T14:21:26Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Вероятностная постановка задачи классификации ==&lt;br /&gt;
&lt;br /&gt;
Пусть $X$ множество объектов, $Y$ конечное множество имён классов, &lt;br /&gt;
множество $X \times Y$ является вероятностным пространством с плотностью распределения $p(x,y)=P(y)p(x|y)$.&lt;br /&gt;
Вероятности появления объектов каждого из классов $P_y=P(y)$ называются ''априорными вероятностями классов''.&lt;br /&gt;
Плотности распределения $p_y(x)=p(x|y)$ называются ''функциями правдоподобия классов''.&lt;br /&gt;
&lt;br /&gt;
'''Вероятностная постановка задачи классификации разделяется на две независимые подзадачи:'''&lt;br /&gt;
* Имеется простая выборка $X^l=(x_i, y_i)^l_{i=1}$ из неизвестного распределения $p(x,y)=P_yp_y(x)$. Требуется построить ''эмпирические оценки'' априорных вероятностей $P'_y$ и функций правдоподобия $p'_y(x)$ для каждого из классов $y \in Y$.&lt;br /&gt;
* По известным плотностям распределения $p_y(x)$ и априорным вероятностям $P_y$ всех классов $y \in Y$ построить алгоритм $a(x)$, минимизирующий вероятность ошибочной классификации.&lt;br /&gt;
&lt;br /&gt;
Априорные вероятности классов $P_y$ можно оценить согласно закону больших чисел, &lt;br /&gt;
тогда частота появления объектов каждого из классов равна $P'_y=\frac{l_y}{l}$ где $l_y=|X^l_y|, y \in Y$&lt;br /&gt;
сходится по вероятности к $P_y$ при $l_y \to \infty$. Чем больше длина выборки, тем точнее выборочная оценка $P'_y$.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оптимальный байесовский классификатор ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольный алгоритм $a:X \to Y$.&lt;br /&gt;
Он разбивает множество $X$ на не пересекающиеся области $A_y=\{x \in X | a(x) = y\}, y \in Y$.&lt;br /&gt;
Вероятность того,что появится объект класса $y$ и алгоритм $a$ отнесёт его к классу $s$, равна $P_yP(A_s|y)$.&lt;br /&gt;
Каждой паре $(y,s) \in Y \times Y$ поставим в соответствие величину потери $\lambda_{ys}$ &lt;br /&gt;
при отнесении объекта класса $y$ к классу $s$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Функционал среднего риска''' {{---}} ожидаемая величина потери при классификации объектов алгоритмом $a$:&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a) = \displaystyle\sum_{y \in Y}\sum_{s \in Y}\lambda_{ys}P_yP(A_s|y) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
об оптимальности байесовского классификатора&lt;br /&gt;
|statement=&lt;br /&gt;
Если известны априорные вероятности $P_y$ и функции правдоподобия $p_y(x)$, &lt;br /&gt;
то минимум среднего риска $R(a)$ достигается алгоритмом&lt;br /&gt;
:&amp;lt;tex&amp;gt; a(x) = \displaystyle\arg\min_{s \in Y}\sum_{y \in Y}\lambda_{ys}P_yp_y(x) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Для произвольного $t \in Y$ запишем функционал среднего риска:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a)=\displaystyle\sum_{y \in Y}\sum_{s \in Y}\lambda_{ys}P_yP(A_s|y) = \sum_{y \in Y}\lambda_{yt}P_yP(A_t|y) + \sum_{s \in Y\setminus\{t\} }\sum_{y \in Y}\lambda_{ys}P_yP(A_s|y).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Применив формулу полной вероятности, $P(A_t \mid y) = 1 −\displaystyle\sum_{ s \in Y \setminus \{t\} }P(A_s \mid y)$, получим:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a) = \displaystyle\sum_{y \in Y}\lambda_{yt}P_y + \sum_{ s \in Y \setminus \{t\} } \sum_{y \in Y} (\lambda_{ys} - \lambda_{yt})P_yP(A_s|y) = &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; = const(a) + \displaystyle\sum_{ s \in Y \setminus \{t\} } \int_{A_s}\sum_{y \in Y} (\lambda_{ys}−\lambda_{yt})P_yp_y(x)dx.  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём для сокращения записи обозначение &lt;br /&gt;
$g_s(x) = \displaystyle\sum_{y \in Y}\lambda_{ys}P_yp_y(x)$, тогда &lt;br /&gt;
$R(a) = const(a) + \displaystyle\sum_{ s \in Y \setminus \{t\} }\int_{A_s}(g_s(x)−g_t(x))dx$.&lt;br /&gt;
&lt;br /&gt;
Минимум интегрла достигается, когда $A_s$ совпадает с областью неположительности подынтегрального выражения. &lt;br /&gt;
:&amp;lt;tex&amp;gt; A_s=\{x \in X \mid g_s(x) \leq g_t(x), \forall t \in Y, t \leq s\}.  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С другой стороны, $A_s=\{x \in X \mid a(x) = s\}$. Значит, $a(x) = s$ тогда и только тогда, когда &lt;br /&gt;
:$s= \displaystyle\arg\min_{t \in Y}g_t(x)$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Наивный байесовский классификатор ==&lt;br /&gt;
&lt;br /&gt;
Допустим, что объекты $x \in X$ описываются $n$ числовыми признаками $f_j:X→R,j= 1,...,n$. &lt;br /&gt;
Обозначим через $x = (\xi_1,...,\xi_n)$ произвольный элемент пространства объектов $X=R^n$, где $\xi_j=f_j(x)$.&lt;br /&gt;
&lt;br /&gt;
Предположим, что признаки $f_1(x),...,f_n(x)$ являются независимыми случайными величинами. &lt;br /&gt;
Следовательно, функции правдоподобия классов представимы в виде:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; p_y(x) = \displaystyle\prod^n_{i=1}p_{yi}(\xi_i) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где $p_{yj}(\xi_j)$ плотность распределения значений $j$-го признака для класса $y$.&lt;br /&gt;
Алгоритмы классификации исходящие из этого предположения, называются ''наивными байесовскими''.&lt;br /&gt;
&lt;br /&gt;
Подставим эмпирические оценки одномерных плотностей в байесовский классификатор. Получим алгоритм:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; a(x) = \displaystyle\arg\max_{y \in Y}(\ln\lambda_yP'_y + \sum^n_{j=1}\ln p'_{yj}(\xi_j)).  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основные его преимущества {{---}} простота реализации и низкие вычислительные затраты при обучении и классификации. &lt;br /&gt;
В тех редких случаях, когда признаки почти независимы, наивный байесовский классификатор близок к оптимальному.&lt;br /&gt;
Достаточно малое количество данных необходимо для обучения, оценки параметров и классификации. &lt;br /&gt;
&lt;br /&gt;
Основной его недостаток {{---}} низкое качество классификации в общем случае. &lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
&lt;br /&gt;
Из-за своего низкого качества классификации наивный байесовскими классификатор в основном он используется либо как эталон при экспериментальном сравнении алгоритмов, &lt;br /&gt;
либо как элементарный строительный блок в алгоритмических композициях.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим частое применение байесовского классификатора к задаче классификации документов по их содержимому, &lt;br /&gt;
а именно к классификации электронных писем на два класса {{---}} спам ($S$) и не-спам ($\displaystyle \neg S$),&lt;br /&gt;
предполагая что вероятность слов в тексте не зависит друг от друга:&lt;br /&gt;
&lt;br /&gt;
Программные спам-фильтры, построенные на принципах наивного байесовского классификатора, делают «наивное» предположение о том, что события, &lt;br /&gt;
соответствующие наличию того или иного слова в электронном письме или сообщении, являются независимыми по отношению друг к другу. &lt;br /&gt;
Это упрощение в общем случае является неверным для естественных языков:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; P(a\ very\ close\ game) = P(a) \times P(very) \times P(close) \times P(game) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Исходя из такого предположения, для решения задачи классификации сообщений лишь на 2 класса: &lt;br /&gt;
$S$ (спам) и $H = \neg S$ («хэм», то есть не спам) из теоремы Байеса можно вывести следующую формулу оценки вероятности «спамовости» всего сообщения $D$, &lt;br /&gt;
содержащего слова $W_1, W_2, ... W_N$:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\displaystyle p(S\mid D) = p(S\mid W_1, W_2, ... W_N) = \frac{p(W_1, W_2, ... W_N\mid S) \cdot p(S)}{p(W_1, W_2, ... W_N)} = &amp;lt;/tex&amp;gt; [так как $W_i$ предполагаются независимыми] &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;= \displaystyle\frac{\prod_{i} p(W_i\mid S) \cdot p(S)}{p(W_1, W_2, ... W_N)} = \frac{\prod_{i}p(S\mid W_i)}{\prod_i(p(S\mid W_i)) + \left(\frac{p(\neg S)}{p(S)}\right)^{1-N} \cdot \prod_i p(\neg S\mid W_i)} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат $p$ обычно сравнивают с некоторым порогом (например, $0.5$), чтобы решить, является ли сообщение спамом или нет. Если $p$ ниже, чем порог, сообщение рассматривают как вероятный «ham», иначе его рассматривают как вероятный спам.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\displaystyle\ln{p(S\mid D)\over p(\neg S\mid D)} &amp;gt; h&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB GaussianNB] реализует наивный байесовский классификатор в предположении что изначальное распределение было гауссовым:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; P(x_i \mid y) = \displaystyle\frac{1}{\sqrt{2\pi\sigma^2_y}}\exp(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.metrics '''import''' f1_score, accuracy_score&lt;br /&gt;
 '''from''' sklearn.naive_bayes '''import''' GaussianNB&lt;br /&gt;
 iris = datasets.load_iris()&lt;br /&gt;
 gnb = GaussianNB()&lt;br /&gt;
 pred = gnb.fit(iris.data, iris.target).predict(iris.data)&lt;br /&gt;
 accuracy = accuracy_score(iris.target, pred)&lt;br /&gt;
 f1 = f1_score(iris.target, pred, average=&amp;quot;micro&amp;quot;)&lt;br /&gt;
 '''print'''(''&amp;quot;accruracy:&amp;quot;'', accuracy, ''&amp;quot;f1:&amp;quot;'', f1)&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 accruracy: 0.96 f1: 0.96&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.bayes.NaiveBayes&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/bayes/NaiveBayes.html/ Weka, Naive Bayes]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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.bayes.NaiveBayes;&lt;br /&gt;
  '''import''' weka.classifiers.evaluation.Evaluation;&lt;br /&gt;
  '''import''' weka.core.converters.ConverterUtils;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// load dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' source = new DataSource(&amp;quot;/iris.arff&amp;quot;);&lt;br /&gt;
  '''var''' dataset = source.getDataSet();	&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//set class index to the last attribute&amp;lt;/font&amp;gt;&lt;br /&gt;
  dataset.setClassIndex(dataset.numAttributes() - 1);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//create and build the classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' nb = new NaiveBayes();&lt;br /&gt;
  nb.buildClassifier(dataset);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// cross validate model&amp;lt;/font&amp;gt;&lt;br /&gt;
  var eval = new Evaluation(dataset);&lt;br /&gt;
  eval.crossValidateModel(nb, dataset, 10, new Random(41));&lt;br /&gt;
  System.out.println(&amp;quot;Estimated Accuracy: &amp;quot;+ Double.toString(eval.pctCorrect()));&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Байесовские сети|Байесовские сети]]&lt;br /&gt;
*[[:Независимые события|Независимые события]]&lt;br /&gt;
*[[:Формула Байеса|Формула Байеса]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B1%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%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 Википедия {{---}} Наивный байесовский классификатор] &lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/6/6d/Voron-ML-1.pdf К.В.Воронцов Математические методы обучения по прецедентам]&lt;br /&gt;
* [https://scikit-learn.org/stable/modules/naive_bayes.html Scikit-learn 1.9. Supervised learning - Naive Bayes]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация и регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70882</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70882"/>
				<updated>2019-04-08T14:20:27Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
Пример линейной регресии с применением &amp;lt;code&amp;gt;weka.classifiers.functions.LinearRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.LinearRegression;&lt;br /&gt;
  '''import''' weka.core.Instance;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Load Data set&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;dataset/house.arff&amp;quot;)));&lt;br /&gt;
  data.setClassIndex(data.numAttributes() - 1);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Build model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new LinearRegression();&lt;br /&gt;
  '''try''' { model.buildClassifier(data); }&lt;br /&gt;
  '''catch''' (Exception e) { e.printStackTrace(); }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//output model&amp;lt;/font&amp;gt;&lt;br /&gt;
  System.out.printf(&amp;quot;model parameters: %s%n&amp;quot;, model);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Now Predicting the cost&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' myHouse = data.lastInstance();&lt;br /&gt;
  '''var''' price  = model.classifyInstance(myHouse);&lt;br /&gt;
  System.out.printf(&amp;quot;predicted price = %s%n&amp;quot;, price)&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
Пример линейной регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Гребневая регрессия (ридж-регрессия)}}&lt;br /&gt;
&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Лассо-регрессия}}&lt;br /&gt;
&lt;br /&gt;
Пример Лассо-регрессии с применением &amp;lt;code&amp;gt;smile.regression.LASSO&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.LASSO;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lasso   = new LASSO(dataset.x(), dataset.y(), 10);&lt;br /&gt;
  lasso.predict(testX);&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test datasets and build MLP classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Print the result à la Weka explorer:&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.SVM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/SVM.html/ Smile, SVM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.SVM;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.math.kernel.GaussianKernel;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' train   = parser.parse(&amp;quot;USPS Train&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.train&amp;quot;));&lt;br /&gt;
  '''var''' test    = parser.parse(&amp;quot;USPS Test&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.test&amp;quot;));&lt;br /&gt;
  '''var''' classes = Arrays.stream(test.labels()).max().orElse(0) + 1;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build SVM classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' svm     = new SVM&amp;lt;&amp;gt;(new GaussianKernel(8.0), 5.0, classes, SVM.Multiclass.ONE_VS_ONE);&lt;br /&gt;
  svm.learn(train.x(), train.labels());&lt;br /&gt;
  svm.finish();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// calculate test error rate&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' error = 0;&lt;br /&gt;
  for (int i = 0; i &amp;lt; test.x().length; i++) {&lt;br /&gt;
   if (svm.predict(test.x()[i]) != test.labels()[i]) {&lt;br /&gt;
     error++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  System.out.format(&amp;quot;USPS error rate = %.2f%%\n&amp;quot;, 100.0 * error / test.x().length);&lt;br /&gt;
&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</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=70881</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=70881"/>
				<updated>2019-04-08T14:19:32Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &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;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read dataset and build knn-classifier&amp;lt;/font&amp;gt;&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;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(dataset);&lt;br /&gt;
  eTest.evaluateModel(ibk, dataset);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// print results summary&amp;lt;/font&amp;gt;&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>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Python&amp;diff=70880</id>
		<title>Обзор библиотек для машинного обучения на Python</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Python&amp;diff=70880"/>
				<updated>2019-04-08T14:18:35Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
Пример линейной регресии с применением &amp;lt;code&amp;gt;weka.classifiers.functions.LinearRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.LinearRegression;&lt;br /&gt;
  '''import''' weka.core.Instance;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Load Data set&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;dataset/house.arff&amp;quot;)));&lt;br /&gt;
  data.setClassIndex(data.numAttributes() - 1);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//Build model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new LinearRegression();&lt;br /&gt;
  '''try''' { model.buildClassifier(data); }&lt;br /&gt;
  '''catch''' (Exception e) { e.printStackTrace(); }&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//output model&amp;lt;/font&amp;gt;&lt;br /&gt;
  System.out.printf(&amp;quot;model parameters: %s%n&amp;quot;, model);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Now Predicting the cost&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' myHouse = data.lastInstance();&lt;br /&gt;
  '''var''' price  = model.classifyInstance(myHouse);&lt;br /&gt;
  System.out.printf(&amp;quot;predicted price = %s%n&amp;quot;, price)&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
Пример линейной регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Гребневая регрессия (ридж-регрессия)}}&lt;br /&gt;
&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Лассо-регрессия}}&lt;br /&gt;
&lt;br /&gt;
Пример Лассо-регрессии с применением &amp;lt;code&amp;gt;smile.regression.LASSO&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.LASSO;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lasso   = new LASSO(dataset.x(), dataset.y(), 10);&lt;br /&gt;
  lasso.predict(testX);&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test datasets and build MLP classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Test the model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// Print the result à la Weka explorer:&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.SVM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/SVM.html/ Smile, SVM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.SVM;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.math.kernel.GaussianKernel;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// read train &amp;amp; test dataset&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' train   = parser.parse(&amp;quot;USPS Train&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.train&amp;quot;));&lt;br /&gt;
  '''var''' test    = parser.parse(&amp;quot;USPS Test&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.test&amp;quot;));&lt;br /&gt;
  '''var''' classes = Arrays.stream(test.labels()).max().orElse(0) + 1;&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build SVM classifier&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' svm     = new SVM&amp;lt;&amp;gt;(new GaussianKernel(8.0), 5.0, classes, SVM.Multiclass.ONE_VS_ONE);&lt;br /&gt;
  svm.learn(train.x(), train.labels());&lt;br /&gt;
  svm.finish();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// calculate test error rate&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' error = 0;&lt;br /&gt;
  for (int i = 0; i &amp;lt; test.x().length; i++) {&lt;br /&gt;
   if (svm.predict(test.x()[i]) != test.labels()[i]) {&lt;br /&gt;
     error++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  System.out.format(&amp;quot;USPS error rate = %.2f%%\n&amp;quot;, 100.0 * error / test.x().length);&lt;br /&gt;
&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;//load data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// new instance of clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// build the clusterer&amp;lt;/font&amp;gt;&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=70879</id>
		<title>Бустинг, AdaBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=70879"/>
				<updated>2019-04-08T14:05:29Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
'''Бустинг''' (англ. ''boosting'') {{---}} [[Мета-обучение|мета-алгоритм машинного обучения]]. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Сильный обучающий алгоритм является классификатором, хорошо [[Корреляция случайных величин|коррелирующим]] с верной классификацией, в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (англ. ''bagging'') и стэкинг&amp;lt;ref&amp;gt;[https://dyakonov.org/2017/03/10/c%D1%82%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3-stacking-%D0%B8-%D0%B1%D0%BB%D0%B5%D0%BD%D0%B4%D0%B8%D0%BD%D0%B3-blending/#more-4558 Стекинг {{---}} Дьяконов Александр]&amp;lt;/ref&amp;gt; (англ. ''stacking''). Бэггинг, в отличии от бустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. &lt;br /&gt;
&lt;br /&gt;
Одним из недостатков бустинга является то, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, требуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.&lt;br /&gt;
&lt;br /&gt;
==Алгоритмы бустинга==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Композицией''' $T$ '''алгоритмов''' &amp;lt;tex&amp;gt;a_t(x) = C(b_t(x)),\ t = 1,...,T&amp;lt;/tex&amp;gt; называется [[Суперпозиции|суперпозиция]] алгоритмических операторов &amp;lt;tex&amp;gt;b_t\ :\ X\to R&amp;lt;/tex&amp;gt;, корректирующей операции &amp;lt;tex&amp;gt;F\ :\ R^T\to R&amp;lt;/tex&amp;gt; и решающего правила &amp;lt;tex&amp;gt; C\ :\ R\to Y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} пространство оценок,&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))), x \in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;, Алгоритмы $a_t$ называют ''базовыми алгоритмами''.}}&lt;br /&gt;
Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и &amp;lt;tex&amp;gt;C(b(x)) = \textrm{sign}(b(x))&amp;lt;/tex&amp;gt;. Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))) = \textrm{sign}\left(\sum\limits_{t=1}^T \alpha_t b_t(x)\right),\ x\in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с [[Общие понятия|точностью обучения]]. После добавления слабого классификатора, веса пересчитываются ('''«пересчёт весовых коэффициентов»'''). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.&lt;br /&gt;
&lt;br /&gt;
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек [[Общие понятия|тренировочных данных]] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был '''AdaBoost'''&amp;lt;ref&amp;gt;[http://rob.schapire.net/papers/explaining-adaboost.pdf Explaining AdaBoost {{---}} Robert E. Schapire]&amp;lt;/ref&amp;gt; (сокр. ''Adaptive Boosting''), предложенный Шапире и Фройндом.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/LogitBoost Wikipedia {{---}} LogitBoost]&amp;lt;/ref&amp;gt;, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/BrownBoost Википедия {{---}} BrownBoost]&amp;lt;/ref&amp;gt;, позволяют избежать переобучения на данных с большим количеством &amp;quot;шума&amp;quot;, откидывая зашумленные элементы.&lt;br /&gt;
&lt;br /&gt;
==Прикладное использование алгоритмов бустинга==&lt;br /&gt;
===Задача классификации объектов===&lt;br /&gt;
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов {{---}} путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.&lt;br /&gt;
&lt;br /&gt;
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение [[Общие понятия|признаков]], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели '''«мешок слов»''', с помощью локальных описателей, таких как '''SIFT'''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Wikipedia {{---}} Scale-invariant feature transform]&amp;lt;/ref&amp;gt;, и так далее. Примерами классификаторов с учителем служат наивные [[Байесовская классификация|байесовские классификаторы]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, смесь гауссиан и [[Нейронные сети, перцептрон|нейронные сети]]. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.&lt;br /&gt;
&lt;br /&gt;
===Задача ранжирования выдачи поисковых систем===&lt;br /&gt;
Благодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. ''gradient boosting'') или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.&lt;br /&gt;
&lt;br /&gt;
==AdaBoost==&lt;br /&gt;
===Описание===&lt;br /&gt;
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.&lt;br /&gt;
&lt;br /&gt;
AdaBoost вызывает слабые классификаторы &amp;lt;tex&amp;gt;h_i^t&amp;lt;/tex&amp;gt; в цикле &amp;lt;tex&amp;gt;t = 1,...,T&amp;lt;/tex&amp;gt;. После каждого вызова обновляется распределение весов &amp;lt;tex&amp;gt;D_t&amp;lt;/tex&amp;gt;, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.&lt;br /&gt;
&lt;br /&gt;
===Описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' AdaBoost($X$, $Y$, $m$):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//Инициализируем&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 1..m '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_i^1 = \frac{1}{m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &lt;br /&gt;
   '''for''' t = 1..T '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;h_t = \arg \min\limits_{h_j \in \mathcal{H}} \epsilon_j = \sum\limits_{i=1}^{m} D_i^t〚y_i\neq h_j(x_i)〛&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$\epsilon$ {{---}} Взвешенная ошибка классификации, классификатор &amp;lt;tex&amp;gt;h_t:X\to \{-1,+1\}&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' i = 1..m '''do''':&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;Z_t&amp;lt;/tex&amp;gt; {{---}} нормализующий параметр, выбранный так, чтобы &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt; являлось распределением вероятностей, то есть &amp;lt;tex&amp;gt;\sum\limits_{i-1}^{m} D_i^{t+1} = 1&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;t=1,...,T&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
       &amp;lt;tex&amp;gt;D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &amp;lt;tex&amp;gt;H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$H(x)$ {{---}} результирующий классификатор&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' $H$&lt;br /&gt;
Выражение для обновления распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt; должно быть сконструировано таким образом, чтобы выполнялось условие:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}&amp;lt;1,\ y(i) = h_t(x_i) \\ &amp;gt;1,\ y(i) \neq h_t(x_i)\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
Таким образом, после выбора оптимального классификатора &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; для распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt;, объекты &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, которые классификатор &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt;, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.&lt;br /&gt;
&lt;br /&gt;
===Пример работы===&lt;br /&gt;
Рассмотрим набор данных, которые пометим как $-$ и $+$.&lt;br /&gt;
[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]&lt;br /&gt;
Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим&lt;br /&gt;
[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]&lt;br /&gt;
Рассмотрим результат после $2$-х итераций:&lt;br /&gt;
[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]&lt;br /&gt;
Как видно из последнего изображения, все, что находиться в &amp;quot;цветной&amp;quot; зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и &amp;quot;белые&amp;quot; зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:&lt;br /&gt;
[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]&lt;br /&gt;
Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.&lt;br /&gt;
&lt;br /&gt;
===Достоинства и недостатки===&lt;br /&gt;
'''Достоинства:'''&lt;br /&gt;
# Простота реализации;&lt;br /&gt;
# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов;&lt;br /&gt;
# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов;&lt;br /&gt;
# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.&lt;br /&gt;
'''Недостатки:'''&lt;br /&gt;
# Склонен к переобучению при наличии значительного уровня шума в данных;&lt;br /&gt;
# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.&lt;br /&gt;
&lt;br /&gt;
===Пример кода на python для scikit-learn===&lt;br /&gt;
Классификатор sklearn.ensemble.'''AdaBoostClassifier'''&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]&amp;lt;/ref&amp;gt; имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.&lt;br /&gt;
Наиболее важными являются: &lt;br /&gt;
# '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1);&lt;br /&gt;
# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше;&lt;br /&gt;
# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' AdaBoostClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
 &lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 &lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
 abc = AdaBoostClassifier(n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.8888888888888888&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим алгоритм с SVC в качестве базы:&lt;br /&gt;
 '''from''' sklearn.svm '''import''' SVC&lt;br /&gt;
 &lt;br /&gt;
 svc=SVC(probability='''True''', kernel=''''linear'''')&lt;br /&gt;
 &lt;br /&gt;
 abc = AdaBoostClassifier(base_estimator='''svc''', n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.9555555555555556&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.adaboost&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]&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 '''iris: 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''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(ada.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, ada)&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.AdaBoost&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/AdaBoost.html/ Smile, AdaBoost]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.AdaBoost;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
  '''import''' smile.validation.Accuracy;&lt;br /&gt;
  '''import''' smile.validation.ClassificationMeasure;&lt;br /&gt;
  '''import''' smile.validation.FMeasure;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  // load train and test datasets&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(0);&lt;br /&gt;
  '''var''' train    = arffParser.parse(this.getClass().getResourceAsStream(&amp;quot;train.arff&amp;quot;));&lt;br /&gt;
  '''var''' test     = arffParser.parse(this.getClass().getResouceAsStream(&amp;quot;test.arff&amp;quot;));&lt;br /&gt;
  // create adaboost classifier&lt;br /&gt;
  '''var''' forest   = new AdaBoost(train.attributes(), train.x(), train.labels(), 200, 4);&lt;br /&gt;
  // measure accuracy and F1-measure on test dataset&lt;br /&gt;
  '''var''' measures = new ClassificationMeasure[]{new FMeasure(), new Accuracy()};&lt;br /&gt;
  '''var''' results  = forest.test(test.x(), test.labels(), measures);&lt;br /&gt;
  System.out.println(Arrays.deepToString(results));&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Байесовская классификация|Байесовская классификация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[Мета-обучение|Мета-обучение]]&lt;br /&gt;
*[[Нейронные сети, перцептрон|Нейронные сети]]&lt;br /&gt;
*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
*[[CatBoost|CatBoost]]&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=AdaBoost AdaBoost] {{---}} статья на machinelearning.ru&lt;br /&gt;
# [http://cmp.felk.cvut.cz/~sochmj1/adaboost_talk.pdf AdaBoost] {{---}} презентация по AdaBoost&lt;br /&gt;
# [https://ru.coursera.org/lecture/ml-classification/example-of-adaboost-in-action-um0cX Example of AdaBoost in action] {{---}} презентация на coursera.org&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2) Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Ансамбли]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81&amp;diff=70878</id>
		<title>Дерево решений и случайный лес</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81&amp;diff=70878"/>
				<updated>2019-04-08T14:05:05Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Дерево решений {{---}} логический алгоритм классификации, решающий задачи классификации и регрессии. Представляет собой объединение логических условий в структуру дерева.&lt;br /&gt;
&lt;br /&gt;
==Дерево решений==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1. &lt;br /&gt;
|neat = &lt;br /&gt;
|definition=&lt;br /&gt;
'''Дерево решений''' (англ. ''decision tree, DT'') {{---}} алгоритм классификации &amp;lt;tex&amp;gt;a(x) = (V_{внутр}, v_0, V_{лист}, S_v, \beta_v)&amp;lt;/tex&amp;gt;, задающийся деревом (связным ациклическим графом), где:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V = V_{внутр} \cup V_{лист} &amp;lt;/tex&amp;gt; {{---}} множество вершин , &amp;lt;tex&amp;gt;v_0 \in V&amp;lt;/tex&amp;gt; {{---}} корень дерева;&lt;br /&gt;
* &amp;lt;tex&amp;gt; S_v : D_v \rightarrow V_v &amp;lt;/tex&amp;gt; {{---}} функция перехода по значению предиката в множество детей вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \beta_v : X \rightarrow D_v &amp;lt;/tex&amp;gt; {{---}} предикат ветвления, &amp;lt;tex&amp;gt;v \in V_{внутр}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|D_v| &amp;lt; \infty&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Для листьев &amp;lt;tex&amp;gt;v \in V_{лист}&amp;lt;/tex&amp;gt; определена метка класса &amp;lt;tex&amp;gt;y_v \in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Бинарное дерево решений''' {{---}}  частный случай дерева решений, для которого &amp;lt;tex&amp;gt; D_v = \{0,1\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:BinDT.jpg |300px|thumb|right|Классификация объекта &amp;lt;tex&amp;gt; x \in X &amp;lt;/tex&amp;gt; бинарным решающим деревом]]&lt;br /&gt;
&lt;br /&gt;
 '''function''' classify(x):&lt;br /&gt;
   &amp;lt;tex&amp;gt;v = v_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\beta_v(x) = 1 &amp;lt;/tex&amp;gt; &lt;br /&gt;
      &amp;lt;tex&amp;gt;v := R_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''else'''&lt;br /&gt;
      &amp;lt;tex&amp;gt;v := L_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информативность ветвления===&lt;br /&gt;
Для того, чтобы оценивать качество разбиения объектов по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, введем понятие ''информационного выигрыша'' разбиения. &amp;lt;br&amp;gt;&lt;br /&gt;
Сначала оценим распределение значений классов объектов внутри каждого множества из разбиения, введя понятие ''меры неопределенности распределения''.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Частотная оценка вероятности класса &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в вершине &amp;lt;tex&amp;gt;v \in V_{внутр}&amp;lt;/tex&amp;gt; ''': &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;p_y = P(y | x \in U) = \frac{1}{|U|} \sum\nolimits_{x_i \in U}[y_i = y]&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Мера неопределенности (англ. ''impurity'') распределения &amp;lt;tex&amp;gt;p_y&amp;lt;/tex&amp;gt;''': &amp;lt;br&amp;gt;&lt;br /&gt;
* минимальна, когда &amp;lt;tex&amp;gt;p_y \in \{0,1\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* максимальна, когда &amp;lt;tex&amp;gt;p_y = \frac{1}{|Y|}&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* не зависит от перенумерации классов&lt;br /&gt;
&amp;lt;tex&amp;gt;Ф(U) = \sum\nolimits_{y \in Y} p_y L(p_y) = \frac{1}{|U|} \sum\nolimits_{x_i \in U}L(P(y_i | x_i \in U)) \rightarrow min&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt; где &amp;lt;tex&amp;gt;L(p)&amp;lt;/tex&amp;gt; убывает и &amp;lt;tex&amp;gt;L(1) = 0&amp;lt;/tex&amp;gt;, например: &amp;lt;tex&amp;gt;-log_2(p)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1 - p&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1 - p^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Примерами мер неопределенности распределения являются: &lt;br /&gt;
* Энтропия: &amp;lt;tex&amp;gt;Ф(U) = -\sum\limits_{i}^N p_i log_2p_i&amp;lt;/tex&amp;gt;, определяется для каждого множества из разбиения, &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; {{---}} количество возможных классов, и &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; {{---}} вероятность объекта принадлежать &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt;-ому классу.&lt;br /&gt;
* Критерий Джини: &amp;lt;tex&amp;gt;Ф(U) = \sum\nolimits_{i != j}p_i p_j = \sum\nolimits_{i}p_i*(1-p_i)&amp;lt;/tex&amp;gt;, максимизацию этого критерия можно интерпретировать как максимизацию числа пар объектов одного класса, оказавшихся после разбиения в одном множестве. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь определим суммарную ''неопределенность распределения'' в разбиении.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Неопределенность распределения &amp;lt;tex&amp;gt;P(y_i | x_i \in U_{\beta(x_i)})&amp;lt;/tex&amp;gt; после ветвления вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; и разбиения &amp;lt;tex&amp;gt;U = \bigcup_{k \in D_v} U_k&amp;lt;/tex&amp;gt;''': &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Ф(U_0, ... ,U_{D_v}) = \frac{1}{|U|} \sum\nolimits_{k \in D_v} \sum\nolimits_{x_i \in U_k}L(P(y_i | x_i \in U_k)) = \sum\nolimits_{k \in D_v} \frac{|U_k|}{|U|}Ф(U_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
''Информационный выигрыш'' от разбиения определяется как изменение неопределенности в системе.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Информационный выигрыш от разбиения по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;''' &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Gain(\beta, U) = Ф(U) - Ф(U_1, ... ,U_{|D_v|}) = Ф(U) - \sum\nolimits_{k \in D_v} \frac{|U_k|}{|U|}Ф(U_k) \rightarrow max_{\beta \in B} &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Рекурсивный алгоритм построения бинарного дерева решений ID3 ===&lt;br /&gt;
Покажем идею построения дерева решения на частном случае бинарного дерева. Алгоритм &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt; (англ. ''Induction of Decision Tree'') заключается в последовательном дроблении выборки на две части до тех пор, пока в каждой части не окажутся объекты только одного класса. Разделение производится по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, который выбирается из множества элементарных предикатов. На практике в качестве элементарных предикатов чаще всего берут простые пороговые условия вида &amp;lt;tex&amp;gt;\beta(x) = [f_j(x) &amp;gt;= d_j]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;Проще всего записать этот алгоритм в виде рекурсивной процедуры &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt;, которая строит дерево по заданной подвыборке &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; и возвращает его корневую вершину. &lt;br /&gt;
&lt;br /&gt;
 1:'''function''' ID3(&amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;):&lt;br /&gt;
 2:   '''if''' &amp;lt;tex&amp;gt;for all&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;u \in U&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;y_u = y&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// создать листовую вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; c меткой класса &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 3:      v = createLeafVertex(&amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 4:      '''return''' v&lt;br /&gt;
      &amp;lt;font color=green&amp;gt;// найти предикат с максимальным информационным выигрышом &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;\beta= \mathrm{arg}\max_{\beta\in B} &amp;lt;/tex&amp;gt; Gain(&amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;)&lt;br /&gt;
      &amp;lt;font color=green&amp;gt;// разбить выборку на две части &amp;lt;tex&amp;gt;U = U_0 \cup U_1&amp;lt;/tex&amp;gt; по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 5:   &amp;lt;tex&amp;gt;U_0 := \{x \in U: \beta(x) = 0\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 6:   &amp;lt;tex&amp;gt;U_1 := \{x \in U: \beta(x) = 1\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 7:   '''if''' &amp;lt;tex&amp;gt;U_0 = \emptyset&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;U_1 = \emptyset&amp;lt;/tex&amp;gt; &lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// найти класс, в котором находится большинство объектов из &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 8:      &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; = majorClass(&amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 9:      v = createLeafVertex(&amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
      '''else'''&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// создать внутреннюю вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 10:     v = createVertex()&lt;br /&gt;
 11:     &amp;lt;tex&amp;gt;\beta_v = \beta&amp;lt;/tex&amp;gt;&lt;br /&gt;
 12:     &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;U_0&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 13:     &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;U_1&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 14:  '''return''' &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Редукция решающих деревьев ==&lt;br /&gt;
Суть редукции (англ. ''pruning'') состоит в удалении поддеревьев, имеющих недостаточную статистическую надёжность. При этом дерево перестаёт безошибочно классифицировать обучающую выборку, зато качество классификации новых объектов, как правило, улучшается. Рассмотрим наиболее простые варианты редукции.&lt;br /&gt;
&lt;br /&gt;
===Предредукция===&lt;br /&gt;
Предредукция (англ. ''pre-pruning'') или критерий раннего останова досрочно прекращает дальнейшее ветвление в вершине дерева, если информативность &amp;lt;tex&amp;gt;I(\beta, U)&amp;lt;/tex&amp;gt; для всех возможных предикатов &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; не дотягивает до заданного порогового значения &amp;lt;tex&amp;gt;I_0&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Для этого на шаге 8 алгоритма &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt; условие &amp;lt;tex&amp;gt;U_0 = \emptyset&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;U_1 = \emptyset&amp;lt;/tex&amp;gt;  заменяется условием &amp;lt;tex&amp;gt;I(\beta, U) &amp;lt;= I_0 &amp;lt;/tex&amp;gt;. Порог &amp;lt;tex&amp;gt;I_0 &amp;lt;/tex&amp;gt; является управляющим параметром метода. &amp;lt;br&amp;gt;&lt;br /&gt;
Предредукция считается не самым эффективным способом избежать переобучения, так как жадное ветвление по-прежнему остаётся глобально неоптимальным. Более эффективной считается cтратегия постредукции.&lt;br /&gt;
&lt;br /&gt;
===Постредукция===&lt;br /&gt;
Постредукция (англ. ''post-pruning'') просматривает все внутренние вершины дерева и заменяет отдельные вершины либо одной из дочерних вершин (при этом вторая дочерняя удаляется), либо терминальной вершиной. Процесс замен продолжается до тех&lt;br /&gt;
пор, пока в дереве остаются вершины, удовлетворяющие критерию замены. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''Критерием замены'' является сокращение числа ошибок на контрольной выборке, отобранной заранее, и не участвовавшей в обучении дерева. Стандартная рекомендация — оставлять в контроле около 30% объектов. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Для реализации постредукции контрольная выборка &amp;lt;tex&amp;gt;X^k&amp;lt;/tex&amp;gt; пропускается через&lt;br /&gt;
построенное дерево. При этом в каждой внутренней вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; запоминается подмножество &amp;lt;tex&amp;gt;S_v \subseteq X_k&amp;lt;/tex&amp;gt; попавших в неё контрольных объектов. Если &amp;lt;tex&amp;gt;S_v = \emptyset &amp;lt;/tex&amp;gt;, то вершина &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; считается ненадёжной и заменяется терминальной по ''мажоритарному правилу'': &amp;lt;br&amp;gt;&lt;br /&gt;
в качестве &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; берётся тот класс, объектов которого больше всего в обучающей подвыборке &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;, пришедшей в вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Затем для каждой внутренней вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; вычисляется число ошибок, полученных при классификации выборки &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; следующими способами: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r(v)&amp;lt;/tex&amp;gt; — классификация поддеревом, растущим из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_L(v)&amp;lt;/tex&amp;gt; — классификация поддеревом левой дочерней вершины &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_R(v)&amp;lt;/tex&amp;gt; — классификация поддеревом правой дочерней вершины &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_c(v)&amp;lt;/tex&amp;gt; — отнесение всех объектов выборки &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; к классу &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Эти величины сравниваются, и в зависимости от того, какая из них оказалась&lt;br /&gt;
минимальной, принимается, соответственно, одно из четырёх решений: &amp;lt;br&amp;gt;&lt;br /&gt;
* сохранить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; поддеревом левой дочерней вершины &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; поддеревом правой дочерней вершины &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; терминальной вершиной класса &amp;lt;tex&amp;gt;y_v = \mathrm{arg}\min_{y\in Y}r_c(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы построения деревьев решения ==&lt;br /&gt;
Недостатки рассмотренного алгоритма ID3: &lt;br /&gt;
* Применим только для дискретных значений признаков;&lt;br /&gt;
* Переобучение;&lt;br /&gt;
* На каждом шаге решение принимается по одному атрибуту.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм [https://en.wikipedia.org/wiki/Predictive_analytics#Classification_and_regression_trees_.28CART.29 CART] (англ. ''Classification And Regression Trees'')===&lt;br /&gt;
* В отличие от ID3 работает и с непрерывными значениями признаков: на каждом шаге построения дерева последовательно сравнивает все возможные разбиения для всех атрибутов и выбирает наилучший атрибут и наилучшее разбиение для него. Разбивает объекты на две части;&lt;br /&gt;
* Использует редукцию для избежания переобучения;&lt;br /&gt;
* Обрабатывает пропущенные или аномальные значения признаков.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм [https://en.wikipedia.org/wiki/C4.5_algorithm C4.5] ===&lt;br /&gt;
* Также работает и с непрерывными значениями признаков: на каждом шаге построения дерева выбирает правило разбиения по одному из признаков. Разбивает объекты на несколько частей по этому правилу, рекурсивно запускается из полученных подмножеств;&lt;br /&gt;
* Использует редукцию для избежания переобучения;&lt;br /&gt;
* Обрабатывает пропущенные или аномальные значения признаков.&lt;br /&gt;
&lt;br /&gt;
== Случайный лес ==&lt;br /&gt;
Случайный лес {{---}} один из примеров объединения классификаторов в [[Виды_ансамблей|ансамбль]]. &amp;lt;br&amp;gt;&lt;br /&gt;
Алгоритм построения случайного леса, состоящего из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; деревьев на основе обучающей выборки &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; такой:&lt;br /&gt;
 '''for''' (n: 1,...,N):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// сгенерировать выборку &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; c помощью [[Виды_ансамблей#Бутстрэп|бутстрэпа]]&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; = bootstrap(&amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// построить решающее дерево &amp;lt;tex&amp;gt;t_n&amp;lt;/tex&amp;gt; по выборке &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;t_n&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итоговый классификатор {{---}} &amp;lt;tex&amp;gt;a(x) = \frac{1}{N} \sum\limits_{i = 1}^{N} t_i(x)&amp;lt;/tex&amp;gt;. Для задачи классификации мы выбираем решение по большинству результатов, выданных классификаторами, а в задаче регрессии {{---}} по их среднему значению. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, случайный лес {{---}} бэггинг над решающими деревьями, при обучении которых для каждого разбиения признаки выбираются из некоторого случайного подмножества признаков.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Примеры на языке Python===&lt;br /&gt;
*Для решения задач классификации и регрессии используют [https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier DecisionTreeClassifier], [https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html#sklearn.tree.DecisionTreeRegressor DecisionTreeRegressor];&lt;br /&gt;
&lt;br /&gt;
*В '''sklearn.ensemble''' также представлены методы классификации, основанные на ансамблях, в том числе: [https://scikit-learn.org/stable/modules/ensemble.html#bagging бэггинг] и [https://scikit-learn.org/stable/modules/ensemble.html#forest случайный лес], которые были описаны выше. &lt;br /&gt;
&amp;lt;br&amp;gt;Так, в этом примере создается бэггинг ансамбль из классификаторов '''KNeighborsClassifier''', каждый из которых обучен на случайных подмножествах из 50% объектов из обучающей выборки, и 50% случайно выбранных признаков.&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' BaggingClassifier&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
 bagging = BaggingClassifier(KNeighborsClassifier(), max_samples=0.5, max_features=0.5)&lt;br /&gt;
&lt;br /&gt;
Пример использования классификатора на случайном лесе:&lt;br /&gt;
Полную версию кода можно найти [https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html#sphx-glr-download-auto-examples-classification-plot-classifier-comparison-py| здесь]&lt;br /&gt;
 '''from''' sklearn '''import''' RandomForestClassifier&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_classification&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// сгенерируем случайную обучающую выборку с классификацией по n_classes классам&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,&lt;br /&gt;
                           random_state=1, n_clusters_per_class=1, n_classes=2)&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// разбиваем выборку на обучающую и тестовую &amp;lt;/font&amp;gt;&lt;br /&gt;
 X = StandardScaler().fit_transform(X)&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// создадим классификатор на случайном лесе, состоящим из n_estimators деревьев&amp;lt;/font&amp;gt;&lt;br /&gt;
 RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 score = clf.score(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
Результат классификации показан на рисунке. &lt;br /&gt;
&lt;br /&gt;
[[Файл:RFC.png |800px|thumb|center|Классификация RandomForestClassifier. Кружочками изображены объекты обучающей выборки, крестиками тестовой выборки. Справа цветом выделены границы принятия решений, в правом нижнем углу {{---}} значение accuracy.]]&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.cart&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#cart Smile, Decision Trees]&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 '''iris: 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''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''dt: DecisionTree = cart(x, y, 1000)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(dt.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, dt)&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.trees.RandomForest&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/trees/RandomForest.html Weka, Random Forest]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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.Evaluation;&lt;br /&gt;
  '''import''' weka.classifiers.trees.RandomForest;&lt;br /&gt;
&lt;br /&gt;
  // read dataset&lt;br /&gt;
  '''var''' trainingDataSet = getDataSet(...);&lt;br /&gt;
  '''var''' testingDataSet = getDataSet(...);&lt;br /&gt;
  // create random forest classifier&lt;br /&gt;
  '''var''' forest = new RandomForest();&lt;br /&gt;
  forest.setMaxDepth(15);&lt;br /&gt;
  forest.setNumFeatures(2);&lt;br /&gt;
  forest.buildClassifier(trainingDataSet);&lt;br /&gt;
  // evaluate the model on test dataset and print summary&lt;br /&gt;
  '''var''' eval = new Evaluation(trainingDataSet);&lt;br /&gt;
  eval.evaluateModel(forest, testingDataSet);&lt;br /&gt;
  System.out.println(eval.toSummaryString());&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Виды ансамблей]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/images/3/3e/Voron-ML-Logic.pdf Логические алгоритмы классификации] {{---}} Лекция К. В. Воронцова&lt;br /&gt;
# [https://medium.com/open-machine-learning-course/open-machine-learning-course-topic-5-ensembles-of-algorithms-and-random-forest-8e05246cbba7 Случайный лес] {{---}} статья на Medium, Yury Kashnitskiy&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/tree.html Деревья решений] {{---}} scikit-learn.org&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/ensemble.html Ансамбли классификаторов] — scikit-learn.org.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация и регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</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=70877</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=70877"/>
				<updated>2019-04-08T14:04:20Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &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;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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>91.215.123.110</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=70876</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=70876"/>
				<updated>2019-04-08T14:03:56Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &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;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=70875</id>
		<title>Байесовская классификация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=70875"/>
				<updated>2019-04-08T14:03:08Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Вероятностная постановка задачи классификации ==&lt;br /&gt;
&lt;br /&gt;
Пусть $X$ множество объектов, $Y$ конечное множество имён классов, &lt;br /&gt;
множество $X \times Y$ является вероятностным пространством с плотностью распределения $p(x,y)=P(y)p(x|y)$.&lt;br /&gt;
Вероятности появления объектов каждого из классов $P_y=P(y)$ называются ''априорными вероятностями классов''.&lt;br /&gt;
Плотности распределения $p_y(x)=p(x|y)$ называются ''функциями правдоподобия классов''.&lt;br /&gt;
&lt;br /&gt;
'''Вероятностная постановка задачи классификации разделяется на две независимые подзадачи:'''&lt;br /&gt;
* Имеется простая выборка $X^l=(x_i, y_i)^l_{i=1}$ из неизвестного распределения $p(x,y)=P_yp_y(x)$. Требуется построить ''эмпирические оценки'' априорных вероятностей $P'_y$ и функций правдоподобия $p'_y(x)$ для каждого из классов $y \in Y$.&lt;br /&gt;
* По известным плотностям распределения $p_y(x)$ и априорным вероятностям $P_y$ всех классов $y \in Y$ построить алгоритм $a(x)$, минимизирующий вероятность ошибочной классификации.&lt;br /&gt;
&lt;br /&gt;
Априорные вероятности классов $P_y$ можно оценить согласно закону больших чисел, &lt;br /&gt;
тогда частота появления объектов каждого из классов равна $P'_y=\frac{l_y}{l}$ где $l_y=|X^l_y|, y \in Y$&lt;br /&gt;
сходится по вероятности к $P_y$ при $l_y \to \infty$. Чем больше длина выборки, тем точнее выборочная оценка $P'_y$.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оптимальный байесовский классификатор ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольный алгоритм $a:X \to Y$.&lt;br /&gt;
Он разбивает множество $X$ на не пересекающиеся области $A_y=\{x \in X | a(x) = y\}, y \in Y$.&lt;br /&gt;
Вероятность того,что появится объект класса $y$ и алгоритм $a$ отнесёт его к классу $s$, равна $P_yP(A_s|y)$.&lt;br /&gt;
Каждой паре $(y,s) \in Y \times Y$ поставим в соответствие величину потери $\lambda_{ys}$ &lt;br /&gt;
при отнесении объекта класса $y$ к классу $s$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Функционал среднего риска''' {{---}} ожидаемая величина потери при классификации объектов алгоритмом $a$:&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a) = \displaystyle\sum_{y \in Y}\sum_{s \in Y}\lambda_{ys}P_yP(A_s|y) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
об оптимальности байесовского классификатора&lt;br /&gt;
|statement=&lt;br /&gt;
Если известны априорные вероятности $P_y$ и функции правдоподобия $p_y(x)$, &lt;br /&gt;
то минимум среднего риска $R(a)$ достигается алгоритмом&lt;br /&gt;
:&amp;lt;tex&amp;gt; a(x) = \displaystyle\arg\min_{s \in Y}\sum_{y \in Y}\lambda_{ys}P_yp_y(x) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Для произвольного $t \in Y$ запишем функционал среднего риска:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a)=\displaystyle\sum_{y \in Y}\sum_{s \in Y}\lambda_{ys}P_yP(A_s|y) = \sum_{y \in Y}\lambda_{yt}P_yP(A_t|y) + \sum_{s \in Y\setminus\{t\} }\sum_{y \in Y}\lambda_{ys}P_yP(A_s|y).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Применив формулу полной вероятности, $P(A_t \mid y) = 1 −\displaystyle\sum_{ s \in Y \setminus \{t\} }P(A_s \mid y)$, получим:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a) = \displaystyle\sum_{y \in Y}\lambda_{yt}P_y + \sum_{ s \in Y \setminus \{t\} } \sum_{y \in Y} (\lambda_{ys} - \lambda_{yt})P_yP(A_s|y) = &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; = const(a) + \displaystyle\sum_{ s \in Y \setminus \{t\} } \int_{A_s}\sum_{y \in Y} (\lambda_{ys}−\lambda_{yt})P_yp_y(x)dx.  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём для сокращения записи обозначение &lt;br /&gt;
$g_s(x) = \displaystyle\sum_{y \in Y}\lambda_{ys}P_yp_y(x)$, тогда &lt;br /&gt;
$R(a) = const(a) + \displaystyle\sum_{ s \in Y \setminus \{t\} }\int_{A_s}(g_s(x)−g_t(x))dx$.&lt;br /&gt;
&lt;br /&gt;
Минимум интегрла достигается, когда $A_s$ совпадает с областью неположительности подынтегрального выражения. &lt;br /&gt;
:&amp;lt;tex&amp;gt; A_s=\{x \in X \mid g_s(x) \leq g_t(x), \forall t \in Y, t \leq s\}.  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С другой стороны, $A_s=\{x \in X \mid a(x) = s\}$. Значит, $a(x) = s$ тогда и только тогда, когда &lt;br /&gt;
:$s= \displaystyle\arg\min_{t \in Y}g_t(x)$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Наивный байесовский классификатор ==&lt;br /&gt;
&lt;br /&gt;
Допустим, что объекты $x \in X$ описываются $n$ числовыми признаками $f_j:X→R,j= 1,...,n$. &lt;br /&gt;
Обозначим через $x = (\xi_1,...,\xi_n)$ произвольный элемент пространства объектов $X=R^n$, где $\xi_j=f_j(x)$.&lt;br /&gt;
&lt;br /&gt;
Предположим, что признаки $f_1(x),...,f_n(x)$ являются независимыми случайными величинами. &lt;br /&gt;
Следовательно, функции правдоподобия классов представимы в виде:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; p_y(x) = \displaystyle\prod^n_{i=1}p_{yi}(\xi_i) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где $p_{yj}(\xi_j)$ плотность распределения значений $j$-го признака для класса $y$.&lt;br /&gt;
Алгоритмы классификации исходящие из этого предположения, называются ''наивными байесовскими''.&lt;br /&gt;
&lt;br /&gt;
Подставим эмпирические оценки одномерных плотностей в байесовский классификатор. Получим алгоритм:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; a(x) = \displaystyle\arg\max_{y \in Y}(\ln\lambda_yP'_y + \sum^n_{j=1}\ln p'_{yj}(\xi_j)).  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основные его преимущества {{---}} простота реализации и низкие вычислительные затраты при обучении и классификации. &lt;br /&gt;
В тех редких случаях, когда признаки почти независимы, наивный байесовский классификатор близок к оптимальному.&lt;br /&gt;
Достаточно малое количество данных необходимо для обучения, оценки параметров и классификации. &lt;br /&gt;
&lt;br /&gt;
Основной его недостаток {{---}} низкое качество классификации в общем случае. &lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
&lt;br /&gt;
Из-за своего низкого качества классификации наивный байесовскими классификатор в основном он используется либо как эталон при экспериментальном сравнении алгоритмов, &lt;br /&gt;
либо как элементарный строительный блок в алгоритмических композициях.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим частое применение байесовского классификатора к задаче классификации документов по их содержимому, &lt;br /&gt;
а именно к классификации электронных писем на два класса {{---}} спам ($S$) и не-спам ($\displaystyle \neg S$),&lt;br /&gt;
предполагая что вероятность слов в тексте не зависит друг от друга:&lt;br /&gt;
&lt;br /&gt;
Программные спам-фильтры, построенные на принципах наивного байесовского классификатора, делают «наивное» предположение о том, что события, &lt;br /&gt;
соответствующие наличию того или иного слова в электронном письме или сообщении, являются независимыми по отношению друг к другу. &lt;br /&gt;
Это упрощение в общем случае является неверным для естественных языков:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; P(a\ very\ close\ game) = P(a) \times P(very) \times P(close) \times P(game) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Исходя из такого предположения, для решения задачи классификации сообщений лишь на 2 класса: &lt;br /&gt;
$S$ (спам) и $H = \neg S$ («хэм», то есть не спам) из теоремы Байеса можно вывести следующую формулу оценки вероятности «спамовости» всего сообщения $D$, &lt;br /&gt;
содержащего слова $W_1, W_2, ... W_N$:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\displaystyle p(S\mid D) = p(S\mid W_1, W_2, ... W_N) = \frac{p(W_1, W_2, ... W_N\mid S) \cdot p(S)}{p(W_1, W_2, ... W_N)} = &amp;lt;/tex&amp;gt; [так как $W_i$ предполагаются независимыми] &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;= \displaystyle\frac{\prod_{i} p(W_i\mid S) \cdot p(S)}{p(W_1, W_2, ... W_N)} = \frac{\prod_{i}p(S\mid W_i)}{\prod_i(p(S\mid W_i)) + \left(\frac{p(\neg S)}{p(S)}\right)^{1-N} \cdot \prod_i p(\neg S\mid W_i)} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат $p$ обычно сравнивают с некоторым порогом (например, $0.5$), чтобы решить, является ли сообщение спамом или нет. Если $p$ ниже, чем порог, сообщение рассматривают как вероятный «ham», иначе его рассматривают как вероятный спам.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\displaystyle\ln{p(S\mid D)\over p(\neg S\mid D)} &amp;gt; h&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB GaussianNB] реализует наивный байесовский классификатор в предположении что изначальное распределение было гауссовым:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; P(x_i \mid y) = \displaystyle\frac{1}{\sqrt{2\pi\sigma^2_y}}\exp(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.metrics '''import''' f1_score, accuracy_score&lt;br /&gt;
 '''from''' sklearn.naive_bayes '''import''' GaussianNB&lt;br /&gt;
 iris = datasets.load_iris()&lt;br /&gt;
 gnb = GaussianNB()&lt;br /&gt;
 pred = gnb.fit(iris.data, iris.target).predict(iris.data)&lt;br /&gt;
 accuracy = accuracy_score(iris.target, pred)&lt;br /&gt;
 f1 = f1_score(iris.target, pred, average=&amp;quot;micro&amp;quot;)&lt;br /&gt;
 '''print'''(''&amp;quot;accruracy:&amp;quot;'', accuracy, ''&amp;quot;f1:&amp;quot;'', f1)&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 accruracy: 0.96 f1: 0.96&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.bayes.NaiveBayes&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/bayes/NaiveBayes.html/ Weka, Naive Bayes]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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.bayes.NaiveBayes;&lt;br /&gt;
  '''import''' weka.classifiers.evaluation.Evaluation;&lt;br /&gt;
  '''import''' weka.core.converters.ConverterUtils;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  // load dataset&lt;br /&gt;
  '''var''' source = new DataSource(&amp;quot;/iris.arff&amp;quot;);&lt;br /&gt;
  '''var''' dataset = source.getDataSet();	&lt;br /&gt;
  //set class index to the last attribute&lt;br /&gt;
  dataset.setClassIndex(dataset.numAttributes() - 1);&lt;br /&gt;
  //create and build the classifier&lt;br /&gt;
  '''var''' nb = new NaiveBayes();&lt;br /&gt;
  nb.buildClassifier(dataset);&lt;br /&gt;
  // cross validate model&lt;br /&gt;
  var eval = new Evaluation(dataset);&lt;br /&gt;
  eval.crossValidateModel(nb, dataset, 10, new Random(41));&lt;br /&gt;
  System.out.println(&amp;quot;Estimated Accuracy: &amp;quot;+ Double.toString(eval.pctCorrect()));&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Байесовские сети|Байесовские сети]]&lt;br /&gt;
*[[:Независимые события|Независимые события]]&lt;br /&gt;
*[[:Формула Байеса|Формула Байеса]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B1%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%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 Википедия {{---}} Наивный байесовский классификатор] &lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/6/6d/Voron-ML-1.pdf К.В.Воронцов Математические методы обучения по прецедентам]&lt;br /&gt;
* [https://scikit-learn.org/stable/modules/naive_bayes.html Scikit-learn 1.9. Supervised learning - Naive Bayes]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация и регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=70874</id>
		<title>Байесовская классификация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=70874"/>
				<updated>2019-04-08T14:01:38Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Вероятностная постановка задачи классификации ==&lt;br /&gt;
&lt;br /&gt;
Пусть $X$ множество объектов, $Y$ конечное множество имён классов, &lt;br /&gt;
множество $X \times Y$ является вероятностным пространством с плотностью распределения $p(x,y)=P(y)p(x|y)$.&lt;br /&gt;
Вероятности появления объектов каждого из классов $P_y=P(y)$ называются ''априорными вероятностями классов''.&lt;br /&gt;
Плотности распределения $p_y(x)=p(x|y)$ называются ''функциями правдоподобия классов''.&lt;br /&gt;
&lt;br /&gt;
'''Вероятностная постановка задачи классификации разделяется на две независимые подзадачи:'''&lt;br /&gt;
* Имеется простая выборка $X^l=(x_i, y_i)^l_{i=1}$ из неизвестного распределения $p(x,y)=P_yp_y(x)$. Требуется построить ''эмпирические оценки'' априорных вероятностей $P'_y$ и функций правдоподобия $p'_y(x)$ для каждого из классов $y \in Y$.&lt;br /&gt;
* По известным плотностям распределения $p_y(x)$ и априорным вероятностям $P_y$ всех классов $y \in Y$ построить алгоритм $a(x)$, минимизирующий вероятность ошибочной классификации.&lt;br /&gt;
&lt;br /&gt;
Априорные вероятности классов $P_y$ можно оценить согласно закону больших чисел, &lt;br /&gt;
тогда частота появления объектов каждого из классов равна $P'_y=\frac{l_y}{l}$ где $l_y=|X^l_y|, y \in Y$&lt;br /&gt;
сходится по вероятности к $P_y$ при $l_y \to \infty$. Чем больше длина выборки, тем точнее выборочная оценка $P'_y$.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Оптимальный байесовский классификатор ==&lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольный алгоритм $a:X \to Y$.&lt;br /&gt;
Он разбивает множество $X$ на не пересекающиеся области $A_y=\{x \in X | a(x) = y\}, y \in Y$.&lt;br /&gt;
Вероятность того,что появится объект класса $y$ и алгоритм $a$ отнесёт его к классу $s$, равна $P_yP(A_s|y)$.&lt;br /&gt;
Каждой паре $(y,s) \in Y \times Y$ поставим в соответствие величину потери $\lambda_{ys}$ &lt;br /&gt;
при отнесении объекта класса $y$ к классу $s$.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Функционал среднего риска''' {{---}} ожидаемая величина потери при классификации объектов алгоритмом $a$:&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a) = \displaystyle\sum_{y \in Y}\sum_{s \in Y}\lambda_{ys}P_yP(A_s|y) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
об оптимальности байесовского классификатора&lt;br /&gt;
|statement=&lt;br /&gt;
Если известны априорные вероятности $P_y$ и функции правдоподобия $p_y(x)$, &lt;br /&gt;
то минимум среднего риска $R(a)$ достигается алгоритмом&lt;br /&gt;
:&amp;lt;tex&amp;gt; a(x) = \displaystyle\arg\min_{s \in Y}\sum_{y \in Y}\lambda_{ys}P_yp_y(x) &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Для произвольного $t \in Y$ запишем функционал среднего риска:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a)=\displaystyle\sum_{y \in Y}\sum_{s \in Y}\lambda_{ys}P_yP(A_s|y) = \sum_{y \in Y}\lambda_{yt}P_yP(A_t|y) + \sum_{s \in Y\setminus\{t\} }\sum_{y \in Y}\lambda_{ys}P_yP(A_s|y).&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Применив формулу полной вероятности, $P(A_t \mid y) = 1 −\displaystyle\sum_{ s \in Y \setminus \{t\} }P(A_s \mid y)$, получим:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; R(a) = \displaystyle\sum_{y \in Y}\lambda_{yt}P_y + \sum_{ s \in Y \setminus \{t\} } \sum_{y \in Y} (\lambda_{ys} - \lambda_{yt})P_yP(A_s|y) = &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; = const(a) + \displaystyle\sum_{ s \in Y \setminus \{t\} } \int_{A_s}\sum_{y \in Y} (\lambda_{ys}−\lambda_{yt})P_yp_y(x)dx.  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Введём для сокращения записи обозначение &lt;br /&gt;
$g_s(x) = \displaystyle\sum_{y \in Y}\lambda_{ys}P_yp_y(x)$, тогда &lt;br /&gt;
$R(a) = const(a) + \displaystyle\sum_{ s \in Y \setminus \{t\} }\int_{A_s}(g_s(x)−g_t(x))dx$.&lt;br /&gt;
&lt;br /&gt;
Минимум интегрла достигается, когда $A_s$ совпадает с областью неположительности подынтегрального выражения. &lt;br /&gt;
:&amp;lt;tex&amp;gt; A_s=\{x \in X \mid g_s(x) \leq g_t(x), \forall t \in Y, t \leq s\}.  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С другой стороны, $A_s=\{x \in X \mid a(x) = s\}$. Значит, $a(x) = s$ тогда и только тогда, когда &lt;br /&gt;
:$s= \displaystyle\arg\min_{t \in Y}g_t(x)$.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Наивный байесовский классификатор ==&lt;br /&gt;
&lt;br /&gt;
Допустим, что объекты $x \in X$ описываются $n$ числовыми признаками $f_j:X→R,j= 1,...,n$. &lt;br /&gt;
Обозначим через $x = (\xi_1,...,\xi_n)$ произвольный элемент пространства объектов $X=R^n$, где $\xi_j=f_j(x)$.&lt;br /&gt;
&lt;br /&gt;
Предположим, что признаки $f_1(x),...,f_n(x)$ являются независимыми случайными величинами. &lt;br /&gt;
Следовательно, функции правдоподобия классов представимы в виде:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; p_y(x) = \displaystyle\prod^n_{i=1}p_{yi}(\xi_i) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где $p_{yj}(\xi_j)$ плотность распределения значений $j$-го признака для класса $y$.&lt;br /&gt;
Алгоритмы классификации исходящие из этого предположения, называются ''наивными байесовскими''.&lt;br /&gt;
&lt;br /&gt;
Подставим эмпирические оценки одномерных плотностей в байесовский классификатор. Получим алгоритм:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; a(x) = \displaystyle\arg\max_{y \in Y}(\ln\lambda_yP'_y + \sum^n_{j=1}\ln p'_{yj}(\xi_j)).  &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Основные его преимущества {{---}} простота реализации и низкие вычислительные затраты при обучении и классификации. &lt;br /&gt;
В тех редких случаях, когда признаки почти независимы, наивный байесовский классификатор близок к оптимальному.&lt;br /&gt;
Достаточно малое количество данных необходимо для обучения, оценки параметров и классификации. &lt;br /&gt;
&lt;br /&gt;
Основной его недостаток {{---}} низкое качество классификации в общем случае. &lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
&lt;br /&gt;
Из-за своего низкого качества классификации наивный байесовскими классификатор в основном он используется либо как эталон при экспериментальном сравнении алгоритмов, &lt;br /&gt;
либо как элементарный строительный блок в алгоритмических композициях.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим частое применение байесовского классификатора к задаче классификации документов по их содержимому, &lt;br /&gt;
а именно к классификации электронных писем на два класса {{---}} спам ($S$) и не-спам ($\displaystyle \neg S$),&lt;br /&gt;
предполагая что вероятность слов в тексте не зависит друг от друга:&lt;br /&gt;
&lt;br /&gt;
Программные спам-фильтры, построенные на принципах наивного байесовского классификатора, делают «наивное» предположение о том, что события, &lt;br /&gt;
соответствующие наличию того или иного слова в электронном письме или сообщении, являются независимыми по отношению друг к другу. &lt;br /&gt;
Это упрощение в общем случае является неверным для естественных языков:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; P(a\ very\ close\ game) = P(a) \times P(very) \times P(close) \times P(game) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Исходя из такого предположения, для решения задачи классификации сообщений лишь на 2 класса: &lt;br /&gt;
$S$ (спам) и $H = \neg S$ («хэм», то есть не спам) из теоремы Байеса можно вывести следующую формулу оценки вероятности «спамовости» всего сообщения $D$, &lt;br /&gt;
содержащего слова $W_1, W_2, ... W_N$:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\displaystyle p(S\mid D) = p(S\mid W_1, W_2, ... W_N) = \frac{p(W_1, W_2, ... W_N\mid S) \cdot p(S)}{p(W_1, W_2, ... W_N)} = &amp;lt;/tex&amp;gt; [так как $W_i$ предполагаются независимыми] &amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;= \displaystyle\frac{\prod_{i} p(W_i\mid S) \cdot p(S)}{p(W_1, W_2, ... W_N)} = \frac{\prod_{i}p(S\mid W_i)}{\prod_i(p(S\mid W_i)) + \left(\frac{p(\neg S)}{p(S)}\right)^{1-N} \cdot \prod_i p(\neg S\mid W_i)} &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Результат $p$ обычно сравнивают с некоторым порогом (например, $0.5$), чтобы решить, является ли сообщение спамом или нет. Если $p$ ниже, чем порог, сообщение рассматривают как вероятный «ham», иначе его рассматривают как вероятный спам.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\displaystyle\ln{p(S\mid D)\over p(\neg S\mid D)} &amp;gt; h&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Пример кода scikit-learn===&lt;br /&gt;
&lt;br /&gt;
Классификатор [https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB GaussianNB] реализует наивный байесовский классификатор в предположении что изначальное распределение было гауссовым:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt; P(x_i \mid y) = \displaystyle\frac{1}{\sqrt{2\pi\sigma^2_y}}\exp(-\frac{(x_i - \mu_y)^2}{2\sigma^2_y}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.metrics '''import''' f1_score, accuracy_score&lt;br /&gt;
 '''from''' sklearn.naive_bayes '''import''' GaussianNB&lt;br /&gt;
 iris = datasets.load_iris()&lt;br /&gt;
 gnb = GaussianNB()&lt;br /&gt;
 pred = gnb.fit(iris.data, iris.target).predict(iris.data)&lt;br /&gt;
 accuracy = accuracy_score(iris.target, pred)&lt;br /&gt;
 f1 = f1_score(iris.target, pred, average=&amp;quot;micro&amp;quot;)&lt;br /&gt;
 '''print'''(''&amp;quot;accruracy:&amp;quot;'', accuracy, ''&amp;quot;f1:&amp;quot;'', f1)&lt;br /&gt;
&lt;br /&gt;
Вывод:&lt;br /&gt;
 accruracy: 0.96 f1: 0.96&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.bayes.NaiveBayes&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/bayes/NaiveBayes.html/ Weka, Naive Bayes]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость:&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;
  // load dataset&lt;br /&gt;
  '''var''' source = new DataSource(&amp;quot;/iris.arff&amp;quot;);&lt;br /&gt;
  '''var''' dataset = source.getDataSet();	&lt;br /&gt;
  //set class index to the last attribute&lt;br /&gt;
  dataset.setClassIndex(dataset.numAttributes() - 1);&lt;br /&gt;
  //create and build the classifier&lt;br /&gt;
  '''var''' nb = new NaiveBayes();&lt;br /&gt;
  nb.buildClassifier(dataset);&lt;br /&gt;
  // cross validate model&lt;br /&gt;
  var eval = new Evaluation(dataset);&lt;br /&gt;
  eval.crossValidateModel(nb, dataset, 10, new Random(41));&lt;br /&gt;
  System.out.println(&amp;quot;Estimated Accuracy: &amp;quot;+ Double.toString(eval.pctCorrect()));&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Байесовские сети|Байесовские сети]]&lt;br /&gt;
*[[:Независимые события|Независимые события]]&lt;br /&gt;
*[[:Формула Байеса|Формула Байеса]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9_%D0%B1%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%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 Википедия {{---}} Наивный байесовский классификатор] &lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/6/6d/Voron-ML-1.pdf К.В.Воронцов Математические методы обучения по прецедентам]&lt;br /&gt;
* [https://scikit-learn.org/stable/modules/naive_bayes.html Scikit-learn 1.9. Supervised learning - Naive Bayes]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация и регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70873</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70873"/>
				<updated>2019-04-08T13:56:47Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
Пример линейной регресии с применением &amp;lt;code&amp;gt;weka.classifiers.functions.LinearRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.LinearRegression;&lt;br /&gt;
  '''import''' weka.core.Instance;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
&lt;br /&gt;
  //Load Data set&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;dataset/house.arff&amp;quot;)));&lt;br /&gt;
  data.setClassIndex(data.numAttributes() - 1);&lt;br /&gt;
  //Build model&lt;br /&gt;
  '''var''' model = new LinearRegression();&lt;br /&gt;
  '''try''' { model.buildClassifier(data); }&lt;br /&gt;
  '''catch''' (Exception e) { e.printStackTrace(); }&lt;br /&gt;
  //output model&lt;br /&gt;
  System.out.printf(&amp;quot;model parameters: %s%n&amp;quot;, model);&lt;br /&gt;
  // Now Predicting the cost&lt;br /&gt;
  '''var''' myHouse = data.lastInstance();&lt;br /&gt;
  '''var''' price  = model.classifyInstance(myHouse);&lt;br /&gt;
  System.out.printf(&amp;quot;predicted price = %s%n&amp;quot;, price);&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
Пример линейной регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Гребневая регрессия (ридж-регрессия)}}&lt;br /&gt;
&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Лассо-регрессия}}&lt;br /&gt;
&lt;br /&gt;
Пример Лассо-регрессии с применением &amp;lt;code&amp;gt;smile.regression.LASSO&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.LASSO;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lasso   = new LASSO(dataset.x(), dataset.y(), 10);&lt;br /&gt;
  lasso.predict(testX);&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  // Test the model&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  // Print the result à la Weka explorer:&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.SVM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/SVM.html/ Smile, SVM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.SVM;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.math.kernel.GaussianKernel;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  // read train &amp;amp; test dataset&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' train   = parser.parse(&amp;quot;USPS Train&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.train&amp;quot;));&lt;br /&gt;
  '''var''' test    = parser.parse(&amp;quot;USPS Test&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.test&amp;quot;));&lt;br /&gt;
  '''var''' classes = Arrays.stream(test.labels()).max().orElse(0) + 1;&lt;br /&gt;
  // build SVM classifier&lt;br /&gt;
  '''var''' svm     = new SVM&amp;lt;&amp;gt;(new GaussianKernel(8.0), 5.0, classes, SVM.Multiclass.ONE_VS_ONE);&lt;br /&gt;
  svm.learn(train.x(), train.labels());&lt;br /&gt;
  svm.finish();&lt;br /&gt;
  // calculate test error rate&lt;br /&gt;
  '''var''' error = 0;&lt;br /&gt;
  for (int i = 0; i &amp;lt; test.x().length; i++) {&lt;br /&gt;
   if (svm.predict(test.x()[i]) != test.labels()[i]) {&lt;br /&gt;
     error++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  System.out.format(&amp;quot;USPS error rate = %.2f%%\n&amp;quot;, 100.0 * error / test.x().length);&lt;br /&gt;
&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  //load data&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  // new instance of clusterer&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  // build the clusterer&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70872</id>
		<title>Примеры кода на Java</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%BA%D0%BE%D0%B4%D0%B0_%D0%BD%D0%B0_Java&amp;diff=70872"/>
				<updated>2019-04-08T13:50:31Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: Новая страница: «Java: https://www.oracle.com/java/ ==Популярные библиотеки== * &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* &amp;lt;code&amp;gt;Weka&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]&amp;lt;/ref&amp;gt; {{---}} популярная библиотека, написанная на языке &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.&lt;br /&gt;
* &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. &amp;lt;code&amp;gt;Smile&amp;lt;/code&amp;gt; покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.&lt;br /&gt;
* &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning &amp;amp; linear algebra for Java/Scala with GPUs + Spark]&amp;lt;/ref&amp;gt; {{---}} &amp;lt;code&amp;gt;Java&amp;lt;/code&amp;gt; библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных нейронных сетей).&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
Для работы с приведенными ниже примерами необходим &amp;lt;code&amp;gt;JDK&amp;lt;/code&amp;gt; версии не ниже 10 и система сборки &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Каждый пример структурирован следующим образом: &lt;br /&gt;
# &amp;lt;code&amp;gt;Maven&amp;lt;/code&amp;gt; зависимость на необходимые библиотеки&lt;br /&gt;
# Список необходимых &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; директив&lt;br /&gt;
# Код примера с комментариями&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{main|Линейная регрессия}}&lt;br /&gt;
Пример линейной регресии с применением &amp;lt;code&amp;gt;weka.classifiers.functions.LinearRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.LinearRegression;&lt;br /&gt;
  '''import''' weka.core.Instance;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
&lt;br /&gt;
  //Load Data set&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;dataset/house.arff&amp;quot;)));&lt;br /&gt;
  data.setClassIndex(data.numAttributes() - 1);&lt;br /&gt;
  //Build model&lt;br /&gt;
  '''var''' model = new LinearRegression();&lt;br /&gt;
  '''try''' { model.buildClassifier(data); }&lt;br /&gt;
  '''catch''' (Exception e) { e.printStackTrace(); }&lt;br /&gt;
  //output model&lt;br /&gt;
  System.out.printf(&amp;quot;model parameters: %s%n&amp;quot;, model);&lt;br /&gt;
  // Now Predicting the cost&lt;br /&gt;
  '''var''' myHouse = data.lastInstance();&lt;br /&gt;
  '''var''' price  = model.classifyInstance(myHouse);&lt;br /&gt;
  System.out.printf(&amp;quot;predicted price = %s%n&amp;quot;, price);&lt;br /&gt;
====Логистическая регрессиия====&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
Пример линейной регрессии с применением &amp;lt;code&amp;gt;smile.classification.LogisticRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.AttributeDataset;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.classification.LogisticRegression;&lt;br /&gt;
  '''import''' smile.data.parser.ArffParser;&lt;br /&gt;
&lt;br /&gt;
  '''var''' arffParser = new ArffParser();&lt;br /&gt;
  arffParser.setResponseIndex(4);&lt;br /&gt;
  '''var''' iris   = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile(&amp;quot;weka/iris.arff&amp;quot;));&lt;br /&gt;
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());&lt;br /&gt;
  logClf.predict(testX);&lt;br /&gt;
====Гребневая регрессия (ридж-регрессия)====&lt;br /&gt;
{{Main|Вариации регрессии#Гребневая регрессия (ридж-регрессия)}}&lt;br /&gt;
&lt;br /&gt;
Пример гребневой регрессии с применением &amp;lt;code&amp;gt;smile.regression.RidgeRegression&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.RidgeRegression;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset  = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lambda   = 0.0057d;&lt;br /&gt;
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);&lt;br /&gt;
  ridgeClf.predict(testX);&lt;br /&gt;
====Лассо-регрессия====&lt;br /&gt;
{{Main|Вариации регрессии#Лассо-регрессия}}&lt;br /&gt;
&lt;br /&gt;
Пример Лассо-регрессии с применением &amp;lt;code&amp;gt;smile.regression.LASSO&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.regression.LASSO;&lt;br /&gt;
&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setDelimiter(&amp;quot;, &amp;quot;);&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' dataset = parser.parse(&amp;quot;dataset.csv&amp;quot;);&lt;br /&gt;
  '''var''' lasso   = new LASSO(dataset.x(), dataset.y(), 10);&lt;br /&gt;
  lasso.predict(testX);&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.functions.MultilayerPerceptron&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&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.functions.MultilayerPerceptron;&lt;br /&gt;
  '''import''' weka.core.converters.CSVLoader;&lt;br /&gt;
  '''import''' java.io.File;&lt;br /&gt;
&lt;br /&gt;
  '''var''' trainds = new DataSource(&amp;quot;etc/train.csv&amp;quot;);&lt;br /&gt;
  '''var''' train   = trainds.getDataSet();&lt;br /&gt;
  train.setClassIndex(train.numAttributes() - 1);&lt;br /&gt;
  '''var''' testds = new DataSource(&amp;quot;etc/test.csv&amp;quot;);&lt;br /&gt;
  '''var''' test   = testds.getDataSet();&lt;br /&gt;
  test.setClassIndex(test.numAttributes() - 1);&lt;br /&gt;
  '''var''' mlp = new MultilayerPerceptron();&lt;br /&gt;
  mlp.buildClassifier(train);&lt;br /&gt;
  // Test the model&lt;br /&gt;
  '''var''' eTest = new Evaluation(train);&lt;br /&gt;
  eTest.evaluateModel(mlp, test);&lt;br /&gt;
  // Print the result à la Weka explorer:&lt;br /&gt;
  '''var''' strSummary = eTest.toSummaryString();&lt;br /&gt;
  System.out.println(strSummary);&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{Main|Рекуррентные нейронные сети}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
{{Main|Долгая краткосрочная память}}&lt;br /&gt;
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки &amp;lt;code&amp;gt;deeplearning4j&amp;lt;/code&amp;gt;.&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
{{main|Метод опорных векторов (SVM)}}&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;smile.classification.SVM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/api/java/smile/classification/SVM.html/ Smile, SVM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;dependency&amp;gt;&lt;br /&gt;
    &amp;lt;groupId&amp;gt;com.github.haifengl&amp;lt;/groupId&amp;gt;&lt;br /&gt;
    &amp;lt;artifactId&amp;gt;smile-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
    &amp;lt;version&amp;gt;1.5.2&amp;lt;/version&amp;gt;&lt;br /&gt;
  &amp;lt;/dependency&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  '''import''' smile.classification.SVM;&lt;br /&gt;
  '''import''' smile.data.NominalAttribute;&lt;br /&gt;
  '''import''' smile.data.parser.DelimitedTextParser;&lt;br /&gt;
  '''import''' smile.math.kernel.GaussianKernel;&lt;br /&gt;
  '''import''' java.util.Arrays;&lt;br /&gt;
&lt;br /&gt;
  // read train &amp;amp; test dataset&lt;br /&gt;
  '''var''' parser = new DelimitedTextParser();&lt;br /&gt;
  parser.setResponseIndex(new NominalAttribute(&amp;quot;class&amp;quot;), 0);&lt;br /&gt;
  '''var''' train   = parser.parse(&amp;quot;USPS Train&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.train&amp;quot;));&lt;br /&gt;
  '''var''' test    = parser.parse(&amp;quot;USPS Test&amp;quot;, this.getClass().getResourceAsStream(&amp;quot;/smile/data/usps/zip.test&amp;quot;));&lt;br /&gt;
  '''var''' classes = Arrays.stream(test.labels()).max().orElse(0) + 1;&lt;br /&gt;
  // build SVM classifier&lt;br /&gt;
  '''var''' svm     = new SVM&amp;lt;&amp;gt;(new GaussianKernel(8.0), 5.0, classes, SVM.Multiclass.ONE_VS_ONE);&lt;br /&gt;
  svm.learn(train.x(), train.labels());&lt;br /&gt;
  svm.finish();&lt;br /&gt;
  // calculate test error rate&lt;br /&gt;
  '''var''' error = 0;&lt;br /&gt;
  for (int i = 0; i &amp;lt; test.x().length; i++) {&lt;br /&gt;
   if (svm.predict(test.x()[i]) != test.labels()[i]) {&lt;br /&gt;
     error++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  System.out.format(&amp;quot;USPS error rate = %.2f%%\n&amp;quot;, 100.0 * error / test.x().length);&lt;br /&gt;
&lt;br /&gt;
===Деревья решений, случайный лес===&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Бустинг, Ada-boost===&lt;br /&gt;
{{main|Бустинг, AdaBoost#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
{{Main|EM-алгоритм|ll=EM-алгоритм &amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
Пример кластеризации с применением &amp;lt;code&amp;gt;weka.clusterers.EM&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/clusterers/EM.html/ Weka, EM]&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &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.clusterers.ClusterEvaluation;&lt;br /&gt;
  '''import''' weka.clusterers.EM;&lt;br /&gt;
  '''import''' weka.core.Instances;&lt;br /&gt;
  '''import''' java.io.BufferedReader;&lt;br /&gt;
  '''import''' java.io.FileReader;&lt;br /&gt;
  '''import''' java.util.Random;&lt;br /&gt;
&lt;br /&gt;
  //load data&lt;br /&gt;
  '''var''' data = new Instances(new BufferedReader(new FileReader(&amp;quot;data/bank-data.arff&amp;quot;)));&lt;br /&gt;
  // new instance of clusterer&lt;br /&gt;
  '''var''' model = new EM();&lt;br /&gt;
  // build the clusterer&lt;br /&gt;
  model.buildClusterer(data);&lt;br /&gt;
  System.out.println(model);&lt;br /&gt;
  '''var''' logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
{{Main|Уменьшение размерности#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
{{Main|Байесовская классификация#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример на языке Java}}&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 08.04.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Обзор библиотек для машинного обучения на Python|Обзор библиотек для машинного обучения на Python]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Python&amp;diff=70871</id>
		<title>Обзор библиотек для машинного обучения на Python</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D0%B7%D0%BE%D1%80_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Python&amp;diff=70871"/>
				<updated>2019-04-08T13:37:14Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: Исправил ссылку на примеры Java&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:python-logo.png|auto|thumb|Python: https://www.python.org]]&lt;br /&gt;
&lt;br /&gt;
==Scikit-learn==&lt;br /&gt;
===Описание===&lt;br /&gt;
Scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/ Библиотека scikit-learn]&amp;lt;/ref&amp;gt; {{---}} библиотека машинного обучения на языке программирования Python с открытым исходным кодом. Содержит реализации практически всех возможных преобразований, и нередко ее одной хватает для полной реализации модели. В данной библиотеки реализованы методы разбиения датасета на тестовый и обучающий, вычисление основных метрик над наборами данных, проведение [[кросс-валидации|Кросс-валидация]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. В библиотеке также есть основные алгоритмы машинного обучения: [[Линейная регрессия|линейной регрессии]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и её модификаций Лассо, гребневой регрессии, [[Метод опорных векторов (SVM)|опорных векторов]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Дерево решений и случайный лес|решающих деревьев и лесов]] и др. Есть и реализации основных методов [[Кластеризация|кластеризации]]. Кроме того, библиотека содержит постоянно используемые исследователями методы работы с признаками: например, понижение размерности [[Метод главных компонент (PCA)|методом главных компонент]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. Частью пакета является библиотека imblearn&amp;lt;ref&amp;gt;[https://imbalanced-learn.readthedocs.io/en/stable/index.html Библиотека imbalanced-learn]&amp;lt;/ref&amp;gt;, позволяющая работать с разбалансированными выборками и генерировать новые значения.&lt;br /&gt;
&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Линейная регрессия====&lt;br /&gt;
{{Main|Линейная регрессия|l1=Линейная регрессия&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Add required imports&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' LinearRegression&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' mean_squared_error, r2_score&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  diabetes = datasets.load_diabetes()&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Use only one feature&amp;lt;/font&amp;gt;&lt;br /&gt;
  diabetes_X = diabetes.data[:, np.newaxis, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Split the data into training/testing sets&amp;lt;/font&amp;gt;&lt;br /&gt;
  x_train = diabetes_X[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;]&lt;br /&gt;
  x_test = diabetes_X[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;:]&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Split the targets into training/testing sets&amp;lt;/font&amp;gt;&lt;br /&gt;
  y_train = diabetes.target[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;]&lt;br /&gt;
  y_test = diabetes.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20&amp;lt;/font&amp;gt;:]&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  lr = LinearRegression()&lt;br /&gt;
  lr.fit(x_train, y_train)&lt;br /&gt;
  predictions = lr.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# The mean squared error&amp;lt;/font&amp;gt;&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Mean squared error: %.2f&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
        % mean_squared_error(y_test, predictions))&lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Explained variance score: 1 is perfect prediction&amp;lt;/font&amp;gt;&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Variance score: %.2f'&amp;lt;/font&amp;gt; % r2_score(y_test, predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Mean squared error: 2548.07'''&lt;br /&gt;
    '''Variance score: 0.47'''&lt;br /&gt;
&lt;br /&gt;
Построение графика прямой, получившейся в результате работы линейной регрессии:&lt;br /&gt;
  plt.scatter(x_test, y_test,  color=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'black'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.plot(x_test, predictions, color=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'blue'&amp;lt;/font&amp;gt;, linewidth=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.xticks(())&lt;br /&gt;
  plt.yticks(())&lt;br /&gt;
  plt.show()&lt;br /&gt;
&lt;br /&gt;
[[File:Diabetes-sklearn.png|400px|none|super]]&lt;br /&gt;
&lt;br /&gt;
====Логистическая регрессия====&lt;br /&gt;
{{Main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn.datasets '''import''' load_digits&lt;br /&gt;
  digits = load_digits()&lt;br /&gt;
&lt;br /&gt;
Вывод первых трех тренировочных данных для визуализации:&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  &lt;br /&gt;
  plt.figure(figsize=(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;,&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;4&amp;lt;/font&amp;gt;))&lt;br /&gt;
  '''for''' index, (image, label) '''in''' enumerate(zip(digits.data[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;], digits.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;])):&lt;br /&gt;
    plt.subplot(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;, index + &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;)&lt;br /&gt;
    plt.imshow(np.reshape(image, (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;8&amp;lt;/font&amp;gt;,&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;8&amp;lt;/font&amp;gt;)), cmap=plt.cm.gray)&lt;br /&gt;
    plt.title(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Training: %i\n'&amp;lt;/font&amp;gt; % label, fontsize = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
[[File:Digits-sklearn.png|800px|none|super]]&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  x_train, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' LogisticRegression&lt;br /&gt;
  lr = LogisticRegression()&lt;br /&gt;
  lr.fit(x_train, y_train)&lt;br /&gt;
  predictions = lr.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  score = lr.score(x_test, y_test)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % score)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Score: 0.953'''&lt;br /&gt;
&lt;br /&gt;
====Перцептрон====&lt;br /&gt;
{{Main|Нейронные сети, перцептрон}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  iris = datasets.load_iris()&lt;br /&gt;
  X = iris.data&lt;br /&gt;
  y = iris.target&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тренировочный и тестовый:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.20&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Трансформация признаков:&lt;br /&gt;
  '''from''' sklearn.preprocessing '''import''' StandardScaler&lt;br /&gt;
  scaler = StandardScaler()&lt;br /&gt;
  scaler.fit(X_train)&lt;br /&gt;
  X_train = scaler.transform(X_train)&lt;br /&gt;
  X_test = scaler.transform(X_test)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  '''from''' sklearn.neural_network '''import''' MLPClassifier&lt;br /&gt;
  mlp = MLPClassifier(hidden_layer_sizes=(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;), max_iter=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1000&amp;lt;/font&amp;gt;)&lt;br /&gt;
  mlp.fit(X_train, y_train.values.ravel())&lt;br /&gt;
  predictions = mlp.predict(X_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' classification_report, confusion_matrix&lt;br /&gt;
  print(confusion_matrix(y_test,predictions))&lt;br /&gt;
  print(classification_report(y_test,predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''[[ 7  0  0]'''&lt;br /&gt;
     '''[ 0  8  1]'''&lt;br /&gt;
     '''[ 0  2 12]]'''&lt;br /&gt;
                  '''precision    recall  f1-score   support'''&lt;br /&gt;
  &lt;br /&gt;
               '''0       1.00      1.00      1.00         7'''&lt;br /&gt;
               '''1       0.80      0.89      0.84         9'''&lt;br /&gt;
               '''2       0.92      0.86      0.89        14'''&lt;br /&gt;
  &lt;br /&gt;
       '''micro avg       0.90      0.90      0.90        30'''&lt;br /&gt;
       '''macro avg       0.91      0.92      0.91        30'''&lt;br /&gt;
    '''weighted avg       0.90      0.90      0.90        30'''&lt;br /&gt;
&lt;br /&gt;
====Метрический классификатор и метод ближайших соседей====&lt;br /&gt;
{{Main|Метрический классификатор и метод ближайших соседей#Пример использования (через scikit-learn)|l1=Метрический классификатор и метод ближайших соседей: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
====Дерево решений и случайный лес====&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Примеры использования (в scikit-learn)|l1=Дерево решений и случайный лес: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
====Обработка естественного языка====&lt;br /&gt;
{{Main|Обработка естественного языка}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' fetch_20newsgroups&lt;br /&gt;
  twenty_train = fetch_20newsgroups(subset=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'train'&amp;lt;/font&amp;gt;, shuffle='''True''', random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Вывод первых трех строк первого тренивочного файла и его класса:&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/font&amp;gt;.join(twenty_train.data[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;].split(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/font&amp;gt;)[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;]))&lt;br /&gt;
  print(twenty_train.target_names[twenty_train.target[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;]])&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''From: lerxst@wam.umd.edu (where's my thing)'''&lt;br /&gt;
    '''Subject: WHAT car is this!?'''&lt;br /&gt;
    '''Nntp-Posting-Host: rac3.wam.umd.edu'''&lt;br /&gt;
  &lt;br /&gt;
    '''rec.autos'''&lt;br /&gt;
&lt;br /&gt;
Построение и обучение двух моделей. Первая на основе [[Байесовская классификация | Байесовской классификации]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;, а вторая использует метод опорных векторов:&lt;br /&gt;
  '''from''' sklearn.pipeline '''import''' Pipeline&lt;br /&gt;
  '''from''' sklearn.feature_extraction.text '''import''' CountVectorizer, TfidfTransformer&lt;br /&gt;
  &lt;br /&gt;
  '''from''' sklearn.naive_bayes '''import''' MultinomialNB&lt;br /&gt;
  text_clf1 = Pipeline([&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect'&amp;lt;/font&amp;gt;, CountVectorizer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf'&amp;lt;/font&amp;gt;, TfidfTransformer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf'&amp;lt;/font&amp;gt;, MultinomialNB()),&lt;br /&gt;
  ])&lt;br /&gt;
  &lt;br /&gt;
  '''from''' sklearn.linear_model '''import''' SGDClassifier&lt;br /&gt;
  text_clf2 = Pipeline([&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect'&amp;lt;/font&amp;gt;, CountVectorizer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf'&amp;lt;/font&amp;gt;, TfidfTransformer()),&lt;br /&gt;
    (&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf'&amp;lt;/font&amp;gt;, SGDClassifier(loss=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'hinge'&amp;lt;/font&amp;gt;, penalty=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'l2'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                          alpha=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-3&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;,&lt;br /&gt;
                          max_iter=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, tol='''None''')),&lt;br /&gt;
  ])&lt;br /&gt;
  &lt;br /&gt;
  text_clf1.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
  text_clf2.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритмов:&lt;br /&gt;
  twenty_test = fetch_20newsgroups(subset=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'test'&amp;lt;/font&amp;gt;, shuffle='''True''', random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;42&amp;lt;/font&amp;gt;)&lt;br /&gt;
  docs_test = twenty_test.data&lt;br /&gt;
  predicted1 = text_clf1.predict(docs_test)&lt;br /&gt;
  predicted2 = text_clf2.predict(docs_test)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % np.mean(predicted1 == twenty_test.target))&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % np.mean(predicted2 == twenty_test.target))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Score for naive Bayes: 0.774'''&lt;br /&gt;
    '''Score for SVM: 0.824'''&lt;br /&gt;
&lt;br /&gt;
====Кросс-валилация и подбор параметров====&lt;br /&gt;
{{Main|Кросс-валидация}}&lt;br /&gt;
&lt;br /&gt;
Возьмем предыдущий пример с обработкой естественного языка и попробуем увеличить точность алгоритма за счет кросс-валидации и подбора параметров:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' GridSearchCV&lt;br /&gt;
  parameters = {&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'vect__ngram_range'&amp;lt;/font&amp;gt;: [(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;), (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)],&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tfidf__use_idf'&amp;lt;/font&amp;gt;: ('''True''', '''False'''),&lt;br /&gt;
      &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'clf__alpha'&amp;lt;/font&amp;gt;: (&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-2&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1e-3&amp;lt;/font&amp;gt;),&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  gs_clf = GridSearchCV(text_clf2, parameters, cv=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, iid='''False''', n_jobs=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;)&lt;br /&gt;
  gs_clf = gs_clf.fit(twenty_train.data, twenty_train.target)&lt;br /&gt;
  &lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Best score: %.3f&amp;quot;&amp;lt;/font&amp;gt; % gs_clf.best_score_)&lt;br /&gt;
  &lt;br /&gt;
  '''for''' param_name '''in''' sorted(parameters.keys()):&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;%s: %r&amp;quot;&amp;lt;/font&amp;gt; % (param_name, gs_clf.best_params_[param_name]))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Best score: 0.904'''&lt;br /&gt;
    '''clf__alpha: 0.001'''&lt;br /&gt;
    '''tfidf__use_idf: True'''&lt;br /&gt;
    '''vect__ngram_range: (1, 2)'''&lt;br /&gt;
&lt;br /&gt;
====Метод опорных векторов (SVM)====&lt;br /&gt;
{{Main|Метод опорных векторов (SVM)|l1=Метод опорных векторов (SVM) &amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Загрузка датасета:&lt;br /&gt;
  '''from''' sklearn '''import''' datasets&lt;br /&gt;
  iris = datasets.load_iris()&lt;br /&gt;
&lt;br /&gt;
Разбиение датасета на тестовый и тренировочный:&lt;br /&gt;
  '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
  x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.25&amp;lt;/font&amp;gt;, random_state=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Построение и обучение модели:&lt;br /&gt;
  clf = svm.SVC(kernel=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'linear'&amp;lt;/font&amp;gt;, C=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;)&lt;br /&gt;
  clf.fit(x_train, y_train)&lt;br /&gt;
  predictions = clf.predict(x_test)&lt;br /&gt;
&lt;br /&gt;
Оценка алгоритма:&lt;br /&gt;
  '''from''' sklearn.metrics '''import''' classification_report, confusion_matrix&lt;br /&gt;
  print(confusion_matrix(y_test,predictions))&lt;br /&gt;
  print(classification_report(y_test,predictions))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''[[13  0  0]'''&lt;br /&gt;
     '''[ 0 15  1]'''&lt;br /&gt;
     '''[ 0  0  9]]'''&lt;br /&gt;
                  '''precision    recall  f1-score   support'''&lt;br /&gt;
  &lt;br /&gt;
               '''0       1.00      1.00      1.00        13'''&lt;br /&gt;
               '''1       1.00      0.94      0.97        16'''&lt;br /&gt;
               '''2       0.90      1.00      0.95         9'''&lt;br /&gt;
  &lt;br /&gt;
       '''micro avg       0.97      0.97      0.97        38'''&lt;br /&gt;
       '''macro avg       0.97      0.98      0.97        38'''&lt;br /&gt;
    '''weighted avg       0.98      0.97      0.97        38'''&lt;br /&gt;
&lt;br /&gt;
====EM-алгоритм====&lt;br /&gt;
{{Main|EM-алгоритм|l1=EM-алгоритм&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
  '''import''' numpy '''as''' np&lt;br /&gt;
  '''import''' matplotlib.pyplot '''as''' plt&lt;br /&gt;
  '''from''' matplotlib.colors '''import''' LogNorm&lt;br /&gt;
  '''from''' sklearn '''import''' mixture&lt;br /&gt;
  &lt;br /&gt;
  n_samples = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;300&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate random sample, two components&amp;lt;/font&amp;gt;&lt;br /&gt;
  np.random.seed(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate spherical data centered on (20, 20)&amp;lt;/font&amp;gt;&lt;br /&gt;
  shifted_gaussian = np.random.randn(n_samples, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;) + np.array([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;20&amp;lt;/font&amp;gt;])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# generate zero centered stretched Gaussian data&amp;lt;/font&amp;gt;&lt;br /&gt;
  C = np.array([[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-0.7&amp;lt;/font&amp;gt;], [&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3.5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;.7&amp;lt;/font&amp;gt;]])&lt;br /&gt;
  stretched_gaussian = np.dot(np.random.randn(n_samples, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;), C)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# concatenate the two datasets into the final training set&amp;lt;/font&amp;gt;&lt;br /&gt;
  X_train = np.vstack([shifted_gaussian, stretched_gaussian])&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# fit a Gaussian Mixture Model with two components&amp;lt;/font&amp;gt;&lt;br /&gt;
  clf = mixture.GaussianMixture(n_components=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;, covariance_type=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'full'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  clf.fit(X_train)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# display predicted scores by the model as a contour plot&amp;lt;/font&amp;gt;&lt;br /&gt;
  x = np.linspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;30.&amp;lt;/font&amp;gt;)&lt;br /&gt;
  y = np.linspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-20.&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;40.&amp;lt;/font&amp;gt;)&lt;br /&gt;
  X, Y = np.meshgrid(x, y)&lt;br /&gt;
  XX = np.array([X.ravel(), Y.ravel()]).T&lt;br /&gt;
  Z = -clf.score_samples(XX)&lt;br /&gt;
  Z = Z.reshape(X.shape)&lt;br /&gt;
  &lt;br /&gt;
  CS = plt.contour(X, Y, Z, norm=LogNorm(vmin=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;, vmax=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1000.0&amp;lt;/font&amp;gt;),&lt;br /&gt;
                   levels=np.logspace(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;))&lt;br /&gt;
  CB = plt.colorbar(CS, shrink=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.8&amp;lt;/font&amp;gt;, extend=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'both'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.scatter(X_train[:, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;], X_train[:, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;.8&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  plt.title(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Negative log-likelihood predicted by a GMM'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.axis(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'tight'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  plt.show()&lt;br /&gt;
&lt;br /&gt;
[[File:Em.png|400px|none|super]]&lt;br /&gt;
&lt;br /&gt;
====Уменьшение размерности====&lt;br /&gt;
{{Main|Уменьшение размерности#Пример кода scikit-learn|l1=Уменьшение размерности: пример через scikit-learn}}&lt;br /&gt;
&lt;br /&gt;
==Tensorflow==&lt;br /&gt;
===Описание===&lt;br /&gt;
Tensorflow&amp;lt;ref&amp;gt;[https://www.tensorflow.org Библиотека Tensorflow]&amp;lt;/ref&amp;gt; {{---}} библиотека, разработанная корпорацией Google для работы с тензорами, используется для построения нейронных сетей. Поддержка вычислений на видеокартах имеет поддержку языка программирования C++. На основе данной библиотеки строятся более высокоуровневые библиотеки для работы с нейронными сетями на уровне целых слоев. Так, некоторое время назад популярная библиотека Keras стала использовать Tensorflow как основной бэкенд для вычислений вместо аналогичной библиотеки Theano. Для работы на видеокартах NVIDIA используется библиотека cuDNN. Если вы работаете с картинками (со сверточными нейросетями), скорее всего, придется использовать данную библиотеку.&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Сверточная нейронная сеть====&lt;br /&gt;
{{Main|Сверточные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Реализация сверточной нейронной сети для классификации цифр из датасета MNIST:&lt;br /&gt;
  '''from''' __future__ '''import''' division, print_function, absolute_import&lt;br /&gt;
  '''import''' tensorflow '''as''' tf&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Import MNIST data&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''from''' tensorflow.examples.tutorials.mnist '''import''' input_data&lt;br /&gt;
  mnist = input_data.read_data_sets(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;/tmp/data/&amp;quot;&amp;lt;/font&amp;gt;, one_hot='''True''')&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Training Parameters&amp;lt;/font&amp;gt;&lt;br /&gt;
  learning_rate = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.001&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_steps = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;200&amp;lt;/font&amp;gt;&lt;br /&gt;
  batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;128&amp;lt;/font&amp;gt;&lt;br /&gt;
  display_step = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Network Parameters&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_input = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;784&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST data input (img shape: 28*28)&amp;lt;/font&amp;gt;&lt;br /&gt;
  num_classes = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;10&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST total classes (0-9 digits)&amp;lt;/font&amp;gt;&lt;br /&gt;
  dropout = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.75&amp;lt;/font&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Dropout, probability to keep units&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# tf Graph input&amp;lt;/font&amp;gt;&lt;br /&gt;
  X = tf.placeholder(tf.float32, ['''None''', num_input])&lt;br /&gt;
  Y = tf.placeholder(tf.float32, ['''None''', num_classes])&lt;br /&gt;
  keep_prob = tf.placeholder(tf.float32) &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# dropout (keep probability)&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Create some wrappers for simplicity&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''def''' conv2d(x, W, b, strides=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Conv2D wrapper, with bias and relu activation&amp;lt;/font&amp;gt;&lt;br /&gt;
    x = tf.nn.conv2d(x, W, strides=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, strides, strides, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'SAME'&amp;lt;/font&amp;gt;)&lt;br /&gt;
    x = tf.nn.bias_add(x, b)&lt;br /&gt;
    '''return''' tf.nn.relu(x)&lt;br /&gt;
  &lt;br /&gt;
  '''def''' maxpool2d(x, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MaxPool2D wrapper&amp;lt;/font&amp;gt;&lt;br /&gt;
    '''return''' tf.nn.max_pool(x, ksize=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, k, k, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;], strides=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, k, k, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;],&lt;br /&gt;
                          padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'SAME'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Create model&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''def''' conv_net(x, weights, biases, dropout):&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# MNIST data input is a 1-D vector of 784 features (28*28 pixels)&lt;br /&gt;
    # Reshape to match picture format [Height x Width x Channel]&lt;br /&gt;
    # Tensor input become 4-D: [Batch Size, Height, Width, Channel]&amp;lt;/font&amp;gt;&lt;br /&gt;
    x = tf.reshape(x, shape=[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;28&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;28&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Convolution Layer&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv1 = conv2d(x, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc1'&amp;lt;/font&amp;gt;], biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc1'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Max Pooling (down-sampling)&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv1 = maxpool2d(conv1, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Convolution Layer&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv2 = conv2d(conv1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc2'&amp;lt;/font&amp;gt;], biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc2'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Max Pooling (down-sampling)&amp;lt;/font&amp;gt;&lt;br /&gt;
    conv2 = maxpool2d(conv2, k=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Fully connected layer&lt;br /&gt;
    # Reshape conv2 output to fit fully connected layer input&amp;lt;/font&amp;gt;&lt;br /&gt;
    fc1 = tf.reshape(conv2, [&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;-1&amp;lt;/font&amp;gt;, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;].get_shape().as_list()[&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;]])&lt;br /&gt;
    fc1 = tf.add(tf.matmul(fc1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;]), biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bd1'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    fc1 = tf.nn.relu(fc1)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Apply Dropout&amp;lt;/font&amp;gt;&lt;br /&gt;
    fc1 = tf.nn.dropout(fc1, dropout)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Output, class prediction&amp;lt;/font&amp;gt;&lt;br /&gt;
    out = tf.add(tf.matmul(fc1, weights[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;]), biases[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;])&lt;br /&gt;
    '''return''' out&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Store layers weight &amp;amp; bias&amp;lt;/font&amp;gt;&lt;br /&gt;
  weights = {&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 5x5 conv, 1 input, 32 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 5x5 conv, 32 inputs, 64 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wc2'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# fully connected, 7*7*64 inputs, 1024 outputs&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'wd1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;*&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;7&amp;lt;/font&amp;gt;*&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# 1024 inputs, 10 outputs (class prediction)&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;, num_classes]))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  biases = {&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bc2'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;64&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'bd1'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1024&amp;lt;/font&amp;gt;])),&lt;br /&gt;
    &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'out'&amp;lt;/font&amp;gt;: tf.Variable(tf.random_normal([num_classes]))&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Construct model&amp;lt;/font&amp;gt;&lt;br /&gt;
  logits = conv_net(X, weights, biases, keep_prob)&lt;br /&gt;
  prediction = tf.nn.softmax(logits)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Define loss and optimizer&amp;lt;/font&amp;gt;&lt;br /&gt;
  loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(&lt;br /&gt;
    logits=logits, labels=Y))&lt;br /&gt;
  optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)&lt;br /&gt;
  train_op = optimizer.minimize(loss_op)&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Evaluate model&amp;lt;/font&amp;gt;&lt;br /&gt;
  correct_pred = tf.equal(tf.argmax(prediction, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;), tf.argmax(Y, &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Initialize the variables (i.e. assign their default value)&amp;lt;/font&amp;gt;&lt;br /&gt;
  init = tf.global_variables_initializer()&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Start training&amp;lt;/font&amp;gt;&lt;br /&gt;
  '''with''' tf.Session() '''as''' sess:&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Run the initializer&amp;lt;/font&amp;gt;&lt;br /&gt;
    sess.run(init)&lt;br /&gt;
    '''for''' step '''in''' '''range'''(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;, num_steps+&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;):&lt;br /&gt;
      batch_x, batch_y = mnist.train.next_batch(batch_size)&lt;br /&gt;
      &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Run optimization op (backprop)&amp;lt;/font&amp;gt;&lt;br /&gt;
      sess.run(train_op, feed_dict={X: batch_x, Y: batch_y, keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.8&amp;lt;/font&amp;gt;})&lt;br /&gt;
      '''if''' step % display_step == &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt; '''or''' step == &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;:&lt;br /&gt;
        &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Calculate batch loss and accuracy&amp;lt;/font&amp;gt;&lt;br /&gt;
        loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x,&lt;br /&gt;
                                                             Y: batch_y,&lt;br /&gt;
                                                             keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;})&lt;br /&gt;
        print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Step &amp;quot;&amp;lt;/font&amp;gt; + str(step) + &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;, Minibatch Loss= &amp;quot;&amp;lt;/font&amp;gt; + \&lt;br /&gt;
              &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;{:.4f}&amp;quot;&amp;lt;/font&amp;gt;.format(loss) + &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;, Training Accuracy= &amp;quot;&amp;lt;/font&amp;gt; + \&lt;br /&gt;
              &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;{:.3f}&amp;quot;&amp;lt;/font&amp;gt;.format(acc))&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Optimization Finished!&amp;quot;&amp;lt;/font&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# Calculate accuracy for 256 MNIST test images&amp;lt;/font&amp;gt;&lt;br /&gt;
    print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;quot;Testing Accuracy:&amp;quot;&amp;lt;/font&amp;gt;, \&lt;br /&gt;
      sess.run(accuracy, feed_dict={X: mnist.test.images[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;256&amp;lt;/font&amp;gt;],&lt;br /&gt;
                                    Y: mnist.test.labels[:&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;256&amp;lt;/font&amp;gt;],&lt;br /&gt;
                                    keep_prob: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1.0&amp;lt;/font&amp;gt;}))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Step 1, Minibatch Loss= 41724.0586, Training Accuracy= 0.156'''&lt;br /&gt;
    '''Step 10, Minibatch Loss= 17748.7500, Training Accuracy= 0.242'''&lt;br /&gt;
    '''Step 20, Minibatch Loss= 8307.6162, Training Accuracy= 0.578'''&lt;br /&gt;
    '''Step 30, Minibatch Loss= 3108.5703, Training Accuracy= 0.766'''&lt;br /&gt;
    '''Step 40, Minibatch Loss= 3273.2749, Training Accuracy= 0.727'''&lt;br /&gt;
    '''Step 50, Minibatch Loss= 2754.2861, Training Accuracy= 0.820'''&lt;br /&gt;
    '''Step 60, Minibatch Loss= 2467.7925, Training Accuracy= 0.844'''&lt;br /&gt;
    '''Step 70, Minibatch Loss= 1423.8140, Training Accuracy= 0.914'''&lt;br /&gt;
    '''Step 80, Minibatch Loss= 1651.4656, Training Accuracy= 0.875'''&lt;br /&gt;
    '''Step 90, Minibatch Loss= 2105.9263, Training Accuracy= 0.867'''&lt;br /&gt;
    '''Step 100, Minibatch Loss= 1153.5090, Training Accuracy= 0.867'''&lt;br /&gt;
    '''Step 110, Minibatch Loss= 1751.1400, Training Accuracy= 0.898'''&lt;br /&gt;
    '''Step 120, Minibatch Loss= 1446.2119, Training Accuracy= 0.922'''&lt;br /&gt;
    '''Step 130, Minibatch Loss= 1403.7135, Training Accuracy= 0.859'''&lt;br /&gt;
    '''Step 140, Minibatch Loss= 1089.7897, Training Accuracy= 0.930'''&lt;br /&gt;
    '''Step 150, Minibatch Loss= 1147.0751, Training Accuracy= 0.898'''&lt;br /&gt;
    '''Step 160, Minibatch Loss= 1963.3733, Training Accuracy= 0.883'''&lt;br /&gt;
    '''Step 170, Minibatch Loss= 1544.2725, Training Accuracy= 0.859'''&lt;br /&gt;
    '''Step 180, Minibatch Loss= 977.9219, Training Accuracy= 0.914'''&lt;br /&gt;
    '''Step 190, Minibatch Loss= 857.7977, Training Accuracy= 0.930'''&lt;br /&gt;
    '''Step 200, Minibatch Loss= 430.4735, Training Accuracy= 0.953'''&lt;br /&gt;
    '''Optimization Finished!'''&lt;br /&gt;
    '''Testing Accuracy: 0.94140625'''&lt;br /&gt;
&lt;br /&gt;
==Keras==&lt;br /&gt;
===Описание===&lt;br /&gt;
Keras&amp;lt;ref&amp;gt;[https://keras.io Библиотека Keras]&amp;lt;/ref&amp;gt; {{---}} библиотека для построения нейронных сетей, поддерживающая основные виды слоев и структурные элементы. Поддерживает как рекуррентные, так и сверточные нейросети, имеет в своем составе реализацию известных архитектур нейросетей (например, VGG16). Некоторое время назад слои из данной библиотеки стали доступны внутри библиотеки Tensorflow. Существуют готовые функции для работы с изображениями и текстом. Интегрирована в Apache Spark с помощью дистрибутива dist-keras. Данная библиотека позволяет на более высоком уровне работать с нейронными сетями. В качестве библиотеки для бэкенда может использоваться как Tensorflow, так и Theano.&lt;br /&gt;
===Примеры кода===&lt;br /&gt;
====Сверточная нейронная сеть====&lt;br /&gt;
{{Main|Сверточные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Реализация сверточной нейронной сети для классификации текста:&lt;br /&gt;
  '''from''' __future__ '''import''' print_function&lt;br /&gt;
  '''from''' keras.preprocessing '''import''' sequence&lt;br /&gt;
  '''from''' keras.models '''import''' Sequential&lt;br /&gt;
  '''from''' keras.layers '''import''' Dense, Dropout, Activation&lt;br /&gt;
  '''from''' keras.layers '''import''' Embedding&lt;br /&gt;
  '''from''' keras.layers '''import''' Conv1D, GlobalMaxPooling1D&lt;br /&gt;
  '''from''' keras.datasets '''import''' imdb&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;# set parameters:&amp;lt;/font&amp;gt;&lt;br /&gt;
  max_features = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;5000&amp;lt;/font&amp;gt;&lt;br /&gt;
  maxlen = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;400&amp;lt;/font&amp;gt;&lt;br /&gt;
  batch_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;32&amp;lt;/font&amp;gt;&lt;br /&gt;
  embedding_dims = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;50&amp;lt;/font&amp;gt;&lt;br /&gt;
  filters = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;250&amp;lt;/font&amp;gt;&lt;br /&gt;
  kernel_size = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;3&amp;lt;/font&amp;gt;&lt;br /&gt;
  hidden_dims = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;250&amp;lt;/font&amp;gt;&lt;br /&gt;
  epochs = &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  (x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)&lt;br /&gt;
  print(len(x_train), &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'train sequences'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  print(len(x_test), &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'test sequences'&amp;lt;/font&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''25000 train sequences'''&lt;br /&gt;
    '''25000 test sequences'''&lt;br /&gt;
&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'Pad sequences (samples x time)'&amp;lt;/font&amp;gt;)&lt;br /&gt;
  x_train = sequence.pad_sequences(x_train, maxlen=maxlen)&lt;br /&gt;
  x_test = sequence.pad_sequences(x_test, maxlen=maxlen)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'x_train shape:'&amp;lt;/font&amp;gt;, x_train.shape)&lt;br /&gt;
  print(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'x_test shape:'&amp;lt;/font&amp;gt;, x_test.shape)&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Pad sequences (samples x time)'''&lt;br /&gt;
    '''x_train shape: (25000, 400)'''&lt;br /&gt;
    '''x_test shape: (25000, 400)'''&lt;br /&gt;
&lt;br /&gt;
  model = Sequential()&lt;br /&gt;
  &lt;br /&gt;
  model.add(Embedding(max_features,&lt;br /&gt;
                      embedding_dims,&lt;br /&gt;
                      input_length=maxlen))&lt;br /&gt;
  model.add(Dropout(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))  &lt;br /&gt;
  model.add(Conv1D(filters,&lt;br /&gt;
                   kernel_size,&lt;br /&gt;
                   padding=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'valid'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                   activation=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'relu'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                   strides=&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(GlobalMaxPooling1D())&lt;br /&gt;
  model.add(Dense(hidden_dims))&lt;br /&gt;
  model.add(Dropout(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;0.2&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Activation(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'relu'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Dense(&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;))&lt;br /&gt;
  model.add(Activation(&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'sigmoid'&amp;lt;/font&amp;gt;))&lt;br /&gt;
  &lt;br /&gt;
  model.compile(loss=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'binary_crossentropy'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                optimizer=&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'adam'&amp;lt;/font&amp;gt;,&lt;br /&gt;
                metrics=[&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'accuracy'&amp;lt;/font&amp;gt;])&lt;br /&gt;
  model.fit(x_train, y_train,&lt;br /&gt;
            batch_size=batch_size,&lt;br /&gt;
            epochs=epochs,&lt;br /&gt;
            validation_data=(x_test, y_test))&lt;br /&gt;
&lt;br /&gt;
  &amp;gt; '''Train on 25000 samples, validate on 25000 samples'''&lt;br /&gt;
    '''Epoch 1/2'''&lt;br /&gt;
    '''25000/25000 [==============================] - 136s 5ms/step - loss: 0.4107 - acc: 0.7923 - val_loss: 0.2926 - val_acc: 0.8746'''&lt;br /&gt;
    '''Epoch 2/2'''&lt;br /&gt;
    '''25000/25000 [==============================] - 136s 5ms/step - loss: 0.2294 - acc: 0.9082 - val_loss: 0.3200 - val_acc: 0.8652'''&lt;br /&gt;
&lt;br /&gt;
==Другие библиотеки для машинного обучения на Python==&lt;br /&gt;
===Вспомогательные библиотеки===&lt;br /&gt;
* NumPy&amp;lt;ref&amp;gt;[http://www.numpy.org Библиотека NumPy]&amp;lt;/ref&amp;gt; {{---}} библиотека, добавляющая поддержку больших многомерных массивов и матриц вместе с большой библиотекой  высокоуровневых математических функций для операций с этими массивами. Данная библиотека предоставляет реализации вычислительных алгоритмов (в виде функций и операторов), оптимизированные для работы с многомерными массивами. В результате любой алгоритм, который может быть выражен в виде последовательности операций над массивами (матрицами) и реализованный с использованием NumPy, работает так же быстро, как эквивалентный код, выполняемый в MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/products/matlab.html MATLAB]&amp;lt;/ref&amp;gt;;&lt;br /&gt;
* SciPy&amp;lt;ref&amp;gt;[https://www.scipy.org Библиотека SciPy]&amp;lt;/ref&amp;gt; {{---}} открытая библиотека высококачественных научных инструментов для языка программирования Python. SciPy содержит модули для оптимизации, интегрирования, специальных функций, обработки сигналов, обработки изображений, генетических алгоритмов, решения обыкновенных дифференциальных уравнений и других задач, обычно решаемых в науке и при инженерной разработке;&lt;br /&gt;
* Pandas&amp;lt;ref&amp;gt;[https://pandas.pydata.org Библиотека Pandas]&amp;lt;/ref&amp;gt; {{---}} библиотека Python, которая является мощным инструментом для анализа данных. Пакет дает возможность строить сводные таблицы, выполнять группировки, предоставляет удобный доступ к табличным данным и позволяет строить графики на полученных наборах данных при помощи библиотеки Matplotlib;&lt;br /&gt;
* Matplotlib&amp;lt;ref&amp;gt;[https://matplotlib.org Библиотека Matplotlib]&amp;lt;/ref&amp;gt; {{---}} библиотека Python для построения качественных двумерных графиков. Matplotlib является гибким, легко конфигурируемым пакетом, который вместе с NumPy, SciPy и IPython&amp;lt;ref&amp;gt;[https://ipython.org IPython Notebook]&amp;lt;/ref&amp;gt; предоставляет возможности, подобные MATLAB.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для глубокого обучения===&lt;br /&gt;
* PyTorch&amp;lt;ref&amp;gt;[https://pytorch.org Библиотека PyTorch]&amp;lt;/ref&amp;gt; {{---}} библиотека для глубокого обучения, созданная на базе Torch&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Torch_(machine_learning) Torch]&amp;lt;/ref&amp;gt; и развиваемая компанией Facebook. Две ключевые функциональности данной библиотеки {{---}} тензорные вычисления с развитой поддержкой ускорения на GPU и глубокие нейронные сети на базе системы autodiff;&lt;br /&gt;
* Theano&amp;lt;ref&amp;gt;[http://deeplearning.net/software/theano/ Библиотека Theano]&amp;lt;/ref&amp;gt; {{---}} расширение языка программирования Python, позволяющее эффективно вычислять математические выражения, содержащие многомерные массивы. Библиотека предоставляет базовый набор инструментов для конфигурации нейронных сетей и их обучения. Наибольшее признание данная библиотека получила в задачах машинного обучения при решении задач оптимизации. Она позволяет использовать возможности GPU без изменения кода программы, что делает ее незаменимой при выполнении ресурсоемких задач;&lt;br /&gt;
* Caffe&amp;lt;ref&amp;gt;[http://caffe.berkeleyvision.org Библиотека Caffe]&amp;lt;/ref&amp;gt; {{---}} фреймворк для обучения нейронных сетей, созданный университетом Беркли. Как и Tensorflow, использует cuDNN для работы с видеокартами NVIDIA;&lt;br /&gt;
* Microsoft Cognitive Toolkit (CNTK)&amp;lt;ref&amp;gt;[https://www.microsoft.com/en-us/cognitive-toolkit/ Библиотека CNTK]&amp;lt;/ref&amp;gt; {{---}} фреймворк от корпорации Microsoft, предоставляющий реализации архитектур различных нейронных сетей.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для обработки естественного языка===&lt;br /&gt;
* NLTK&amp;lt;ref&amp;gt;[https://www.nltk.org Библиотека NLTK]&amp;lt;/ref&amp;gt; {{---}} пакет библиотек и программ для символьной и статистической обработки естественного языка, написанных на языке программирования Python;&lt;br /&gt;
* Gensim&amp;lt;ref&amp;gt;[https://radimrehurek.com/gensim/ Библиотека Gensim]&amp;lt;/ref&amp;gt; {{---}} инструмент для автоматической обработки языка, основанный на машинном обучении. В Gensim реализованы алгоритмы дистрибутивной семантики word2vec и doc2vec, он позволяет решать задачи тематического моделирования и выделять основные темы текста или документа.&lt;br /&gt;
&lt;br /&gt;
===Библиотеки для градиентного бустинга===&lt;br /&gt;
* [[XGBoost|Xgboost]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&amp;lt;ref&amp;gt;[https://xgboost.readthedocs.io/en/latest/python/index.html Библиотека Xgboost]&amp;lt;/ref&amp;gt; {{---}} библиотека с реализацией градиентного бустинга, которая для выбора разбиения использует сортировку и модели, основанные на анализе гистограмм;&lt;br /&gt;
* LightGBM&amp;lt;ref&amp;gt;[http://www.dmtk.io Библиотека LightGBM]&amp;lt;/ref&amp;gt; {{---}} фреймворк с реализацией градиентного бустинга от корпорации Microsoft. Является частью проекта Microsoft DMTK, посвященного реализации подходов машинного обучения для .Net;&lt;br /&gt;
* [[CatBoost|CatBoost]]&amp;lt;ref&amp;gt;[https://catboost.ai Библиотека CatBoost]&amp;lt;/ref&amp;gt; {{---}} библиотека с градиентным бустингом от компании Яндекс, в которой реализуется особый подход к обработке категориальных признаков, основанный на подмене категориальных признаков статистиками на основе предсказываемого значения.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Примеры кода на Scala|Примеры кода на Scala]]&lt;br /&gt;
*[[:Примеры кода на R|Примеры кода на R]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81&amp;diff=70870</id>
		<title>Дерево решений и случайный лес</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B5%D1%80%D0%B5%D0%B2%D0%BE_%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B9_%D0%B8_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D0%B9_%D0%BB%D0%B5%D1%81&amp;diff=70870"/>
				<updated>2019-04-08T12:50:51Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.123.110: Добавил Джява пример&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Дерево решений {{---}} логический алгоритм классификации, решающий задачи классификации и регрессии. Представляет собой объединение логических условий в структуру дерева.&lt;br /&gt;
&lt;br /&gt;
==Дерево решений==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1. &lt;br /&gt;
|neat = &lt;br /&gt;
|definition=&lt;br /&gt;
'''Дерево решений''' (англ. ''decision tree, DT'') {{---}} алгоритм классификации &amp;lt;tex&amp;gt;a(x) = (V_{внутр}, v_0, V_{лист}, S_v, \beta_v)&amp;lt;/tex&amp;gt;, задающийся деревом (связным ациклическим графом), где:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V = V_{внутр} \cup V_{лист} &amp;lt;/tex&amp;gt; {{---}} множество вершин , &amp;lt;tex&amp;gt;v_0 \in V&amp;lt;/tex&amp;gt; {{---}} корень дерева;&lt;br /&gt;
* &amp;lt;tex&amp;gt; S_v : D_v \rightarrow V_v &amp;lt;/tex&amp;gt; {{---}} функция перехода по значению предиката в множество детей вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \beta_v : X \rightarrow D_v &amp;lt;/tex&amp;gt; {{---}} предикат ветвления, &amp;lt;tex&amp;gt;v \in V_{внутр}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;|D_v| &amp;lt; \infty&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* Для листьев &amp;lt;tex&amp;gt;v \in V_{лист}&amp;lt;/tex&amp;gt; определена метка класса &amp;lt;tex&amp;gt;y_v \in Y&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Бинарное дерево решений''' {{---}}  частный случай дерева решений, для которого &amp;lt;tex&amp;gt; D_v = \{0,1\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:BinDT.jpg |300px|thumb|right|Классификация объекта &amp;lt;tex&amp;gt; x \in X &amp;lt;/tex&amp;gt; бинарным решающим деревом]]&lt;br /&gt;
&lt;br /&gt;
 '''function''' classify(x):&lt;br /&gt;
   &amp;lt;tex&amp;gt;v = v_0&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''if''' &amp;lt;tex&amp;gt;\beta_v(x) = 1 &amp;lt;/tex&amp;gt; &lt;br /&gt;
      &amp;lt;tex&amp;gt;v := R_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''else'''&lt;br /&gt;
      &amp;lt;tex&amp;gt;v := L_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Информативность ветвления===&lt;br /&gt;
Для того, чтобы оценивать качество разбиения объектов по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, введем понятие ''информационного выигрыша'' разбиения. &amp;lt;br&amp;gt;&lt;br /&gt;
Сначала оценим распределение значений классов объектов внутри каждого множества из разбиения, введя понятие ''меры неопределенности распределения''.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Частотная оценка вероятности класса &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; в вершине &amp;lt;tex&amp;gt;v \in V_{внутр}&amp;lt;/tex&amp;gt; ''': &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;p_y = P(y | x \in U) = \frac{1}{|U|} \sum\nolimits_{x_i \in U}[y_i = y]&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Мера неопределенности (англ. ''impurity'') распределения &amp;lt;tex&amp;gt;p_y&amp;lt;/tex&amp;gt;''': &amp;lt;br&amp;gt;&lt;br /&gt;
* минимальна, когда &amp;lt;tex&amp;gt;p_y \in \{0,1\}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* максимальна, когда &amp;lt;tex&amp;gt;p_y = \frac{1}{|Y|}&amp;lt;/tex&amp;gt; для всех &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* не зависит от перенумерации классов&lt;br /&gt;
&amp;lt;tex&amp;gt;Ф(U) = \sum\nolimits_{y \in Y} p_y L(p_y) = \frac{1}{|U|} \sum\nolimits_{x_i \in U}L(P(y_i | x_i \in U)) \rightarrow min&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt; где &amp;lt;tex&amp;gt;L(p)&amp;lt;/tex&amp;gt; убывает и &amp;lt;tex&amp;gt;L(1) = 0&amp;lt;/tex&amp;gt;, например: &amp;lt;tex&amp;gt;-log_2(p)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1 - p&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;1 - p^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Примерами мер неопределенности распределения являются: &lt;br /&gt;
* Энтропия: &amp;lt;tex&amp;gt;Ф(U) = -\sum\limits_{i}^N p_i log_2p_i&amp;lt;/tex&amp;gt;, определяется для каждого множества из разбиения, &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; {{---}} количество возможных классов, и &amp;lt;tex&amp;gt;p_i&amp;lt;/tex&amp;gt; {{---}} вероятность объекта принадлежать &amp;lt;tex&amp;gt; i&amp;lt;/tex&amp;gt;-ому классу.&lt;br /&gt;
* Критерий Джини: &amp;lt;tex&amp;gt;Ф(U) = \sum\nolimits_{i != j}p_i p_j = \sum\nolimits_{i}p_i*(1-p_i)&amp;lt;/tex&amp;gt;, максимизацию этого критерия можно интерпретировать как максимизацию числа пар объектов одного класса, оказавшихся после разбиения в одном множестве. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь определим суммарную ''неопределенность распределения'' в разбиении.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Неопределенность распределения &amp;lt;tex&amp;gt;P(y_i | x_i \in U_{\beta(x_i)})&amp;lt;/tex&amp;gt; после ветвления вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; и разбиения &amp;lt;tex&amp;gt;U = \bigcup_{k \in D_v} U_k&amp;lt;/tex&amp;gt;''': &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Ф(U_0, ... ,U_{D_v}) = \frac{1}{|U|} \sum\nolimits_{k \in D_v} \sum\nolimits_{x_i \in U_k}L(P(y_i | x_i \in U_k)) = \sum\nolimits_{k \in D_v} \frac{|U_k|}{|U|}Ф(U_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
''Информационный выигрыш'' от разбиения определяется как изменение неопределенности в системе.&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=def1 &lt;br /&gt;
|neat =&lt;br /&gt;
|definition=&lt;br /&gt;
'''Информационный выигрыш от разбиения по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;''' &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;Gain(\beta, U) = Ф(U) - Ф(U_1, ... ,U_{|D_v|}) = Ф(U) - \sum\nolimits_{k \in D_v} \frac{|U_k|}{|U|}Ф(U_k) \rightarrow max_{\beta \in B} &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Рекурсивный алгоритм построения бинарного дерева решений ID3 ===&lt;br /&gt;
Покажем идею построения дерева решения на частном случае бинарного дерева. Алгоритм &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt; (англ. ''Induction of Decision Tree'') заключается в последовательном дроблении выборки на две части до тех пор, пока в каждой части не окажутся объекты только одного класса. Разделение производится по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, который выбирается из множества элементарных предикатов. На практике в качестве элементарных предикатов чаще всего берут простые пороговые условия вида &amp;lt;tex&amp;gt;\beta(x) = [f_j(x) &amp;gt;= d_j]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&amp;lt;br&amp;gt;Проще всего записать этот алгоритм в виде рекурсивной процедуры &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt;, которая строит дерево по заданной подвыборке &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; и возвращает его корневую вершину. &lt;br /&gt;
&lt;br /&gt;
 1:'''function''' ID3(&amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;):&lt;br /&gt;
 2:   '''if''' &amp;lt;tex&amp;gt;for all&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;u \in U&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;y_u = y&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// создать листовую вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; c меткой класса &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 3:      v = createLeafVertex(&amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 4:      '''return''' v&lt;br /&gt;
      &amp;lt;font color=green&amp;gt;// найти предикат с максимальным информационным выигрышом &amp;lt;/font&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;\beta= \mathrm{arg}\max_{\beta\in B} &amp;lt;/tex&amp;gt; Gain(&amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;)&lt;br /&gt;
      &amp;lt;font color=green&amp;gt;// разбить выборку на две части &amp;lt;tex&amp;gt;U = U_0 \cup U_1&amp;lt;/tex&amp;gt; по предикату &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 5:   &amp;lt;tex&amp;gt;U_0 := \{x \in U: \beta(x) = 0\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 6:   &amp;lt;tex&amp;gt;U_1 := \{x \in U: \beta(x) = 1\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 7:   '''if''' &amp;lt;tex&amp;gt;U_0 = \emptyset&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;U_1 = \emptyset&amp;lt;/tex&amp;gt; &lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// найти класс, в котором находится большинство объектов из &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
 8:      &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; = majorClass(&amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 9:      v = createLeafVertex(&amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt;)&lt;br /&gt;
      '''else'''&lt;br /&gt;
         &amp;lt;font color=green&amp;gt;// создать внутреннюю вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 10:     v = createVertex()&lt;br /&gt;
 11:     &amp;lt;tex&amp;gt;\beta_v = \beta&amp;lt;/tex&amp;gt;&lt;br /&gt;
 12:     &amp;lt;tex&amp;gt;S_0&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;U_0&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 13:     &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;U_1&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 14:  '''return''' &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Редукция решающих деревьев ==&lt;br /&gt;
Суть редукции (англ. ''pruning'') состоит в удалении поддеревьев, имеющих недостаточную статистическую надёжность. При этом дерево перестаёт безошибочно классифицировать обучающую выборку, зато качество классификации новых объектов, как правило, улучшается. Рассмотрим наиболее простые варианты редукции.&lt;br /&gt;
&lt;br /&gt;
===Предредукция===&lt;br /&gt;
Предредукция (англ. ''pre-pruning'') или критерий раннего останова досрочно прекращает дальнейшее ветвление в вершине дерева, если информативность &amp;lt;tex&amp;gt;I(\beta, U)&amp;lt;/tex&amp;gt; для всех возможных предикатов &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; не дотягивает до заданного порогового значения &amp;lt;tex&amp;gt;I_0&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Для этого на шаге 8 алгоритма &amp;lt;tex&amp;gt;ID3&amp;lt;/tex&amp;gt; условие &amp;lt;tex&amp;gt;U_0 = \emptyset&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;U_1 = \emptyset&amp;lt;/tex&amp;gt;  заменяется условием &amp;lt;tex&amp;gt;I(\beta, U) &amp;lt;= I_0 &amp;lt;/tex&amp;gt;. Порог &amp;lt;tex&amp;gt;I_0 &amp;lt;/tex&amp;gt; является управляющим параметром метода. &amp;lt;br&amp;gt;&lt;br /&gt;
Предредукция считается не самым эффективным способом избежать переобучения, так как жадное ветвление по-прежнему остаётся глобально неоптимальным. Более эффективной считается cтратегия постредукции.&lt;br /&gt;
&lt;br /&gt;
===Постредукция===&lt;br /&gt;
Постредукция (англ. ''post-pruning'') просматривает все внутренние вершины дерева и заменяет отдельные вершины либо одной из дочерних вершин (при этом вторая дочерняя удаляется), либо терминальной вершиной. Процесс замен продолжается до тех&lt;br /&gt;
пор, пока в дереве остаются вершины, удовлетворяющие критерию замены. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
''Критерием замены'' является сокращение числа ошибок на контрольной выборке, отобранной заранее, и не участвовавшей в обучении дерева. Стандартная рекомендация — оставлять в контроле около 30% объектов. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Для реализации постредукции контрольная выборка &amp;lt;tex&amp;gt;X^k&amp;lt;/tex&amp;gt; пропускается через&lt;br /&gt;
построенное дерево. При этом в каждой внутренней вершине &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; запоминается подмножество &amp;lt;tex&amp;gt;S_v \subseteq X_k&amp;lt;/tex&amp;gt; попавших в неё контрольных объектов. Если &amp;lt;tex&amp;gt;S_v = \emptyset &amp;lt;/tex&amp;gt;, то вершина &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; считается ненадёжной и заменяется терминальной по ''мажоритарному правилу'': &amp;lt;br&amp;gt;&lt;br /&gt;
в качестве &amp;lt;tex&amp;gt;y_v&amp;lt;/tex&amp;gt; берётся тот класс, объектов которого больше всего в обучающей подвыборке &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt;, пришедшей в вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Затем для каждой внутренней вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; вычисляется число ошибок, полученных при классификации выборки &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; следующими способами: &amp;lt;br&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r(v)&amp;lt;/tex&amp;gt; — классификация поддеревом, растущим из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_L(v)&amp;lt;/tex&amp;gt; — классификация поддеревом левой дочерней вершины &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_R(v)&amp;lt;/tex&amp;gt; — классификация поддеревом правой дочерней вершины &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* &amp;lt;tex&amp;gt;r_c(v)&amp;lt;/tex&amp;gt; — отнесение всех объектов выборки &amp;lt;tex&amp;gt;S_v&amp;lt;/tex&amp;gt; к классу &amp;lt;tex&amp;gt;y \in Y&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Эти величины сравниваются, и в зависимости от того, какая из них оказалась&lt;br /&gt;
минимальной, принимается, соответственно, одно из четырёх решений: &amp;lt;br&amp;gt;&lt;br /&gt;
* сохранить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; поддеревом левой дочерней вершины &amp;lt;tex&amp;gt;L_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; поддеревом правой дочерней вершины &amp;lt;tex&amp;gt;R_v&amp;lt;/tex&amp;gt;;&lt;br /&gt;
* заменить поддерево &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; терминальной вершиной класса &amp;lt;tex&amp;gt;y_v = \mathrm{arg}\min_{y\in Y}r_c(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритмы построения деревьев решения ==&lt;br /&gt;
Недостатки рассмотренного алгоритма ID3: &lt;br /&gt;
* Применим только для дискретных значений признаков;&lt;br /&gt;
* Переобучение;&lt;br /&gt;
* На каждом шаге решение принимается по одному атрибуту.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм [https://en.wikipedia.org/wiki/Predictive_analytics#Classification_and_regression_trees_.28CART.29 CART] (англ. ''Classification And Regression Trees'')===&lt;br /&gt;
* В отличие от ID3 работает и с непрерывными значениями признаков: на каждом шаге построения дерева последовательно сравнивает все возможные разбиения для всех атрибутов и выбирает наилучший атрибут и наилучшее разбиение для него. Разбивает объекты на две части;&lt;br /&gt;
* Использует редукцию для избежания переобучения;&lt;br /&gt;
* Обрабатывает пропущенные или аномальные значения признаков.&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм [https://en.wikipedia.org/wiki/C4.5_algorithm C4.5] ===&lt;br /&gt;
* Также работает и с непрерывными значениями признаков: на каждом шаге построения дерева выбирает правило разбиения по одному из признаков. Разбивает объекты на несколько частей по этому правилу, рекурсивно запускается из полученных подмножеств;&lt;br /&gt;
* Использует редукцию для избежания переобучения;&lt;br /&gt;
* Обрабатывает пропущенные или аномальные значения признаков.&lt;br /&gt;
&lt;br /&gt;
== Случайный лес ==&lt;br /&gt;
Случайный лес {{---}} один из примеров объединения классификаторов в [[Виды_ансамблей|ансамбль]]. &amp;lt;br&amp;gt;&lt;br /&gt;
Алгоритм построения случайного леса, состоящего из &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; деревьев на основе обучающей выборки &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; такой:&lt;br /&gt;
 '''for''' (n: 1,...,N):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// сгенерировать выборку &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; c помощью [[Виды_ансамблей#Бутстрэп|бутстрэпа]]&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt; = bootstrap(&amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;)&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;// построить решающее дерево &amp;lt;tex&amp;gt;t_n&amp;lt;/tex&amp;gt; по выборке &amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;t_n&amp;lt;/tex&amp;gt; = ID3(&amp;lt;tex&amp;gt;X_n&amp;lt;/tex&amp;gt;) &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итоговый классификатор {{---}} &amp;lt;tex&amp;gt;a(x) = \frac{1}{N} \sum\limits_{i = 1}^{N} t_i(x)&amp;lt;/tex&amp;gt;. Для задачи классификации мы выбираем решение по большинству результатов, выданных классификаторами, а в задаче регрессии {{---}} по их среднему значению. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, случайный лес {{---}} бэггинг над решающими деревьями, при обучении которых для каждого разбиения признаки выбираются из некоторого случайного подмножества признаков.&lt;br /&gt;
&lt;br /&gt;
==Примеры кода==&lt;br /&gt;
===Примеры на языке Python===&lt;br /&gt;
*Для решения задач классификации и регрессии используют [https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier DecisionTreeClassifier], [https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeRegressor.html#sklearn.tree.DecisionTreeRegressor DecisionTreeRegressor];&lt;br /&gt;
&lt;br /&gt;
*В '''sklearn.ensemble''' также представлены методы классификации, основанные на ансамблях, в том числе: [https://scikit-learn.org/stable/modules/ensemble.html#bagging бэггинг] и [https://scikit-learn.org/stable/modules/ensemble.html#forest случайный лес], которые были описаны выше. &lt;br /&gt;
&amp;lt;br&amp;gt;Так, в этом примере создается бэггинг ансамбль из классификаторов '''KNeighborsClassifier''', каждый из которых обучен на случайных подмножествах из 50% объектов из обучающей выборки, и 50% случайно выбранных признаков.&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' BaggingClassifier&lt;br /&gt;
 '''from''' sklearn.neighbors '''import''' KNeighborsClassifier&lt;br /&gt;
 bagging = BaggingClassifier(KNeighborsClassifier(), max_samples=0.5, max_features=0.5)&lt;br /&gt;
&lt;br /&gt;
Пример использования классификатора на случайном лесе:&lt;br /&gt;
Полную версию кода можно найти [https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html#sphx-glr-download-auto-examples-classification-plot-classifier-comparison-py| здесь]&lt;br /&gt;
 '''from''' sklearn '''import''' RandomForestClassifier&lt;br /&gt;
 '''from''' sklearn.datasets '''import''' make_classification&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// сгенерируем случайную обучающую выборку с классификацией по n_classes классам&amp;lt;/font&amp;gt;&lt;br /&gt;
 X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,&lt;br /&gt;
                           random_state=1, n_clusters_per_class=1, n_classes=2)&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// разбиваем выборку на обучающую и тестовую &amp;lt;/font&amp;gt;&lt;br /&gt;
 X = StandardScaler().fit_transform(X)&lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42)&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// создадим классификатор на случайном лесе, состоящим из n_estimators деревьев&amp;lt;/font&amp;gt;&lt;br /&gt;
 RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1)&lt;br /&gt;
 clf.fit(X_train, y_train)&lt;br /&gt;
 score = clf.score(X_test, y_test)&lt;br /&gt;
&lt;br /&gt;
Результат классификации показан на рисунке. &lt;br /&gt;
&lt;br /&gt;
[[Файл:RFC.png |800px|thumb|center|Классификация RandomForestClassifier. Кружочками изображены объекты обучающей выборки, крестиками тестовой выборки. Справа цветом выделены границы принятия решений, в правом нижнем углу {{---}} значение accuracy.]]&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.cart&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#cart Smile, Decision Trees]&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 '''iris: 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''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''dt: DecisionTree = cart(x, y, 1000)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(dt.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, dt)&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Java===&lt;br /&gt;
Пример классификации с применением &amp;lt;code&amp;gt;weka.classifiers.trees.RandomForest&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;[http://weka.sourceforge.net/doc.dev/weka/classifiers/trees/RandomForest.html Weka, Random Forest]&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.Evaluation;&lt;br /&gt;
  '''import''' weka.classifiers.trees.RandomForest;&lt;br /&gt;
&lt;br /&gt;
  // read dataset&lt;br /&gt;
  '''var''' trainingDataSet = getDataSet(...);&lt;br /&gt;
  '''var''' testingDataSet = getDataSet(...);&lt;br /&gt;
  // create random forest classifier&lt;br /&gt;
  '''var''' forest = new RandomForest();&lt;br /&gt;
  forest.setMaxDepth(15);&lt;br /&gt;
  forest.setNumFeatures(2);&lt;br /&gt;
  forest.buildClassifier(trainingDataSet);&lt;br /&gt;
  // evaluate the model on test dataset and print summary&lt;br /&gt;
  '''var''' eval = new Evaluation(trainingDataSet);&lt;br /&gt;
  eval.evaluateModel(forest, testingDataSet);&lt;br /&gt;
  System.out.println(eval.toSummaryString());&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Виды ансамблей]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/images/3/3e/Voron-ML-Logic.pdf Логические алгоритмы классификации] {{---}} Лекция К. В. Воронцова&lt;br /&gt;
# [https://medium.com/open-machine-learning-course/open-machine-learning-course-topic-5-ensembles-of-algorithms-and-random-forest-8e05246cbba7 Случайный лес] {{---}} статья на Medium, Yury Kashnitskiy&lt;br /&gt;
# [https://scikit-learn.org/stable/modules/tree.html Деревья решений] {{---}} scikit-learn.org&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/ensemble.html Ансамбли классификаторов] — scikit-learn.org.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Классификация и регрессия]]&lt;/div&gt;</summary>
		<author><name>91.215.123.110</name></author>	</entry>

	</feed>