<?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=Alexey+Katsman</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=Alexey+Katsman"/>
		<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/Alexey_Katsman"/>
		<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_Scala&amp;diff=69572</id>
		<title>Примеры кода на Scala</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_Scala&amp;diff=69572"/>
				<updated>2019-01-28T14:53:01Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Долгая краткосрочная память */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировть данными и позволяет реализовавать матричные и веторные операции, решать задачи оптимизации, обрабатывать сигналы устройств.&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста.&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого.&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala.&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&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;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&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;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&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;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: 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''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием билиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&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 '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Освновная статья: [[Долгая краткосрочная память]].&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&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;
&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.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&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 '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Освновная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&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;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Освновная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&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 '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Освновная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Освновная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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_Scala&amp;diff=69571</id>
		<title>Примеры кода на Scala</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_Scala&amp;diff=69571"/>
				<updated>2019-01-28T14:52:45Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Метод опорных векторов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировть данными и позволяет реализовавать матричные и веторные операции, решать задачи оптимизации, обрабатывать сигналы устройств.&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста.&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого.&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala.&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&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;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&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;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&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;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: 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''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием билиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&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 '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Освновная статья: [[Долгая краткосрочная память]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&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;
&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.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&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 '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Освновная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&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;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Освновная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&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 '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Освновная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Освновная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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_Scala&amp;diff=69570</id>
		<title>Примеры кода на Scala</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_Scala&amp;diff=69570"/>
				<updated>2019-01-28T14:52:19Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* EM-алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировть данными и позволяет реализовавать матричные и веторные операции, решать задачи оптимизации, обрабатывать сигналы устройств.&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста.&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого.&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala.&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&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;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&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;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&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;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: 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''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием билиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&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 '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Освновная статья: [[Долгая краткосрочная память]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
Освновная статья: [[Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&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 '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Освновная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&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;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Освновная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&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 '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Освновная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Освновная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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_Scala&amp;diff=69569</id>
		<title>Примеры кода на Scala</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_Scala&amp;diff=69569"/>
				<updated>2019-01-28T14:52:08Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Байесовская классификация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировть данными и позволяет реализовавать матричные и веторные операции, решать задачи оптимизации, обрабатывать сигналы устройств.&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста.&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого.&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala.&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&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;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&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;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&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;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: 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''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием билиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&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 '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Освновная статья: [[Долгая краткосрочная память]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
Освновная статья: [[Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&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 '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Освновная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&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;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Освновная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&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 '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Освновная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Освновная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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_Scala&amp;diff=69568</id>
		<title>Примеры кода на Scala</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_Scala&amp;diff=69568"/>
				<updated>2019-01-28T14:51:52Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Рекуррентные нейронные сети */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировть данными и позволяет реализовавать матричные и веторные операции, решать задачи оптимизации, обрабатывать сигналы устройств.&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста.&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого.&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala.&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&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;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&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;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&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;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: 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''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием билиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&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 '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Освновная статья: [[Долгая краткосрочная память]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
Освновная статья: [[Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&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 '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Освновная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
Освновная статья: [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Освновная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&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 '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Освновная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Освновная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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_Scala&amp;diff=69567</id>
		<title>Примеры кода на Scala</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_Scala&amp;diff=69567"/>
				<updated>2019-01-28T14:51:36Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Логистическая регрессия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировть данными и позволяет реализовавать матричные и веторные операции, решать задачи оптимизации, обрабатывать сигналы устройств.&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста.&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого.&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala.&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&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;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&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;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&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;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: 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''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&amp;lt;sup&amp;gt;[на 5.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием билиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&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 '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Освновная статья: [[Долгая краткосрочная память]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
Освновная статья: [[Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&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 '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Освновная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
Освновная статья: [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Освновная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&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 '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Освновная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Освновная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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_Scala&amp;diff=69566</id>
		<title>Примеры кода на Scala</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_Scala&amp;diff=69566"/>
				<updated>2019-01-28T14:51:26Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Вариации регрессии */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировть данными и позволяет реализовавать матричные и веторные операции, решать задачи оптимизации, обрабатывать сигналы устройств.&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста.&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого.&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala.&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&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;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&lt;br /&gt;
&lt;br /&gt;
&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;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&amp;lt;sup&amp;gt;[на 5.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&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;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: 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''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&amp;lt;sup&amp;gt;[на 5.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием билиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&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 '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Освновная статья: [[Долгая краткосрочная память]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
Освновная статья: [[Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&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 '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Освновная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
Освновная статья: [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Освновная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&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 '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Освновная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Освновная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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_Scala&amp;diff=69565</id>
		<title>Примеры кода на Scala</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_Scala&amp;diff=69565"/>
				<updated>2019-01-28T14:51:13Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Линейная регрессия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]&lt;br /&gt;
&lt;br /&gt;
==Популярные библиотеки==&lt;br /&gt;
* Breeze&amp;lt;ref&amp;gt;[https://github.com/scalanlp/breeze Breeze]&amp;lt;/ref&amp;gt; {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB&amp;lt;ref&amp;gt;[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]&amp;lt;/ref&amp;gt; и NumPy&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]&amp;lt;/ref&amp;gt;. Breeze позволяет быстро манипулировть данными и позволяет реализовавать матричные и веторные операции, решать задачи оптимизации, обрабатывать сигналы устройств.&lt;br /&gt;
* Epic&amp;lt;ref&amp;gt;[http://www.scalanlp.org/ ScalaNLP, Epic]&amp;lt;/ref&amp;gt; {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста.&lt;br /&gt;
* Smpile&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]&amp;lt;/ref&amp;gt; {{---}} развивающийся проект, похожий на scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/ scikit-learn]&amp;lt;/ref&amp;gt;, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого.&lt;br /&gt;
* Apache Spark MLlib&amp;lt;ref&amp;gt;[https://spark.apache.org/mllib/ Apache Spark MLlib]&amp;lt;/ref&amp;gt; {{---}} построенная на Spark&amp;lt;ref&amp;gt;[https://spark.apache.org/ Apache Spark]&amp;lt;/ref&amp;gt; имеет большой набор алгоритмов, написанный на Scala.&lt;br /&gt;
* DeepLearning.scala &amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/ DeppLearning.scala]&amp;lt;/ref&amp;gt; {{---}} набор инструментов для глубокого обучения&amp;lt;ref&amp;gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокое обучение]&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;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''val '''training = spark.read.format(&amp;quot;libsvm&amp;quot;)&lt;br /&gt;
    .load(&amp;quot;linear_regression.txt&amp;quot;)&lt;br /&gt;
  '''val '''lr = '''new '''LinearRegression()&lt;br /&gt;
    .setMaxIter(10)&lt;br /&gt;
    .setRegParam(0.3)&lt;br /&gt;
    .setElasticNetParam(0.8)&lt;br /&gt;
  '''val '''lrModel = lr.fit(training)&lt;br /&gt;
Вывод итоговых параметров модели:&lt;br /&gt;
  println(lrModel.coefficients)&lt;br /&gt;
  println(lrModel.intercept)&lt;br /&gt;
  '''val '''trainingSummary = lrModel.summary&lt;br /&gt;
  println(trainingSummary.totalIterations)&lt;br /&gt;
  println(trainingSummary.objectiveHistory.mkString(&amp;quot;,&amp;quot;))&lt;br /&gt;
  trainingSummary.residuals.show()&lt;br /&gt;
  println(trainingSummary.rootMeanSquaredError)&lt;br /&gt;
  println(trainingSummary.r2)&lt;br /&gt;
&lt;br /&gt;
===Вариации регрессии===&lt;br /&gt;
{{main|Вариации регрессии}}&amp;lt;sup&amp;gt;[на 5.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&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;
Пример ридж и лассо регрессии c применением smile.regression&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/regression.html Smile, Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge}&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: AttributeDataset = read.table(&amp;quot;regression.txt&amp;quot;, delimiter = &amp;quot; &amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 0)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Double'''] = data.y()&lt;br /&gt;
  '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)&lt;br /&gt;
  '''val '''lassoRegression: LASSO = lasso(x, y, 10)&lt;br /&gt;
  println(ridgeRegression)&lt;br /&gt;
  println(lassoRegression)&lt;br /&gt;
&lt;br /&gt;
===Логистическая регрессия===&lt;br /&gt;
{{main|Логистическая регрессия}}&amp;lt;sup&amp;gt;[на 5.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sbt зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-core&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot;&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;org.apache.spark&amp;quot; '''%%''' &amp;quot;spark-mllib&amp;quot; '''%''' &amp;quot;2.4.0&amp;quot; '''%''' &amp;quot;runtime&amp;quot;&lt;br /&gt;
Пример логистической регрессии c применением spark.mllib.classification&amp;lt;ref&amp;gt;[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}&lt;br /&gt;
  '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics&lt;br /&gt;
  '''import '''org.apache.spark.mllib.regression.LabeledPoint&lt;br /&gt;
  '''import '''org.apache.spark.mllib.util.MLUtils&lt;br /&gt;
&lt;br /&gt;
  '''val '''data = MLUtils.loadLibSVMFile(sc, &amp;quot;logisticRegresion.txt&amp;quot;)&lt;br /&gt;
  '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)&lt;br /&gt;
  '''val '''training = splits(0).cache()&lt;br /&gt;
  '''val '''test = splits(1)&lt;br /&gt;
  '''val '''model = '''new '''LogisticRegressionWithLBFGS()&lt;br /&gt;
    .setNumClasses(10)&lt;br /&gt;
    .run(training)&lt;br /&gt;
&lt;br /&gt;
  '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) =&amp;gt;&lt;br /&gt;
    '''val '''prediction = model.predict(features)&lt;br /&gt;
    (prediction, label)&lt;br /&gt;
  }&lt;br /&gt;
  '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels)&lt;br /&gt;
  '''val '''accuracy = metrics.accuracy&lt;br /&gt;
  println(accuracy)&lt;br /&gt;
&lt;br /&gt;
===Классификация при помощи MLP===&lt;br /&gt;
{{main|Нейронные сети, перцептрон}}&lt;br /&gt;
&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;
Пример классификации c применением smile.classification.mlp&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}&lt;br /&gt;
  '''import '''smile.data.{AttributeDataset, NumericAttribute}&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.classification.mlp&lt;br /&gt;
  '''import '''smile.plot.plot&lt;br /&gt;
&lt;br /&gt;
  '''val '''data: 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''']] = data.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = data.y().map(_.toInt)&lt;br /&gt;
  '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)&lt;br /&gt;
  plot(x, y, mlpModel)&lt;br /&gt;
&lt;br /&gt;
===Рекуррентные нейронные сети===&lt;br /&gt;
{{main|Рекуррентные нейронные сети}}&amp;lt;sup&amp;gt;[на 5.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример кода, с использованием билиотеки DeepLearning.scala&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание слоёв&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''tanh(x: INDArrayLayer): INDArrayLayer = {&lt;br /&gt;
      '''val '''exp_x = hyperparameters.exp(x)&lt;br /&gt;
      '''val '''exp_nx = hyperparameters.exp(-x)&lt;br /&gt;
      (exp_x - exp_nx) / (exp_x + exp_nx)&lt;br /&gt;
    }&lt;br /&gt;
    '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {&lt;br /&gt;
        '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)&lt;br /&gt;
        '''val '''yraw = why.dot(hnext) + by&lt;br /&gt;
        '''val '''yraw_exp = hyperparameters.exp(yraw)&lt;br /&gt;
        '''val '''prob = yraw_exp / yraw_exp.sum&lt;br /&gt;
        '''val '''loss = -hyperparameters.log((prob * y).sum)&lt;br /&gt;
        (loss, prob, hnext)&lt;br /&gt;
    }&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 '''batches = data.zip(data.tail).grouped(seqLength).toVector&lt;br /&gt;
    type WithHiddenLayer[A] = (A, INDArrayLayer)&lt;br /&gt;
    type Batch = IndexedSeq[(Char, Char)]&lt;br /&gt;
    type Losses = Vector['''Double''']&lt;br /&gt;
    '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {&lt;br /&gt;
      batch '''match '''{&lt;br /&gt;
        '''case '''(batchseq, hprev) =&amp;gt; batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {&lt;br /&gt;
          (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =&amp;gt;&lt;br /&gt;
            (bstate, xy) '''match '''{&lt;br /&gt;
              '''case '''((tot, localhprev), (x, y)) =&amp;gt; {&lt;br /&gt;
                charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{&lt;br /&gt;
                  '''case '''(localloss, _, localhnext) =&amp;gt; {&lt;br /&gt;
                    (tot + localloss, localhnext)&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;span style=&amp;quot;color:#3D9970&amp;gt;// Определение одного шага обучения&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)&lt;br /&gt;
    '''def '''singleRound(initprevloss: Losses): Future[Losses] =&lt;br /&gt;
      (batches.foldLeftM((initprevloss, initH)) {&lt;br /&gt;
        (bstate: WithHiddenLayer[Losses], batch: Batch) =&amp;gt;&lt;br /&gt;
          bstate '''match '''{&lt;br /&gt;
            '''case '''(prevloss, hprev) =&amp;gt; singleBatch(batch, hprev) '''match '''{&lt;br /&gt;
              '''case '''(bloss, hnext) =&amp;gt; bloss.train.map {&lt;br /&gt;
                (blossval: '''Double''') =&amp;gt; {&lt;br /&gt;
                    '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001&lt;br /&gt;
                    (loss_seq, hnext)&lt;br /&gt;
                }&lt;br /&gt;
              }&lt;br /&gt;
            }&lt;br /&gt;
          }&lt;br /&gt;
      }).map {&lt;br /&gt;
        (fstate: WithHiddenLayer[Losses]) =&amp;gt;&lt;br /&gt;
          fstate '''match '''{&lt;br /&gt;
            '''case '''(floss, _) =&amp;gt; floss&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
    '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {&lt;br /&gt;
      (ploss: Losses, round: '''Int''') =&amp;gt; {&lt;br /&gt;
          singleRound(ploss)&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Обучение сети&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)&lt;br /&gt;
    '''val '''losses = unsafePerformFuture(allRounds)&lt;br /&gt;
&lt;br /&gt;
===Долгая краткосрочная память===&lt;br /&gt;
Освновная статья: [[Долгая краткосрочная память]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j&amp;lt;ref&amp;gt;[https://deeplearning4j.org/ DeepLearning4j]&amp;lt;/ref&amp;gt; и ND4J&amp;lt;ref&amp;gt;[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]&amp;lt;/ref&amp;gt;&lt;br /&gt;
===Обработка естественного языка===&lt;br /&gt;
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метрический классификатор и метод ближайших соседей===&lt;br /&gt;
Освновная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Метод опорных векторов===&lt;br /&gt;
Освновная статья: [[Метод опорных векторов]]&amp;lt;sup&amp;gt;[на 15.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.svm&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]&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 '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(SVM.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, SVM)&lt;br /&gt;
&lt;br /&gt;
===Дерево решений и случайный лес===&lt;br /&gt;
Освновная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Байесовская классификация===&lt;br /&gt;
Освновная статья: [[Байесовская классификация]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.tsukaby&amp;quot; '''%%''' &amp;quot;naive-bayes-classifier-scala&amp;quot; '''%''' &amp;quot;0.2.0&amp;quot;&lt;br /&gt;
Пример классификации используя smile.classification.cart&amp;lt;ref&amp;gt;[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Создание модели&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''bayes = '''new '''BayesClassifier[String, String]()&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Задание соотвествия категория - слово&amp;lt;/span&amp;gt;&lt;br /&gt;
  bayes.learn(&amp;quot;technology&amp;quot;, &amp;quot;github&amp;quot; :: &amp;quot;git&amp;quot; :: &amp;quot;tech&amp;quot; :: &amp;quot;technology&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;weather&amp;quot;, &amp;quot;sun&amp;quot; :: &amp;quot;rain&amp;quot; :: &amp;quot;cloud&amp;quot; :: &amp;quot;weather&amp;quot; :: &amp;quot;snow&amp;quot; :: Nil)&lt;br /&gt;
  bayes.learn(&amp;quot;government&amp;quot;, &amp;quot;ballot&amp;quot; :: &amp;quot;winner&amp;quot; :: &amp;quot;party&amp;quot; :: &amp;quot;money&amp;quot; :: &amp;quot;candidate&amp;quot; :: Nil)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Тестовые примеры&amp;lt;/span&amp;gt;&lt;br /&gt;
  '''val '''unknownText1 = &amp;quot;I use git&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText2 = &amp;quot;Today's weather is snow&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  '''val '''unknownText3 = &amp;quot;I will vote '''for '''that party&amp;quot;.split(&amp;quot; &amp;quot;)&lt;br /&gt;
  &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// Классификация&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText1).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// technology&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText2).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// weather&amp;lt;/span&amp;gt;&lt;br /&gt;
  println(bayes.classify(unknownText3).map(_.category).getOrElse(&amp;quot;&amp;quot;)) &amp;lt;span style=&amp;quot;color:#3D9970&amp;gt;// government&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===EM-алгоритм===&lt;br /&gt;
Освновная статья: [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 7.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&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.clustering.kmeans&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.clustering._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&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 '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)&lt;br /&gt;
  '''val '''y = kMeans.getClusterLabel&lt;br /&gt;
  plot(x, y, '.', Palette.COLORS)&lt;br /&gt;
&lt;br /&gt;
===Бустинг, AdaBoost===&lt;br /&gt;
Освновная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
===Уменьшение размерности===&lt;br /&gt;
Освновная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69564</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=69564"/>
				<updated>2019-01-28T14:50:50Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&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]]&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;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69563</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=69563"/>
				<updated>2019-01-28T14:50:39Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Библиотеки для градиентного бустинга */&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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69562</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=69562"/>
				<updated>2019-01-28T14:50:17Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Уменьшение размерности */&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69560</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=69560"/>
				<updated>2019-01-28T14:49:50Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* EM-алгоритм */&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}}&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69558</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=69558"/>
				<updated>2019-01-28T14:49:31Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Метод опорных векторов (SVM) */&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-алгоритм}}&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}}&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69557</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=69557"/>
				<updated>2019-01-28T14:49:19Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Метод опорных векторов (SVM) */&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-алгоритм}}&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}}&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69556</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=69556"/>
				<updated>2019-01-28T14:48:53Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Обработка естественного языка */&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)}}&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-алгоритм}}&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}}&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69555</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=69555"/>
				<updated>2019-01-28T14:48:35Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Дерево решений и случайный лес */&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;
Построение и обучение двух моделей. Первая на основе [[Байесовская классификация | Байесовской классификации]], а вторая использует метод опорных векторов:&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)}}&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-алгоритм}}&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}}&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69553</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=69553"/>
				<updated>2019-01-28T14:48:15Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Метрический классификатор и метод ближайших соседей */&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)}}&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;
Построение и обучение двух моделей. Первая на основе [[Байесовская классификация | Байесовской классификации]], а вторая использует метод опорных векторов:&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)}}&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-алгоритм}}&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}}&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69552</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=69552"/>
				<updated>2019-01-28T14:47:39Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Линейная регрессия */&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)}}&lt;br /&gt;
====Дерево решений и случайный лес====&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Примеры использования (в scikit-learn)}}&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;
Построение и обучение двух моделей. Первая на основе [[Байесовская классификация | Байесовской классификации]], а вторая использует метод опорных векторов:&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)}}&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-алгоритм}}&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}}&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69551</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=69551"/>
				<updated>2019-01-28T14:47:15Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Описание */&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|Линейная регрессия}}&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;
{{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)}}&lt;br /&gt;
====Дерево решений и случайный лес====&lt;br /&gt;
{{Main|Дерево решений и случайный лес#Примеры использования (в scikit-learn)}}&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;
Построение и обучение двух моделей. Первая на основе [[Байесовская классификация | Байесовской классификации]], а вторая использует метод опорных векторов:&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)}}&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-алгоритм}}&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}}&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;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]]&lt;br /&gt;
*[[:Примеры кода на Java|Примеры кода на Java]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69550</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=69550"/>
				<updated>2019-01-28T14:46:11Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: &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;
==См. также==&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>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D0%BF%D0%BE%D0%B7%D0%BD%D0%B0%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=69549</id>
		<title>Распознавание речи</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B0%D1%81%D0%BF%D0%BE%D0%B7%D0%BD%D0%B0%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D1%87%D0%B8&amp;diff=69549"/>
				<updated>2019-01-28T14:44:58Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Распознавание речи'''(Speech Recognition) - процесс преобразования речевого сигнала в цифровую информацию.&lt;br /&gt;
&lt;br /&gt;
Задачей распознавания является сопоставление набору акустических признаков речевого сигнала или наблюдений &lt;br /&gt;
&amp;lt;math&amp;gt;X(x_1 ,...,x_n)&amp;lt;/math&amp;gt; последовательности слов &lt;br /&gt;
&amp;lt;math&amp;gt;W(w_1 ,...,w_k)&amp;lt;/math&amp;gt;, имеющих наибольшую вероятность правдоподобия среди всех кандидатов. Для этого используется формула Байеса:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;W = argmax \left[\frac{P(W)*P(X|W)}{P(X)}\right]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Причем, в процессе распознавания вероятность уже полученных признаков Р(Х) не подлежит оптимизации и знаменатель в формуле не испльзуется:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;W = argmax[P(W)*P(X|W)]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Классификация систем распознавания речи==&lt;br /&gt;
&lt;br /&gt;
Системы распознавания речи классифицируются&amp;lt;ref&amp;gt;''Федосин С.А., Еремин А. Ю.'' Классификация систем распознавания речи. — Саранск. : МГУ им. Н.П. Огарева, 2009. — С. 3.&amp;lt;/ref&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;
Системы распознавания речи впервые появились в 1952 году. С тех пор методы распознавания не раз менялись.&lt;br /&gt;
Ранее использовались такие методы и алгоритмы, как:&lt;br /&gt;
* Динамическое программирование (Dynamic Time Warping) - временные динамические алгоритмы, выполняющие классификацию на основе сравнения с эталоном.&lt;br /&gt;
* Методы дискриминантного анализа, основанные на Байесовской дискриминации (Bayesian discrimination).&lt;br /&gt;
* Скрытые Марковские Модели (Hidden Markov Model).&lt;br /&gt;
* Нейронные сети (Neural Networks).&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;
''Акустическая модель'' — это функция, принимающая на вход небольшой участок акустического сигнала (кадр или frame) и выдающая распределение вероятностей различных фонем на этом кадре. Таким образом, акустическая модель дает нам возможность по звуку восстановить, что было произнесено — с той или иной степенью уверенности.&amp;lt;br&amp;gt;&lt;br /&gt;
''Фонема'' - элементарная единица человеческой речи.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Языковая модель===&lt;br /&gt;
&lt;br /&gt;
''Языковая модель'' - позволяет узнать, какие последовательности слов в языке более вероятны, а какие менее.&lt;br /&gt;
Здесь в самом простом случае требуется предсказать следующее слово по известным предыдущим словам. В традиционных системах применялись модели типа N-грамм, в которых на основе большого количества текстов оценивались распределения вероятности появления слова в зависимости от N предшествующих слов. Для получения надежных оценок распределений параметр N должен быть достаточно мал: одно, два или три слова — модели униграмм, биграмм или триграмм соответственно. Внедрение языковой модели в систему распознавания речи позволило значительно повысить качество распознавания за счет учета контекста.&lt;br /&gt;
&lt;br /&gt;
===Декодер===&lt;br /&gt;
&lt;br /&gt;
В ходе работы системы автоматического распознавания речи задача распознавания сводится к определению наиболее вероятной последовательности слов, соответствующих содержанию речевого сигнала. Наиболее вероятный кандидат должен определяться с учетом как акустической, так и лингвистической информации. Это означает, что необходимо производить эффективный поиск среди возможных кандидатов с учетом различной вероятностной информации. При распознавании слитной речи число таких кандидатов огромно, и даже использование самых простых моделей приводит к серьезным проблемам, связанным с быстродействием и памятью систем. Как результат, эта задача выносится в отдельный модуль системы автоматического распознавания речи, называемый декодером.&lt;br /&gt;
Декодер должен определять наиболее грамматически вероятную гипотезу для неизвестного высказывания – то есть определять наиболее вероятный путь по сети распознавания, состоящей из моделей слов (которые, в свою очередь, формируются из моделей отдельных фонов). Правдоподобие (likelihood) гипотезы определяется двумя факторами, а именно вероятностями последовательности фонов, приписываемыми акустической моделью, и вероятностями следования слов друг за другом, определяемыми моделью языка. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим математическую основу декодеров.&amp;lt;br&amp;gt;&lt;br /&gt;
Отбрасывая несущественный на этапе распознавания знаменатель, запишем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;W = argmax [P(W)P(XW)]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;X = x_1^T = x_1 ,..., x_N&amp;lt;/math&amp;gt; – последовательность векторов признаков входного сигнала, &amp;lt;math&amp;gt;W = w_1^n = w_1 ,..., w_n&amp;lt;/math&amp;gt; – последовательность слов, принадлежащих словарю размером &amp;lt;math&amp;gt;N_W&amp;lt;/math&amp;gt;. Первый множитель P(W) описывает вклад лингвистического модуля, второй P(X|W) – лексического, фонетического и акустического источников знаний. В соответствии с концепцией марковских цепей, второй множитель представляет собой сумму вероятностей всех возможных последовательностей состояний, что приводит к уравнению: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;W = argmax [P(W)\sum_{S_1^T} P(x_1^T, s_1^T | w_1^N)]&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;s_1^T&amp;lt;/math&amp;gt; – одна из последовательностей состояний, порождаемых последовательностью слов &amp;lt;math&amp;gt;w_1^n&amp;lt;/math&amp;gt;. На практике применяется критерий Витерби&amp;lt;ref&amp;gt;''Тампель И.Б, Карпов А.А.'' Автоматическое распознавание речи. — СПб. : Университет ИТМО, 2016. — С. 113.&amp;lt;/ref&amp;gt;. – ищется последовательность состояний, дающая максимальный вклад в сумму:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;W = argmax[P(W)^aMax[P(x_1^T, s_1^T | w_1^N)]]&amp;lt;/math&amp;gt;&amp;lt;/center&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;
&lt;br /&gt;
'''Спектр Фурье'''&lt;br /&gt;
&lt;br /&gt;
Спектр Фурье получают, используя алгоритм БПФ (Быстрого Преобразования Фурье) с длиной окна равной 2-4 периода основного тона, что составляет около 20 мс. При частоте квантования 10-16 кГц выбирается окно 256 отсчетов.&lt;br /&gt;
&lt;br /&gt;
Для ослабления искажений сигнала, вызванных применением к непрерывному сигналу конечного окна анализа, чаще всего используется окно Хэмминга по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;S'(n) = [0.54 - 0.46cos\left(\frac{2\pi n}{N-1}\right)]*S(n)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где n = 1..N, N – размерность окна, S(n) – отсчеты речевого сигнала.&lt;br /&gt;
&lt;br /&gt;
'''Спектр Фурье в шкале мел'''&lt;br /&gt;
&lt;br /&gt;
К каждому кадру, полученного Фурье спектра применяется блок мел-фильтров — треугольных пересекающихся фильтров, расположенных наиболее плотно в области нижних частот. Количество фильтров — 26. Для расчета фильтров выбирается верхняя и нижняя частота. Затем осуществляется переход от частотной шкалы к мел-шкале по формуле:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;M(f) = 1127*ln\left(1 + \frac{f}{700}\right)&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На мел-шкале выбираются линейно расположенные точки (28 точек для 26 фильтров), после чего, производится обратный переход в частотную область.&lt;br /&gt;
&lt;br /&gt;
'''Коэффициенты линейного предсказания'''&lt;br /&gt;
&lt;br /&gt;
Модель линейного предсказания речи предполагает, что передаточная функция голосового тракта представляется полюсным фильтром с передаточной&lt;br /&gt;
функцией:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;H(z) = \frac{1}{\sum_{i=0}^p a_i z^{-i}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где p – число полюсов и &amp;lt;math&amp;gt;a_0 = 1&amp;lt;/math&amp;gt;;&lt;br /&gt;
Фильтр с такой передаточной функцией позволяет описать поведение сглаженного спектра речевого сигнала с хорошей точностью, за исключением назализованных звуков. Коэффициенты фильтра {&amp;lt;math&amp;gt;a_i&amp;lt;/math&amp;gt;} – выбираются путем минимизации среднеквадратичной ошибки предсказания, просуммированной на окне анализа.&lt;br /&gt;
&lt;br /&gt;
'''Кепстр'''&lt;br /&gt;
&lt;br /&gt;
Кепстр (''cepstrum'') сигнала на основе спектра Фурье вычисляется путем применения косинусного Фурье преобразования к логарифму спектра:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;c_j = \sqrt{\frac{2}{N}}\sum_{i=0}^{N-1} \left[s_icos\left(\frac{\pi(j+1)(i+0.5)}{N}\right)\right] = \sum_{i=0}^{N-1} C_{j,i}s_i&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;s_i&amp;lt;/math&amp;gt; – логарифм спектра, N – количество отсчётов спектра, &amp;lt;math&amp;gt;C_{i,j}&amp;lt;/math&amp;gt; – унитарная матрица косинусного преобразования.&lt;br /&gt;
&lt;br /&gt;
Кепстральные коэффициенты, полученные приведённым способом из ''мел'' спектра Фурье, широко используются для распознавания с помощью марковских моделей и носят название MFCC (Mel-frequency cepstral coefficients).&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;
* процент правильно распознанных слов (WRR - Word Recognition Rate);&lt;br /&gt;
* процент неправильно распознанных слов (WER - Word Error Rate);&lt;br /&gt;
* процент неправильно распознанных предложений/фраз (SER - Sentence Error Rate);&lt;br /&gt;
&lt;br /&gt;
Поскольку с развитием речевых технологий показатель WER все более приближается к нулю, то значение улучшения WER более наглядно, чем улучшение точности распознавания слов.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;WER = \frac{S+D+I}{T} * 100%&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где T - количество слов в распознаваемой фразе,&lt;br /&gt;
S - количество замененных слов,&lt;br /&gt;
D - количество удаленных слов,&lt;br /&gt;
I - количество вставленных слов.&lt;br /&gt;
Показатель WER может быть больше 100%.&lt;br /&gt;
&lt;br /&gt;
Другим важным критерием оценки систем распознавания слитной речи является - скорость обработки речи. Она вычисляется с помощью показателя скорости (Real-Time Factor, Speed Factor):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;RTF = \frac{T_{proc}}{T_{signal}}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;T_{signal}&amp;lt;/math&amp;gt; - длительность обрабатываемого аудиосигнала;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;T_{proc}&amp;lt;/math&amp;gt; - время, необходимое для обработки сигнала.&amp;lt;br&amp;gt;&lt;br /&gt;
Если &amp;lt;math&amp;gt;RTF \leqslant 1.0&amp;lt;/math&amp;gt; - то распознавание речи ведется в режиме реального времени.&lt;br /&gt;
&lt;br /&gt;
==Применение==&lt;br /&gt;
&lt;br /&gt;
Системы распознавания речи начали развиваться как специальные сервисы для людей с ограниченными возможностями, но также нашли применение в различных сферах бизнеса, таких как:&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;
Основные отрасли применения:&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;&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/Распознавание_образов Распознавание образов]&lt;br /&gt;
* [https://habr.com/company/yandex/blog/198556/ Распознавание речи от Яндекса]&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/Субвокальное_распознавание Субвокальное распознавание]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/Speech_recognition] - статья на Википедии&lt;br /&gt;
# Тампель И.Б, Карпов А.А. Автоматическое распознавание речи. Учебное пособие. — СПб: Университет ИТМО, 2016. — 138 с.&lt;br /&gt;
# [http://fetmag.mrsu.ru/2010-2/pdf/SpeechRecognition.pdf] - статья &amp;quot;Классификация систем распознавания речи&amp;quot;.&lt;br /&gt;
# [https://moluch.ru/archive/147/41443/] - статья &amp;quot;Выделение границ фонем речевого сигнала с помощью мел-частотных спектральных коэффициентов&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA&amp;diff=69548</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%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA&amp;diff=69548"/>
				<updated>2019-01-28T14:44:23Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Вариационный автокодировщик''' (англ. ''Variational Autoencoder'', ''VAE'') {{---}} это [[автокодировщик]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (a.k.a. генеративная модель, которая учится отображать объекты в заданное скрытое пространство (и обратно)) основанный на вариационном выводе.&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;
'''Порождающее моделирование''' (англ. ''Generative modelling'') {{---}} область машинного обучения, имеющая дело с распределением &amp;lt;math&amp;gt;P(X)&amp;lt;/math&amp;gt;, определенном на датасете &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt; из пространства (возможно многомерного) &amp;lt;math&amp;gt;\Chi&amp;lt;/math&amp;gt;. Так, например, популярные задачи генерации картинок имеют дело с огромным количеством измерений (пикселей). &lt;br /&gt;
&lt;br /&gt;
Также как и в обыкновенных кодировщиках у нас имеется скрытое вероятностное пространство &amp;lt;math&amp;gt;Z&amp;lt;/math&amp;gt; соответствующее случайной величине &amp;lt;math&amp;gt;(z, P(z))&amp;lt;/math&amp;gt; (распределенной как-нибудь фиксированно, здесь &amp;lt;math&amp;gt;\sim N(0, 1)&amp;lt;/math&amp;gt;). И мы хотим иметь декодер &amp;lt;math&amp;gt;f(z, \theta) \colon Z \times \Theta \to \Chi &amp;lt;/math&amp;gt;. При этом мы хотим найти такие &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, чтобы после разыгрывания &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; по &amp;lt;math&amp;gt;P(z)&amp;lt;/math&amp;gt; мы получили &amp;quot;что-то похожее&amp;quot; на элементы &amp;lt;math&amp;gt;X&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Вообще, для любого &amp;lt;math&amp;gt;x \in X&amp;lt;/math&amp;gt; мы хотим считать &amp;lt;math&amp;gt;P(x) = \int P(x|z; \theta)P(z)dz&amp;lt;/math&amp;gt;, здесь мы заменили &amp;lt;math&amp;gt;f(z, \theta)&amp;lt;/math&amp;gt; на &amp;lt;math&amp;gt;P(x|z; \theta)&amp;lt;/math&amp;gt;, чтобы явно показать зависимость между &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; и после этого применить формулу полной вероятности. Обычно &amp;lt;math&amp;gt;P(x|z; \theta)&amp;lt;/math&amp;gt; около нуля почти для всех пар &amp;lt;math&amp;gt;(x, z)&amp;lt;/math&amp;gt;. Основная идея в том, что мы хотим теперь генерировать &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;, который бы давали что-то около &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и только их суммировать в &amp;lt;math&amp;gt;P(x)&amp;lt;/math&amp;gt;. Для этого нам требуется ввести еще одно распределение &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt;, которое будет получать &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; и говорить распределение на &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt; которое наиболее вероятно будет генерировать нам такой &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Теперь нам нужно как-то сделать похожими распределения &amp;lt;math&amp;gt;E_{z\sim Q}P(X|z)&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P(X)&amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим следующую дивергенцию Кульбака-Лейблера.&lt;br /&gt;
:&amp;lt;math&amp;gt;D[Q(z)||P(z|X)] = E_{z∼Q} [log Q(z|X) − log P(z|X)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Распишем &amp;lt;math&amp;gt;P(z|X)&amp;lt;/math&amp;gt; как &amp;lt;math&amp;gt;P(X|z) * P(z) / P(X)&amp;lt;/math&amp;gt;.&lt;br /&gt;
:&amp;lt;math&amp;gt;D[Q(z)||P(z|X)] = E_{z∼Q} [log Q(z) − log P(X|z) - log P(z)] + log P(X)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Что эквивалентно:&lt;br /&gt;
:&amp;lt;math&amp;gt;logP(x) - D[Q(z)||P(z|X)] = E_{z∼Q}[log P(X|z)] - D[Q(z)||P(z)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Рассмотрим эту штуку для &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt;, тогда:&lt;br /&gt;
:&amp;lt;math&amp;gt;logP(x) - D[Q(z|X)||P(z|X)] = E_{z∼Q}[log P(X|z)] - D[Q(z|X)||P(z)]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Посмотрим, на это равенство. Правую часть мы можем оптимизировать градиентным спуском (пусть пока и не совсем понятно как).&lt;br /&gt;
В левой же части первое слагаемое -- то, что мы хотим максимизировать. В то же время &amp;lt;math&amp;gt;D[Q(z|X)||P(z|X)]&amp;lt;/math&amp;gt; мы хотим минимизировать. Если у нас &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt; -- достаточно сильная модель, то в какой-то модель она будет хорошо матчить &amp;lt;math&amp;gt;P(z|X)&amp;lt;/math&amp;gt;, а значит их дивергенция Кульбака-Лейблера будет почти 0. А значит на это слагаемое можно забить. И стараться максимизировать правую часть. В качестве бонуса мы еще получили более &amp;quot;поддатливую&amp;quot; &amp;lt;math&amp;gt;P(z|X)&amp;lt;/math&amp;gt;, вместо нее можно смотреть на &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь разберемся как оптимизировать правую часть. Сначала нужно определиться с моделью для &amp;lt;math&amp;gt;Q(z|X)&amp;lt;/math&amp;gt;. Обычно ее берут равной &amp;lt;math&amp;gt;N(z|\mu(X, \theta), \sigma(X, \theta))&amp;lt;/math&amp;gt;. Где &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; какие-то детерминированные функции на X с обучаемыми параметрами &amp;lt;math&amp;gt;\theta&amp;lt;/math&amp;gt;, которые мы впредь будем опускать). Ага, нейронки. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Нетрудно проверить, что для дивергенция Кульбака-Лейблера двух нормальных распределений имеет следующий вид.&lt;br /&gt;
:&amp;lt;math&amp;gt;D_{K}[N(\mu_1, \Sigma_0)||N(\mu_1, \Sigma_0)]&amp;lt;/math&amp;gt;, KLD есть &amp;lt;math&amp;gt;\frac{1}{2} (tr(\Sigma_1^{-1}\Sigma_0) + (\mu_1 - \mu_0)^T\Sigma_1^{-1}(\mu_1 - \mu_0) - k + log(\frac{det\Sigma_1}{det\Sigma_0})) &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это значит, что&lt;br /&gt;
:&amp;lt;math&amp;gt;D[Q(z|X)||P(z)] = D[N(\mu(X), \Sigma(X))||N(0, I)] = \frac12 (tr(\Sigma(X)) + \mu(X)^T\mu(X) - k - log(det\Sigma(X)))&amp;lt;/math&amp;gt;. &lt;br /&gt;
Теперь здесь &lt;br /&gt;
можно считать градиенты, для BackPropagation. С первым слагаемым в правой части все немного сложнее. &amp;lt;math&amp;gt;E_{z∼Q}[log P(X|z)]&amp;lt;/math&amp;gt; мы можем считать методом Монте-Карло(МК), но тогда такая штука (из-за того, что переменные спрятаны в распределении, из которого мы генерируем себе выборку, для МК) не является гладкой относительно них, а значит непонятно, как проталкивать через это градиент. Для того, чтобы все-таки можно было протолкнуть градиент, применяется так называемый reparametrization trick, который базируется на простой формуле &amp;lt;math&amp;gt;N(\Sigma(X), \mu(X)) = \mu(X) + \Sigma^{\frac12}(X) * N(0, I) &amp;lt;/math&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;E_{z∼Q}[log P(X|z)] = E_{\epsilon \sim N(0, I)}[log P(X = f(\mu(X) + \Sigma^{\frac12}(X) * \epsilon), \theta)]&amp;lt;/math&amp;gt;. &lt;br /&gt;
В такой форме мы уже можем использовать BackPropagation для переменных из функций &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;\mu&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Следующая картинка лучше поможет осознать структуру VAE и, в частности, зачем нужен (и как работает) reparametrization trick.&lt;br /&gt;
&lt;br /&gt;
На левой части диаграмма без использования reparameterization trick. &lt;br /&gt;
На правой части диаграмма с использованием reparameterization trick. &lt;br /&gt;
&lt;br /&gt;
[[Файл:VAE.PNG]]&lt;br /&gt;
&lt;br /&gt;
взято из https://arxiv.org/pdf/1606.05908.pdf&lt;br /&gt;
&lt;br /&gt;
== Пример реализации ==&lt;br /&gt;
Ниже приведена реализация частного случая VAE на языке Python с использованием библиотеки Pytorch.&lt;br /&gt;
Эта реализация работает с датасетом MNIST.&lt;br /&gt;
Размерность скрытого слоя {{---}} 2. &lt;br /&gt;
Координаты в нем считаются независимыми (из-за этого, например, матрица &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; диагональная, и формула для расчета KLD немного другая).&lt;br /&gt;
&lt;br /&gt;
 class VariationalAutoencoder(nn.Module):&lt;br /&gt;
    def __init__(self):&lt;br /&gt;
        super().__init__()&lt;br /&gt;
        self.mu = nn.Linear(32, 2)&lt;br /&gt;
        self.gamma = nn.Linear(32, 2)&lt;br /&gt;
        self.encoder = nn.Sequential(nn.Linear(784, 32), nn.ReLU(True))&lt;br /&gt;
        self.decoder = nn.Sequential(nn.Linear(2, 32), nn.ReLU(True), nn.Linear(32, 784), nn.Sigmoid())&lt;br /&gt;
 &lt;br /&gt;
    def forward(self, x):&lt;br /&gt;
        mu, gamma = self.encode(x)&lt;br /&gt;
        encoding = self.reparameterize(mu, gamma)&lt;br /&gt;
        x = self.decoder(encoding)&lt;br /&gt;
        return x, mu, gamma&lt;br /&gt;
 &lt;br /&gt;
    def reparameterize(self, mu, gamma):&lt;br /&gt;
        if self.training:&lt;br /&gt;
            sigma = torch.exp(0.5*gamma)&lt;br /&gt;
            std_z = Variable(torch.from_numpy(np.random.normal(0, 1, size=sigma.size())).float())&lt;br /&gt;
            encoding = std_z.mul(sigma).add(mu)&lt;br /&gt;
            return encoding&lt;br /&gt;
        else:&lt;br /&gt;
            return mu&lt;br /&gt;
 &lt;br /&gt;
    def encode(self, x):&lt;br /&gt;
        x = self.encoder(x)&lt;br /&gt;
        mu = self.mu(x)&lt;br /&gt;
        gamma = self.gamma(x)&lt;br /&gt;
        return mu, gamma&lt;br /&gt;
  &lt;br /&gt;
    def decode(self, x):&lt;br /&gt;
        return self.decoder(x)&lt;br /&gt;
 &lt;br /&gt;
    def latent(self, x):&lt;br /&gt;
        mu, gamma = self.encode(x)&lt;br /&gt;
        encoding = self.reparameterize(mu, gamma)&lt;br /&gt;
        return encoding&lt;br /&gt;
 &lt;br /&gt;
 def loss_function(input, output, mu, gamma, batch_size=batch_size):&lt;br /&gt;
    BCE = F.binary_cross_entropy(output, input)&lt;br /&gt;
    KLD = -0.5*torch.sum(1 + gamma - mu.pow(2) - gamma.exp())&lt;br /&gt;
    KLD /= batch_size*784&lt;br /&gt;
    return BCE + KLD&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;)&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;
*[[:Generative Adversarial Nets (GAN)|Порождающие состязательные сети]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
*[https://habr.com/ru/post/429276/ Вариационные автокодировщики: теория и рабочий код]&lt;br /&gt;
*[https://jaan.io/what-is-variational-autoencoder-vae-tutorial/ Tutorial - What is a variational autoencoder?]&lt;br /&gt;
*[https://towardsdatascience.com/intuitively-understanding-variational-autoencoders-1bfe67eb5daf Intuitively Understanding Variational Autoencoders]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[https://arxiv.org/abs/1606.05908 Tutorial on Variational Autoencoders]&lt;br /&gt;
*Datalore презентация Дениса Степанова&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Порождающие модели]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)&amp;diff=69547</id>
		<title>Generative Adversarial Nets (GAN)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)&amp;diff=69547"/>
				<updated>2019-01-28T14:43:58Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Арх_ган.png|450px|thumb|Оригинальная архитектура GAN]]&lt;br /&gt;
&lt;br /&gt;
'''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') $-$ это алгоритм машинного обучения, входящий в семейство [[:Порождающие модели|порождающих моделей]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, другая пытается отличить настоящие образцы от сгенерированных. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году. &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;p_{data}&amp;lt;/tex&amp;gt;, заданного на &amp;lt;tex&amp;gt; \mathbb R^n &amp;lt;/tex&amp;gt;, а также некоторое пространство латентных факторов &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; из распределения &amp;lt;tex&amp;gt;p_{z}&amp;lt;/tex&amp;gt;, например, случайные вектора из равномерного распределения &amp;lt;tex&amp;gt; \mathbb U^t(0,1) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две нейронные сети: первая $-$ ''генератор'' &amp;lt;tex&amp;gt; G: Z \rightarrow \mathbb R^n &amp;lt;/tex&amp;gt; с параметрами &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;, цель которой сгенерировать похожий образец из &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;, и вторая $-$ ''дискриминатор'' &amp;lt;tex&amp;gt;D: \mathbb R^n \rightarrow \mathbb [0,1] &amp;lt;/tex&amp;gt; с параметрами &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;, цель которой выдавать максимальную оценку на образцах из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и минимальную на сгенерированных образцах из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Распределение, порождаемое генератором будем обозначать &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt;. Так же заметим, что в текущем изложении не принципиальны архитектуры нейронных сетей, поэтому можно считать, что параметры &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; являются просто параметрами многослойных персептронов.&lt;br /&gt;
&lt;br /&gt;
В качестве примера можно рассматривать генерацию реалистичных фотографий: в этом случае, входом для генератора может быть случайный многомерный шум, а выходом генератора (и входом для дискриминатора) RGB-изображение; выходом же для дискриминатора будет вероятность, что фотография настоящая, т.е число от 0 до 1. &lt;br /&gt;
&lt;br /&gt;
Наша задача выучить распределение &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; так, чтобы оно как можно лучше описывало &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;. Зададим функцию ошибки для получившейся модели. Со стороны дискриминатора мы хотим распознавать образцы из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; как правильные, т.е в сторону единицы, и образцы из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; как неправильные, т.е в сторону нуля, таким образом нужно максимизировать следующую величину:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;\mathop{E}\limits_{x \sim p_{data}}[logD(x)] + \mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))] = \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))]&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Со стороны же генератора требуется научиться &amp;quot;обманывать&amp;quot; дискриминатор, т.е минимизировать по &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; второе слагаемое предыдущего выражения. Другими словами, &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; играют в так называемую ''минимаксную игру'', решая следующую задачу оптимизации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; \min\limits_{G}\max\limits_{D} \mathop{E}\limits_{x \sim p_{data}}[logD(x)]  + \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))]  &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Теоретическое обоснование того, что такой метод заставляет &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; сходится к &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt; описано в исходной статье. &amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1406.2661.pdf  Ian J. Goodfellow {{---}} Generative Adversarial Nets]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Оригинальный алгоритм обучения GAN==&lt;br /&gt;
[[File:Обучение_ган.png|450px|thumb|right|Визуализация генерирования фотографии с помощью DCGAN по одному и тому же шуму в зависимости от итерации обучения. Источник: https://arxiv.org/pdf/1701.07875.pdf]]&lt;br /&gt;
&lt;br /&gt;
В процессе обучения требуется делать два шага оптимизации поочередно: сначала обновлять веса генератора &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; при фиксированном &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;, а затем веса дискриминатора &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; при фиксированном &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;. На практике дискриминатор обновляется &amp;lt;tex&amp;gt;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;font color=green&amp;gt;// num_iteration {{---}} число итераций обучения &amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' GAN:&lt;br /&gt;
   '''for''' i = 1..num_iteration '''do'''&lt;br /&gt;
     '''for''' j = 1..k '''do'''&lt;br /&gt;
       $z$ = getBatchFromNoisePrior($p_z$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ &amp;lt;/font&amp;gt;&lt;br /&gt;
       $x$ = getBatchFromDataGeneratingDistibution($p_{data}$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{x_1, . . . , x_m\}$ из распределения $p_{data}$ &amp;lt;/font&amp;gt;       &lt;br /&gt;
       &amp;lt;tex&amp;gt;d_w \leftarrow \mathop{\nabla}_{\gamma} { \frac{1}{m} \sum_{t = 1}^m \limits} [logD(x_t)]  + [log(1-D(G(z_t))] &amp;lt;/tex&amp;gt; &amp;lt;font color=green&amp;gt;//Обновляем дискриминатор в сторону возрастания его градиента &amp;lt;/font&amp;gt;&lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
     $z$ = getBatchFromNoisePrior($p_z$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ &amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g_w \leftarrow \mathop{\nabla}_{\theta}  { \frac{1}{m} \sum_{t = 1}^m \limits} [log(1-D(G(z_t))] &amp;lt;/tex&amp;gt; &amp;lt;font color=green&amp;gt;//Обновляем генератор в сторону убывания его градиента &amp;lt;/font&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
Обновления на основе градиента могут быть сделаны любым стандартным способом, например, в оригинальной статье использовался [[:Cтохастический градиентный спуск|стохастический градиентный спуск]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; с импульсом.&lt;br /&gt;
&lt;br /&gt;
==Улучшение обучения GAN==&lt;br /&gt;
&lt;br /&gt;
Большинство GAN'ов подвержено следующим проблемам:&lt;br /&gt;
* Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся,&lt;br /&gt;
* Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов,&lt;br /&gt;
* Исчезающий градиент (diminished gradient): дискриминатор становится слишком &amp;quot;сильным&amp;quot;, а градиент генератора исчезает и обучение не происходит,&lt;br /&gt;
* Высокая чувствительность к гиперпараметрам.&lt;br /&gt;
&lt;br /&gt;
Универсального подхода к их решению нет, но существуют практические советы&amp;lt;ref&amp;gt; [https://github.com/soumith/ganhacks  How to Train a GAN? Tips and tricks to make GANs work]&amp;lt;/ref&amp;gt;, которые могут помочь. Основными из них являются:&lt;br /&gt;
# Нормализация данных. Все признаки в диапазоне $[-1; 1]$.&lt;br /&gt;
# Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот.&lt;br /&gt;
# Сэмплирование из многомерного нормального распределения вместо равномерного.  &lt;br /&gt;
# Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$.&lt;br /&gt;
# Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы.&lt;br /&gt;
&lt;br /&gt;
==Применение==&lt;br /&gt;
&lt;br /&gt;
[[File:прогресс_ганов.jpg|450px|thumb|right|Прогресс в генерации фотографий с помощью GAN. Источник: https://twitter.com/goodfellow_ian]]&lt;br /&gt;
&lt;br /&gt;
Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами:&lt;br /&gt;
&lt;br /&gt;
* Auxiliary GAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1610.09585.pdf Augustus Odena {{---}} Conditional Image Synthesis with Auxiliary Classifier GANs]&amp;lt;/ref&amp;gt;: вариант GAN-архитектуры, использующий метки данных.&lt;br /&gt;
* SN-GAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1802.05957.pdf Takeru Miyato {{---}} SPECTRAL NORMALIZATION FOR GENERATIVE ADVERSARIAL NETWORKS]&amp;lt;/ref&amp;gt;: GAN с новым подходом решения проблемы нестабильного обучения через спектральную нормализацию.&lt;br /&gt;
* SAGAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1805.08318.pdf Han Zhang {{---}} Self-Attention Generative Adversarial Networks]&amp;lt;/ref&amp;gt;: GAN, основанный на механизме внимания.&lt;br /&gt;
* BigGAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1809.11096.pdf Andrew Brock {{---}} LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS]&amp;lt;/ref&amp;gt;: GAN с ортогональной регуляризацией, позволившей разрешить проблему коллапсирования при долгом обучении.&lt;br /&gt;
&lt;br /&gt;
Кроме простой генерации изображений, существуют достаточно необычные применения, дающие впечатляющие результаты не только на картинках, но и на звуке:&lt;br /&gt;
&lt;br /&gt;
* CycleGAN&amp;lt;ref&amp;gt; [https://junyanz.github.io/CycleGAN/ Jun-Yan Zhu &amp;amp; Taesung Park {{---}} Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks]&amp;lt;/ref&amp;gt;: меняет изображения c одного домена на другой, например, лошадей на зебр,&lt;br /&gt;
* SRGAN&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1609.04802 Christian Ledig {{---}} Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network]&amp;lt;/ref&amp;gt;: создает изображения с высоким разрешением из более низкого разрешения,&lt;br /&gt;
* Pix2Pix&amp;lt;ref&amp;gt; [https://phillipi.github.io/pix2pix/ Phillip Isola {{---}} Image-to-Image Translation with Conditional Adversarial Nets]&amp;lt;/ref&amp;gt;: создает изображения по семантической окраске,&lt;br /&gt;
* StackGAN&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1612.03242 Han Zhang {{---}} StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks]&amp;lt;/ref&amp;gt;: создает изображения по заданному тексту,&lt;br /&gt;
* MidiNet&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1703.10847 Li-Chia Yang {{---}} MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION]&amp;lt;/ref&amp;gt;: генерирует последовательность нот, таким образом, создает мелодию.&lt;br /&gt;
&lt;br /&gt;
==CGAN (Conditional Generative Adversarial Nets)==&lt;br /&gt;
&lt;br /&gt;
[[File:CGAN_architecture.png|450px|thumb|Архитектура CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Условные порождающие состязательные сети''' (англ. ''Conditional Generative Adversarial Nets, CGAN'') $-$ это модифицированная версия алгоритма GAN, которая позволяет &lt;br /&gt;
генерировать объекты с дополнительными условиями '''y'''. '''y''' может быть любой дополнительной информацией, например, меткой класса или данными из других моделей. Добавление данных условий в существующую архитектуру осуществляется с помощью расширения вектором '''y''' входных данных генератора и дискриминатора.&lt;br /&gt;
&lt;br /&gt;
В таком случае задача оптимизации будет выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; \min\limits_{G}\max\limits_{D} \mathop{E}\limits_{x \sim p_{data}}[logD(x|y)]  + \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z|y))]  &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве примера использования данного алгоритма можно рассмотреть задачу генерации рукописных цифр. ''CGAN'' был натренирован на датасете ''MNIST'' с метками классов представленных в виде ''one-hot'' векторов.&lt;br /&gt;
&lt;br /&gt;
[[File:CGAN_generated.png|450px|thumb|Цифры, сгенерированные с помощью CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]&lt;br /&gt;
&lt;br /&gt;
==DCGAN (Deep Convolutional Generative Adversarial Nets)==&lt;br /&gt;
&lt;br /&gt;
[[File:DCGAN_generator.png|450px|thumb|Архитектура генератора в DCGAN. Источник: https://arxiv.org/pdf/1511.06434.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''DCGAN''' $-$ модификация алгоритма ''GAN'', основными архитектурными изменениями которой являются:&lt;br /&gt;
* Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided''&lt;br /&gt;
''convolutions'') в генераторе.&lt;br /&gt;
* Использование батчинговой нормализации для генератора и дискриминатора.&lt;br /&gt;
* Удаление всех полносвязных скрытых уровней для более глубоких архитектур.&lt;br /&gt;
* Использование ''ReLU'' в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется ''tanh''.&lt;br /&gt;
* Использование ''LeakyReLU'' в качестве функции активации в дискриминаторе для всех слоев.&lt;br /&gt;
&lt;br /&gt;
Помимо задачи генерации объектов, данный алгоритм хорошо показывает себя в качестве ''feature extractor'''а.&lt;br /&gt;
Данный алгоритм был натренирован на датасете ''Imagenet-1k'', после чего были использованы значения со сверточных слоев дискриминатора, подвергнутые ''max-pooling'''у, чтобы образовать матрицы &lt;br /&gt;
&amp;lt;tex&amp;gt; 4 \times 4 &amp;lt;/tex&amp;gt; и получить общий вектор признаков на их основе. ''L2-SVM'' с данным ''feature extractor'''ом на датасете ''CIFAR-10'' превосходит по точности решения, основанные на алгоритме&lt;br /&gt;
''K-Means''. Более подробно об этом вы можете прочитать в статье. &amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1511.06434.pdf  Alec Radford, Luke Metz, Soumith Chintala {{---}} Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks]&amp;lt;/ref&amp;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;
*[[:Variational autoencoder (VAE)|Variational autoencoder (VAE)]]&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. — С. 348-360.&lt;br /&gt;
* [https://medium.com/@jonathan_hui/gan-why-it-is-so-hard-to-train-generative-advisory-networks-819a86b3750b Medium | GAN — Why it is so hard to train Generative Adversarial Networks! ]&lt;br /&gt;
* [https://arxiv.org/pdf/1411.1784.pdf CGAN Paper]&lt;br /&gt;
* [https://arxiv.org/pdf/1511.06434.pdf DCGAN Paper]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Порождающие модели]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)&amp;diff=69546</id>
		<title>Generative Adversarial Nets (GAN)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Generative_Adversarial_Nets_(GAN)&amp;diff=69546"/>
				<updated>2019-01-28T14:43:41Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Арх_ган.png|450px|thumb|Оригинальная архитектура GAN]]&lt;br /&gt;
&lt;br /&gt;
'''Порождающие состязательные сети''' (англ. ''Generative Adversarial Nets, GAN'') $-$ это алгоритм машинного обучения, входящий в семейство [[:Порождающие модели|порождающих моделей]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; и построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, другая пытается отличить настоящие образцы от сгенерированных. Впервые такие сети были представлены Иэном Гудфеллоу в 2014 году. &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;p_{data}&amp;lt;/tex&amp;gt;, заданного на &amp;lt;tex&amp;gt; \mathbb R^n &amp;lt;/tex&amp;gt;, а также некоторое пространство латентных факторов &amp;lt;tex&amp;gt;Z&amp;lt;/tex&amp;gt; из распределения &amp;lt;tex&amp;gt;p_{z}&amp;lt;/tex&amp;gt;, например, случайные вектора из равномерного распределения &amp;lt;tex&amp;gt; \mathbb U^t(0,1) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим две нейронные сети: первая $-$ ''генератор'' &amp;lt;tex&amp;gt; G: Z \rightarrow \mathbb R^n &amp;lt;/tex&amp;gt; с параметрами &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;, цель которой сгенерировать похожий образец из &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;, и вторая $-$ ''дискриминатор'' &amp;lt;tex&amp;gt;D: \mathbb R^n \rightarrow \mathbb [0,1] &amp;lt;/tex&amp;gt; с параметрами &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;, цель которой выдавать максимальную оценку на образцах из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; и минимальную на сгенерированных образцах из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Распределение, порождаемое генератором будем обозначать &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt;. Так же заметим, что в текущем изложении не принципиальны архитектуры нейронных сетей, поэтому можно считать, что параметры &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; являются просто параметрами многослойных персептронов.&lt;br /&gt;
&lt;br /&gt;
В качестве примера можно рассматривать генерацию реалистичных фотографий: в этом случае, входом для генератора может быть случайный многомерный шум, а выходом генератора (и входом для дискриминатора) RGB-изображение; выходом же для дискриминатора будет вероятность, что фотография настоящая, т.е число от 0 до 1. &lt;br /&gt;
&lt;br /&gt;
Наша задача выучить распределение &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; так, чтобы оно как можно лучше описывало &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt;. Зададим функцию ошибки для получившейся модели. Со стороны дискриминатора мы хотим распознавать образцы из &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; как правильные, т.е в сторону единицы, и образцы из &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; как неправильные, т.е в сторону нуля, таким образом нужно максимизировать следующую величину:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt;\mathop{E}\limits_{x \sim p_{data}}[logD(x)] + \mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\mathop{E}\limits_{x \sim p_{gen}}[log(1-D(x))] = \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))]&amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Со стороны же генератора требуется научиться &amp;quot;обманывать&amp;quot; дискриминатор, т.е минимизировать по &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; второе слагаемое предыдущего выражения. Другими словами, &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; играют в так называемую ''минимаксную игру'', решая следующую задачу оптимизации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; \min\limits_{G}\max\limits_{D} \mathop{E}\limits_{x \sim p_{data}}[logD(x)]  + \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z))]  &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Теоретическое обоснование того, что такой метод заставляет &amp;lt;tex&amp;gt;p_{gen}&amp;lt;/tex&amp;gt; сходится к &amp;lt;tex&amp;gt;p_{data}&amp;lt;/tex&amp;gt; описано в исходной статье. &amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1406.2661.pdf  Ian J. Goodfellow {{---}} Generative Adversarial Nets]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Оригинальный алгоритм обучения GAN==&lt;br /&gt;
[[File:Обучение_ган.png|450px|thumb|right|Визуализация генерирования фотографии с помощью DCGAN по одному и тому же шуму в зависимости от итерации обучения. Источник: https://arxiv.org/pdf/1701.07875.pdf]]&lt;br /&gt;
&lt;br /&gt;
В процессе обучения требуется делать два шага оптимизации поочередно: сначала обновлять веса генератора &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt; при фиксированном &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;, а затем веса дискриминатора &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; при фиксированном &amp;lt;tex&amp;gt;\theta&amp;lt;/tex&amp;gt;. На практике дискриминатор обновляется &amp;lt;tex&amp;gt;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;font color=green&amp;gt;// num_iteration {{---}} число итераций обучения &amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' GAN:&lt;br /&gt;
   '''for''' i = 1..num_iteration '''do'''&lt;br /&gt;
     '''for''' j = 1..k '''do'''&lt;br /&gt;
       $z$ = getBatchFromNoisePrior($p_z$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ &amp;lt;/font&amp;gt;&lt;br /&gt;
       $x$ = getBatchFromDataGeneratingDistibution($p_{data}$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{x_1, . . . , x_m\}$ из распределения $p_{data}$ &amp;lt;/font&amp;gt;       &lt;br /&gt;
       &amp;lt;tex&amp;gt;d_w \leftarrow \mathop{\nabla}_{\gamma} { \frac{1}{m} \sum_{t = 1}^m \limits} [logD(x_t)]  + [log(1-D(G(z_t))] &amp;lt;/tex&amp;gt; &amp;lt;font color=green&amp;gt;//Обновляем дискриминатор в сторону возрастания его градиента &amp;lt;/font&amp;gt;&lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
     $z$ = getBatchFromNoisePrior($p_z$)  &amp;lt;font color=green&amp;gt;//Получаем мини-батч $\{z_1, . . . , z_m\}$ из распределения $p_z$ &amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;g_w \leftarrow \mathop{\nabla}_{\theta}  { \frac{1}{m} \sum_{t = 1}^m \limits} [log(1-D(G(z_t))] &amp;lt;/tex&amp;gt; &amp;lt;font color=green&amp;gt;//Обновляем генератор в сторону убывания его градиента &amp;lt;/font&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
Обновления на основе градиента могут быть сделаны любым стандартным способом, например, в оригинальной статье использовался [[:Cтохастический градиентный спуск|стохастический градиентный спуск]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; с импульсом.&lt;br /&gt;
&lt;br /&gt;
==Улучшение обучения GAN==&lt;br /&gt;
&lt;br /&gt;
Большинство GAN'ов подвержено следующим проблемам:&lt;br /&gt;
* Несходимость (non-convergence): параметры модели дестабилизируются и не сходятся,&lt;br /&gt;
* Схлопывание мод распределения (mode collapse): генератор коллапсирует, т.е выдает ограниченное количество разных образцов,&lt;br /&gt;
* Исчезающий градиент (diminished gradient): дискриминатор становится слишком &amp;quot;сильным&amp;quot;, а градиент генератора исчезает и обучение не происходит,&lt;br /&gt;
* Высокая чувствительность к гиперпараметрам.&lt;br /&gt;
&lt;br /&gt;
Универсального подхода к их решению нет, но существуют практические советы&amp;lt;ref&amp;gt; [https://github.com/soumith/ganhacks  How to Train a GAN? Tips and tricks to make GANs work]&amp;lt;/ref&amp;gt;, которые могут помочь. Основными из них являются:&lt;br /&gt;
# Нормализация данных. Все признаки в диапазоне $[-1; 1]$.&lt;br /&gt;
# Замена функции ошибки для $G$ с $\min log (1-D)$ на $\max log D$, потому что исходный вариант имеет маленький градиент на раннем этапе обучения и большой градиент при сходимости, а предложенный наоборот.&lt;br /&gt;
# Сэмплирование из многомерного нормального распределения вместо равномерного.  &lt;br /&gt;
# Использовать нормализационные слои (например, batch normalization или layer normalization) в $G$ и $D$.&lt;br /&gt;
# Использовать метки для данных, если они имеются, т.е обучать дискриминатор еще и классифицировать образцы.&lt;br /&gt;
&lt;br /&gt;
==Применение==&lt;br /&gt;
&lt;br /&gt;
[[File:прогресс_ганов.jpg|450px|thumb|right|Прогресс в генерации фотографий с помощью GAN. Источник: https://twitter.com/goodfellow_ian]]&lt;br /&gt;
&lt;br /&gt;
Чаще всего GAN'ы используются для генерации реалистичных фотографий. Серьезные улучшения в этом направлении были сделаны следующими работами:&lt;br /&gt;
&lt;br /&gt;
* Auxiliary GAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1610.09585.pdf Augustus Odena {{---}} Conditional Image Synthesis with Auxiliary Classifier GANs]&amp;lt;/ref&amp;gt;: вариант GAN-архитектуры, использующий метки данных.&lt;br /&gt;
* SN-GAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1802.05957.pdf Takeru Miyato {{---}} SPECTRAL NORMALIZATION FOR GENERATIVE ADVERSARIAL NETWORKS]&amp;lt;/ref&amp;gt;: GAN с новым подходом решения проблемы нестабильного обучения через спектральную нормализацию.&lt;br /&gt;
* SAGAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1805.08318.pdf Han Zhang {{---}} Self-Attention Generative Adversarial Networks]&amp;lt;/ref&amp;gt;: GAN, основанный на механизме внимания.&lt;br /&gt;
* BigGAN&amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1809.11096.pdf Andrew Brock {{---}} LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS]&amp;lt;/ref&amp;gt;: GAN с ортогональной регуляризацией, позволившей разрешить проблему коллапсирования при долгом обучении.&lt;br /&gt;
&lt;br /&gt;
Кроме простой генерации изображений, существуют достаточно необычные применения, дающие впечатляющие результаты не только на картинках, но и на звуке:&lt;br /&gt;
&lt;br /&gt;
* CycleGAN&amp;lt;ref&amp;gt; [https://junyanz.github.io/CycleGAN/ Jun-Yan Zhu &amp;amp; Taesung Park {{---}} Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks]&amp;lt;/ref&amp;gt;: меняет изображения c одного домена на другой, например, лошадей на зебр,&lt;br /&gt;
* SRGAN&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1609.04802 Christian Ledig {{---}} Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network]&amp;lt;/ref&amp;gt;: создает изображения с высоким разрешением из более низкого разрешения,&lt;br /&gt;
* Pix2Pix&amp;lt;ref&amp;gt; [https://phillipi.github.io/pix2pix/ Phillip Isola {{---}} Image-to-Image Translation with Conditional Adversarial Nets]&amp;lt;/ref&amp;gt;: создает изображения по семантической окраске,&lt;br /&gt;
* StackGAN&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1612.03242 Han Zhang {{---}} StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks]&amp;lt;/ref&amp;gt;: создает изображения по заданному тексту,&lt;br /&gt;
* MidiNet&amp;lt;ref&amp;gt; [https://arxiv.org/abs/1703.10847 Li-Chia Yang {{---}} MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION]&amp;lt;/ref&amp;gt;: генерирует последовательность нот, таким образом, создает мелодию.&lt;br /&gt;
&lt;br /&gt;
==CGAN (Conditional Generative Adversarial Nets)==&lt;br /&gt;
&lt;br /&gt;
[[File:CGAN_architecture.png|450px|thumb|Архитектура CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Условные порождающие состязательные сети''' (англ. ''Conditional Generative Adversarial Nets, CGAN'') $-$ это модифицированная версия алгоритма GAN, которая позволяет &lt;br /&gt;
генерировать объекты с дополнительными условиями '''y'''. '''y''' может быть любой дополнительной информацией, например, меткой класса или данными из других моделей. Добавление данных условий в существующую архитектуру осуществляется с помощью расширения вектором '''y''' входных данных генератора и дискриминатора.&lt;br /&gt;
&lt;br /&gt;
В таком случае задача оптимизации будет выглядеть следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt; &amp;lt;tex&amp;gt; \min\limits_{G}\max\limits_{D} \mathop{E}\limits_{x \sim p_{data}}[logD(x|y)]  + \mathop{E}\limits_{z \sim p_{z}}[log(1-D(G(z|y))]  &amp;lt;/tex&amp;gt; &amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В качестве примера использования данного алгоритма можно рассмотреть задачу генерации рукописных цифр. ''CGAN'' был натренирован на датасете ''MNIST'' с метками классов представленных в виде ''one-hot'' векторов.&lt;br /&gt;
&lt;br /&gt;
[[File:CGAN_generated.png|450px|thumb|Цифры, сгенерированные с помощью CGAN. Источник: https://arxiv.org/pdf/1411.1784.pdf]]&lt;br /&gt;
&lt;br /&gt;
==DCGAN (Deep Convolutional Generative Adversarial Nets)==&lt;br /&gt;
&lt;br /&gt;
[[File:DCGAN_generator.png|450px|thumb|Архитектура генератора в DCGAN. Источник: https://arxiv.org/pdf/1511.06434.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''DCGAN''' $-$ модификация алгоритма ''GAN'', основными архитектурными изменениями которой являются:&lt;br /&gt;
* Замена всех пулинговых слоев на страйдинговые свертки (''strided convolutions'') в дискриминаторе и частично-страйдинговые свертки (''fractional-strided''&lt;br /&gt;
''convolutions'') в генераторе.&lt;br /&gt;
* Использование батчинговой нормализации для генератора и дискриминатора.&lt;br /&gt;
* Удаление всех полносвязных скрытых уровней для более глубоких архитектур.&lt;br /&gt;
* Использование ''ReLU'' в качестве функции активации в генераторе для всех слоев, кроме последнего, где используется ''tanh''.&lt;br /&gt;
* Использование ''LeakyReLU'' в качестве функции активации в дискриминаторе для всех слоев.&lt;br /&gt;
&lt;br /&gt;
Помимо задачи генерации объектов, данный алгоритм хорошо показывает себя в качестве ''feature extractor'''а.&lt;br /&gt;
Данный алгоритм был натренирован на датасете ''Imagenet-1k'', после чего были использованы значения со сверточных слоев дискриминатора, подвергнутые ''max-pooling'''у, чтобы образовать матрицы &lt;br /&gt;
&amp;lt;tex&amp;gt; 4 \times 4 &amp;lt;/tex&amp;gt; и получить общий вектор признаков на их основе. ''L2-SVM'' с данным ''feature extractor'''ом на датасете ''CIFAR-10'' превосходит по точности решения, основанные на алгоритме&lt;br /&gt;
''K-Means''. Более подробно об этом вы можете прочитать в статье. &amp;lt;ref&amp;gt; [https://arxiv.org/pdf/1511.06434.pdf  Alec Radford, Luke Metz, Soumith Chintala {{---}} Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Порождающие модели|Порождающие модели]]&lt;br /&gt;
*[[:Variational autoencoder (VAE)|Variational autoencoder (VAE)]]&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 2018. — С. 348-360.&lt;br /&gt;
* [https://medium.com/@jonathan_hui/gan-why-it-is-so-hard-to-train-generative-advisory-networks-819a86b3750b Medium | GAN — Why it is so hard to train Generative Adversarial Networks! ]&lt;br /&gt;
* [https://arxiv.org/pdf/1411.1784.pdf CGAN Paper]&lt;br /&gt;
* [https://arxiv.org/pdf/1511.06434.pdf DCGAN Paper]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Порождающие модели]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%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=69545</id>
		<title>Сверточные нейронные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B2%D0%B5%D1%80%D1%82%D0%BE%D1%87%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=69545"/>
				<updated>2019-01-28T14:43:16Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Сверточная нейронная сеть''' (англ. ''convolutional neural network'', ''CNN'') {{---}} специальная архитектура нейронных сетей, предложенная Яном Лекуном&amp;lt;ref name=LeNet5&amp;gt;[http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf Yann LeCun — Gradient-Based Learning Applied to Document Recognition, 1998]&amp;lt;/ref&amp;gt;, изначально нацеленная на эффективное распознавание изображений.&lt;br /&gt;
&lt;br /&gt;
== Свертка ==&lt;br /&gt;
[[Файл:Convolution_example.png|upright=1.0|thumb|[https://arxiv.org/abs/1603.07285 Пример свертки двух матриц размера 5x5 и 3x3]]]&lt;br /&gt;
'''Свертка''' (англ. ''convolution'') {{---}} операция над парой матриц &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;n_x\times n_y&amp;lt;/math&amp;gt;) и &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (размера &amp;lt;math&amp;gt;m_x \times m_y&amp;lt;/math&amp;gt;), результатом которой является матрица &amp;lt;math&amp;gt;C = A * B&amp;lt;/math&amp;gt; размера &amp;lt;math&amp;gt;(n_x-m_x+1)\times (n_y-m_y+1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
Каждый элемент результата вычисляется как скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и некоторой подматрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; такого же размера (подматрица определяется положением элемента в результате).&lt;br /&gt;
То есть, &amp;lt;math&amp;gt;C_{i,j} = \sum_{u = 0}^{m_x-1}\sum_{v = 0}^{m_y - 1}A_{i+u,j+v}B_{u,v}&amp;lt;/math&amp;gt;. На изображении справа можно видеть, как матрица &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; «двигается» по матрице &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, и в каждом положении считается скалярное произведение матрицы &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; и той части матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, на которую она сейчас наложена. Получившееся число записывается в соответствующий элемент результата.&lt;br /&gt;
&lt;br /&gt;
Логический смысл свертки такой {{---}} чем больше величина элемента свертки, тем больше эта часть матрицы &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; была похожа на матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; (похожа в смысле скалярного произведения). Поэтому матрицу &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; называют ''изображением'', а матрицу &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; {{---}} ''фильтром'' или ''образцом''.&lt;br /&gt;
&lt;br /&gt;
== Структура сверточной нейронной сети ==&lt;br /&gt;
В сверточной нейронной сети выходы промежуточных слоев образуют матрицу (изображение) или набор матриц (несколько слоёв изображения). Так, например, на вход сверточной нейронной сети можно подавать три слоя изображения (R-, G-, B-каналы изображения). Основными видами слоев в сверточной нейронной сети являются сверточные слои (англ. ''convolutional layer''), пулинговые слои (англ. ''pooling layer'') и [[:Нейронные_сети,_перцептрон|полносвязные слои]] (англ. ''fully-connected layer'').&lt;br /&gt;
&lt;br /&gt;
=== Сверточный слой ===&lt;br /&gt;
[[Файл:Padding.png|upright=1.0|thumb|[https://arxiv.org/abs/1603.07285 Пример свертки двух матриц с дополнением нулями и сдвигом 2]]]&lt;br /&gt;
[[Файл:Convolution-operation-on-volume5.png|upright=1.0|thumb|[http://www.machinelearning.ru/wiki/images/1/1b/DL16_lecture_3.pdf Пример свертки с трехмерным ядром]]]&lt;br /&gt;
Сверточный слой нейронной сети представляет из себя применение операции свертки к выходам с предыдущего слоя, где веса ядра свертки являются обучаемыми параметрами. Еще один обучаемый вес используется в качестве константного сдвига (англ. ''bias''). При этом есть несколько важных деталей:&lt;br /&gt;
&lt;br /&gt;
* В одном сверточном слое может быть несколько сверток. В этом случае для каждой свертки на выходе получится своё изображение. Например, если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а в слое было &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; сверток с ядром размерности &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;n\times(w - k_x + 1)\times(h - k_y + 1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Ядра свертки могут быть трёхмерными. Свертка трехмерного входа с трехмерным ядром происходит аналогично, просто скалярное произведение считается еще и по всем слоям изображения. Например, для усреднения информации о цветах исходного изображения, на первом слое можно использовать свертку размерности &amp;lt;math&amp;gt;3\times w \times h&amp;lt;/math&amp;gt;. На выходе такого слоя будет уже одно изображение (вместо трёх).&lt;br /&gt;
&lt;br /&gt;
* Можно заметить, что применение операции свертки уменьшает изображение. Также пиксели, которые находятся на границе изображения учавствуют в меньшем количестве сверток, чем внутренние. В связи с этим в сверточных слоях используется дополнение изображения (англ. ''padding''). Выходы с предыдущего слоя дополняются пикселями так, чтобы после свертки сохранился размер изображения. Такие свертки называют ''одинаковыми'' (англ. ''same convolution''), а свертки без дополнения изображения называются ''правильными'' (англ. ''valid convolution''). Среди способов, которыми можно заполнить новые пиксели, можно выделить следующие:&lt;br /&gt;
** ''zero shift'': &amp;lt;code&amp;gt;00[ABC]00&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''border extension'': &amp;lt;code&amp;gt;AA[ABC]CC&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''mirror shift'': &amp;lt;code&amp;gt;BA[ABC]CB&amp;lt;/code&amp;gt;&lt;br /&gt;
** ''cyclic shift'': &amp;lt;code&amp;gt;BC[ABC]AB&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Еще одним параметром сверточного слоя является ''сдвиг'' (англ. ''stride''). Хоть обычно свертка применяется подряд для каждого пикселя, иногда используется сдвиг, отличный от единицы {{---}} скалярное произведение считается не со всеми возможными положениями ядра, а только с положениями, кратными некоторому сдвигу &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. Тогда, если если вход имел размерность &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt;, а ядро свертки имело размерность &amp;lt;math&amp;gt;k_x\times k_y&amp;lt;/math&amp;gt; и использовался сдвиг &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;, то выход будет иметь размерность &amp;lt;math&amp;gt;\lfloor\frac{w - k_x}{s} + 1\rfloor\times\lfloor\frac{h - k_y}{s} + 1\rfloor&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пулинговый слой ===&lt;br /&gt;
[[Файл:Maxpool.jpeg|upright=1.0|thumb|[https://www.slideshare.net/YUNGKUEICHEN/convolutional-neural-network-cnn-image-recognition Пример операции пулинга с функцией максимума]]]&lt;br /&gt;
Пулинговый слой призван снижать размерность изображения. Исходное изображение делится на блоки размером &amp;lt;math&amp;gt;w\times h&amp;lt;/math&amp;gt; и для каждого блока вычисляется некоторая функция. Чаще всего используется функция максимума (англ. ''max pooling'') или (взвешенного) среднего (англ. ''(weighted) average pooling''). Обучаемых параметров у этого слоя нет. Основные цели пулингового слоя:&lt;br /&gt;
* уменьшение изображения, чтобы последующие свертки оперировали над большей областью исходного изображения;&lt;br /&gt;
* увеличение инвариантности выхода сети по отношению к малому переносу входа;&lt;br /&gt;
* ускорение вычислений.&lt;br /&gt;
&lt;br /&gt;
=== Inception module ===&lt;br /&gt;
[[Файл:Inception.png|upright=1.0|thumb|[https://arxiv.org/abs/1409.4842 Inception module]]]&lt;br /&gt;
[[Файл:Inception_red.png|upright=1.0|thumb|[https://arxiv.org/pdf/1409.4842.pdf Inception module с сокращением размерностей]]]&lt;br /&gt;
''Inception module'' {{---}} это специальный слой нейронной сети, который был предложен в работе&amp;lt;ref name=GoogLeNet&amp;gt;[https://arxiv.org/pdf/1409.4842.pdf Going deeper with convolutions]&amp;lt;/ref&amp;gt;, в которой была представлена сеть GoogLeNet. Основная цель этого модуля заключается в следующем. Авторы предположили, что каждый элемент предыдущего слоя соответствует определенной области исходного изображения. Каждая свертка по таким элементам будет увеличивать область исходного изображения, пока элементы на последних слоях не будут соответствовать всему изображению целиком. Однако, если с какого-то момента все свертки станут размером &amp;lt;math&amp;gt;1\times 1&amp;lt;/math&amp;gt;, то не найдется элементов, которые покрывали бы все исходное изображение, поэтому было бы невозможно находить большие признаки на изображении. Чтобы решить эту проблему, авторы предложили так называемый inception module {{---}} конкатенацию выходов для сверток размера &amp;lt;math&amp;gt;1\times 1&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;3\times 3&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;5\times 5&amp;lt;/math&amp;gt;, а также операции max pooling'а с ядром &amp;lt;math&amp;gt;3\times 3&amp;lt;/math&amp;gt;. К сожалению, подобный наивный подход (англ. ''naive inception module'') приводит к резкому увеличению слоев изображения, что не позволяет построить с его использованием глубокую нейронную сеть. Для этого авторы предложили использовать модифицированный inception module с дополнительным уменьшением размерности {{---}} дополнительно к каждому фильтру они добавили слой свертки &amp;lt;math&amp;gt;1\times 1&amp;lt;/math&amp;gt;, который схлопывает все слои изображения в один. Это позволяет сохранить малое число слоев, с сохранением полезной информации о изображении.&lt;br /&gt;
&lt;br /&gt;
=== Residual block ===&lt;br /&gt;
[[Файл:Residual.png|upright=1.0|thumb|[https://arxiv.org/pdf/1512.03385.pdf Устройство residual block]]]&lt;br /&gt;
Двумя серьезными проблемами в обучении глубоких нейронных сетей являются исчезающий градиент (англ. ''vanishing gradient'') и взрывающийся градиент (англ. ''exploding gradient''). Они возникают из-за того, что при дифференцировании по цепному правилу, до глубоких слоев нейронной сети доходит очень маленькая величина градиента (из-за многократного домножения на небольшие величины на предыдущих слоях). Для борьбы с этой проблемой был предложен так называемый ''residual block''&amp;lt;ref name=ResNet&amp;gt;[https://arxiv.org/pdf/1512.03385.pdf Deep residual learning for image recognition]&amp;lt;/ref&amp;gt;. Идея заключается в том, чтобы взять пару слоёв (например, сверточных), и добавить дополнительную связь, которая проходит мимо этих слоёв. Пусть &amp;lt;math&amp;gt;z^{(k)}&amp;lt;/math&amp;gt; {{---}} выход &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;-ого слоя до применения функции активации, а &amp;lt;math&amp;gt;a^{(k)}&amp;lt;/math&amp;gt; {{---}} выход после. Тогда residual block будет выполнять следующее преобразование: &amp;lt;math&amp;gt;a^{(k + 2)} = g(z^{(k + 2)} + a^{(k)})&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;g&amp;lt;/math&amp;gt; {{---}} функция активации.&lt;br /&gt;
&lt;br /&gt;
На самом деле, такая нейронная сеть обучается предсказывать функцию &amp;lt;math&amp;gt;\mathcal{F}(x) - x&amp;lt;/math&amp;gt;, вместо функции &amp;lt;math&amp;gt;\mathcal{F}(x)&amp;lt;/math&amp;gt;, которую изначально нужно было предсказывать. Для компенсации этой разницы и вводится это замыкающее соединение (англ. ''shortcut connection''), которое добавляет недостающий &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; к функции. Предположение авторов, которые предложили residual block, заключалось в том, что такую разностную функцию будет проще обучать, чем исходную. Если рассматривать крайние случаи, то если &amp;lt;math&amp;gt;\mathcal{F}(x) = x&amp;lt;/math&amp;gt;, такую сеть обучить нулю всегда возможно, в отличие от обучения множества нелинейных слоёв линейному преобразованию.&lt;br /&gt;
&lt;br /&gt;
== Известные архитектуры сверточных нейронных сетей ==&lt;br /&gt;
=== LeNet-5 ===&lt;br /&gt;
[[Файл:Lenet5.png|upright=1.0|thumb|[http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf Архитектура LeNet-5]]]&lt;br /&gt;
Нейронная сеть, предложенная Яном Лекуном&amp;lt;ref name=LeNet5/&amp;gt;, для распознавания рукописных цифр MNIST.&lt;br /&gt;
&lt;br /&gt;
=== AlexNet ===&lt;br /&gt;
[[Файл:Alexnet.png|upright=1.0|thumb|[https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf Архитектура AlexNet]]]&lt;br /&gt;
Победитель соревнования ImageNet 2012-ого года, набравший точность 84.6%&amp;lt;ref name=AlexNet&amp;gt;[https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf ImageNet Classification with Deep Convolutional Neural Networks]&amp;lt;/ref&amp;gt;. Была реализована с использованием CUDA для повышения производительности. Состоит из двух отдельных частей, которые слабо взаимодействуют друг с другом, что позволяет исполнять их параллельно на разных GPU с минимальным обменом данными.&lt;br /&gt;
&lt;br /&gt;
=== VGG ===&lt;br /&gt;
Семейство архитектур нейронных сетей, которое включает в себя, в частности, VGG-11, VGG-13, VGG-16 и VGG-19&amp;lt;ref name=VGG&amp;gt;[https://arxiv.org/pdf/1409.1556.pdf Very Deep Convolutional Networks for Large-Scale Image Recognition]&amp;lt;/ref&amp;gt;. Победитель соревнования ImageNet 2013-ого года (VGG-16), набравший точность 92.7%. Одной из отличительных особенностей является использование ядер свертки небольшого размера (3x3, в отличие от больших ядер размера 7x7 или 11x11).&lt;br /&gt;
&lt;br /&gt;
=== GoogLeNet ===&lt;br /&gt;
Также известный как ''inception network'' {{---}} победитель соревнования ImageNet 2014-ого года, набравший 93.3% точности&amp;lt;ref name=GoogLeNet/&amp;gt;. Состоит в основном из inception модулей. В сумме содержит 22 слоя с настраиваемыми параметрами (+5 пулинговых слоев).&lt;br /&gt;
&lt;br /&gt;
=== ResNet ===&lt;br /&gt;
Победитель соревнования ImageNet 2015-ого года. Сеть-победитель содержала более 150 слоёв&amp;lt;ref name=ResNet/&amp;gt; и набрала 96.43% точности.&lt;br /&gt;
&lt;br /&gt;
=== Сравнение известных нейронных сетей ===&lt;br /&gt;
[[Файл:Net-comparison.png|border|1000px]]&lt;br /&gt;
&lt;br /&gt;
== Примеры кода ==&lt;br /&gt;
===Scala===&lt;br /&gt;
Пример кода с библиотекой DeepLearning.scala&amp;lt;ref&amp;gt;[https://deeplearning.thoughtworks.school/index.html DeepLearning.scala]&amp;lt;/ref&amp;gt;&lt;br /&gt;
    // Загрузка датасета&lt;br /&gt;
    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
    // Определение слоёв&lt;br /&gt;
    def myNeuralNetwork(input: INDArray):  INDArrayLayer = {&lt;br /&gt;
        val cnnLayer = maxPool(relu(conv2d(input.reshape(input.shape()(0), Cifar10.NumberOfChannels, PixelHeight, PixelWidth), cnnWeight, cnnBias, (KernelHeight, KernelWidth), (Stride, Stride), (Padding, Padding))), (PoolSize, PoolSize))&lt;br /&gt;
        val affineRuleOfCnnLayer = relu(affine(cnnLayer.reshape(input.shape()(0), NumFilters * (PixelHeight / PoolSize) * (PixelWidth / PoolSize)), affineWeight, affineBias))&lt;br /&gt;
        val affineOfaffineRuleOfCnnLayer = affine(affineRuleOfCnnLayer.reshape(input.shape()(0), HiddenDim), affineLastWeight, affineLastBias)&lt;br /&gt;
        val softmaxValue = softmax(affineOfaffineRuleOfCnnLayer)&lt;br /&gt;
        softmaxValue&lt;br /&gt;
    }&lt;br /&gt;
    // Определение функции потерь&lt;br /&gt;
    def lossFunction(input: INDArray, expectOutput: INDArray): DoubleLayer = { &lt;br /&gt;
        val probabilities = myNeuralNetwork(input)&lt;br /&gt;
        -(hyperparameters.log(probabilities) * expectOutput).mean   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    class Trainer(batchSize: Int, numberOfEpoches: Int = 5) {&lt;br /&gt;
        import scalaz.std.anyVal._&lt;br /&gt;
        import scalaz.syntax.all._&lt;br /&gt;
        @volatile&lt;br /&gt;
        private var isShuttingDown: Boolean = false&lt;br /&gt;
        private val lossBuffer = scala.collection.mutable.Buffer.empty[Double]&lt;br /&gt;
        def plotLoss(): Unit = Seq(Scatter(lossBuffer.indices, lossBuffer)).plot(title = &amp;quot;loss by time&amp;quot;)&lt;br /&gt;
        def interrupt(): Unit = isShuttingDown = true&lt;br /&gt;
        def startTrain(): Unit = {&lt;br /&gt;
            @monadic[Future]&lt;br /&gt;
            def trainTask: Future[Unit] = {&lt;br /&gt;
                isShuttingDown = false&lt;br /&gt;
                var epoch = 0&lt;br /&gt;
            &lt;br /&gt;
                while (epoch &amp;lt; numberOfEpoches &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                    val cifar10 = Cifar10.load().blockingAwait&lt;br /&gt;
                    val iterator = cifar10.epoch(batchSize).zipWithIndex&lt;br /&gt;
                    while (iterator.hasNext &amp;amp;&amp;amp; !isShuttingDown) {&lt;br /&gt;
                        val (Cifar10.Batch(labels, batch), i) = iterator.next()&lt;br /&gt;
                        val loss = lossFunction(batch, labels).train.each&lt;br /&gt;
                        lossBuffer += loss&lt;br /&gt;
                        hyperparameters.logger.info(s&amp;quot;epoch=epoch iteration=i batchSize=batchSize loss=loss&amp;quot;)&lt;br /&gt;
                    }&lt;br /&gt;
                    epoch += 1&lt;br /&gt;
                }&lt;br /&gt;
                hyperparameters.logger.info(&amp;quot;Done&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            trainTask.onComplete { tryUnit: scala.util.Try[Unit] =&amp;gt; tryUnit.get }&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;&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>Alexey Katsman</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=69543</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=69543"/>
				<updated>2019-01-28T14:42:44Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&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;
==См. также==&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>Alexey Katsman</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=69542</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=69542"/>
				<updated>2019-01-28T14:42:30Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Рекурсивная сеть */&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;
==См. также==&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;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69541</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=69541"/>
				<updated>2019-01-28T14:42:15Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Описание */&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;
[[:Рекурсивные нейронные сети|Рекурсивные нейронные сети]] представляют собой более общий случай рекуррентных сетей, когда сигнал в сети проходит через структуру в виде дерева (обычно бинарные деревья). Те же самые матрицы весов используются рекурсивно по всему графу в соответствии с его топологией.&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;
==См. также==&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;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Batch-normalization&amp;diff=69540</id>
		<title>Batch-normalization</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Batch-normalization&amp;diff=69540"/>
				<updated>2019-01-28T14:41:16Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Модификации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Пакетная нормализация''' (англ. batch-normalization) {{---}} это метод, который позволяет повысить производительность и стабилизировать работу [[Нейронные сети, перцептрон | искусственных нейронных сетей]]. Суть данного метода заключается в том, что некоторым слоям нейронной сети на вход подаются данные, предварительно обработанные и имеющие нулевое [[Математическое ожидание случайной величины|математическое ожидание]] и единичную [[Дисперсия случайной величины|дисперсию]]. Впервые данный метод был представлен в &amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1502.03167.pdf Ioffe S., Szegedy C. {{---}} Batch normalization: Accelerating deep network training by reducing internal covariate shift, 2016]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея==&lt;br /&gt;
Нормализация входного слоя нейронной сети обычно выполняется путем масштабирования данных, подаваемых в функции активации. Например, когда есть признаки со значениями от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и некоторые признаки со значениями от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;1000&amp;lt;/tex&amp;gt;, то их необходимо нормализовать, чтобы ускорить обучение. Нормализацию данных можно выполнить и в скрытых слоях нейронных сетей, что и делает метод пакетной нормализации.&lt;br /&gt;
===Пакет===&lt;br /&gt;
Предварительно, напомним, что такое '''пакет''' (англ. batch). Возможны два подхода к реализации алгоритма градиентного спуска для обучения нейросетевых моделей: стохастический и пакетный&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=Метод_стохастического_градиента Метод стохастического градиента]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
* [[Стохастический градиентный спуск|Стохастический градиентный спуск]] (англ. stochastic gradient descent) {{---}} реализация, в которой на каждой итерации алгоритма из обучающей выборки каким-то (случайным) образом выбирается только один объект. &lt;br /&gt;
* Пакетный (батч) (англ. batch gradient descent) {{---}} реализация градиентного спуска, когда на каждой итерации обучающая выборка просматривается целиком, и только после этого изменяются веса модели. &lt;br /&gt;
&lt;br /&gt;
Также существует &amp;quot;золотая середина&amp;quot; между стохастическим градиентным спуском и пакетным градиентным спуском {{---}} когда просматривается только некоторое подмножество обучающей выборки фиксированного размера (англ. batch-size). В таком случае такие подмножества принято называть мини-пакетом (англ. mini-batch). Здесь и далее, мини-пакеты будем также называть пакетом.&lt;br /&gt;
&lt;br /&gt;
===Ковариантный сдвиг===&lt;br /&gt;
[[Файл:covariate-shift1.png|600px|thumb|Рисунок 1. Верхние две строки роз показывают первое подмножество данных, а нижние две строки показывают другое подмножество. Два подмножества имеют разные пропорции изображения роз. На графиках показано распределение двух классов в пространстве объектов с использованием красных и зеленых точек. Синяя линия показывает границу между двумя классами. Иллюстрация из [https://www.learnopencv.com/batch-normalization-in-deep-networks/ статьи].]]&lt;br /&gt;
Пакетная нормализация уменьшает величину, на которую смещаются значения узлов в скрытых слоях (т.н. '''[[Ковариация случайных величин|ковариантный]] сдвиг''' (англ. covariance shift)). &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;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; изменяется, то появляется необходимость обучить модель заново, чтобы &amp;quot;выровнять&amp;quot; пропорции элементов в &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;
Это довольно сильно замедляет процесс обучения модели. На Рисунке 1 изображена разница в пропорциях.&lt;br /&gt;
&lt;br /&gt;
Простой способ решить проблему ковариантного сдвига для входного слоя {{---}} это случайным образом перемешать данные перед созданием пакетов. &lt;br /&gt;
Но для скрытых слоев нейронной сети такой метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый раз, когда происходит обновление параметров в предыдущем слое. &lt;br /&gt;
Эта проблема называется '''внутренним ковариантным сдвигом''' (англ. internal covariate shift). &lt;br /&gt;
Для решения данной проблемы часто приходится использовать низкий [[Стохастический градиентный спуск|темп обучения]] (англ. learning rate) и методы [[wikipedia:ru:Регуляризация_(математика)|регуляризации]] при обучении модели. &lt;br /&gt;
Другим способом устранения внутреннего ковариантного сдвига является метод пакетной нормализации.&lt;br /&gt;
&lt;br /&gt;
===Свойства пакетной нормализации===&lt;br /&gt;
Кроме того, использование пакетной нормализации обладает еще несколькими дополнительными полезными свойствами:&lt;br /&gt;
* достигается более быстрая сходимость моделей, несмотря на выполнение дополнительных вычислений;&lt;br /&gt;
* пакетная нормализация позволяет каждому слою сети обучатся более независимо от других слоев;&lt;br /&gt;
* становится возможным использование более высокого темпа обучения, так как пакетная нормализация гарантирует, что выходы узлов нейронной сети не будут иметь слишком больших или малых значений;&lt;br /&gt;
* пакетная нормализация в каком-то смысле также является механизмом регуляризации: данный метод привносит в выходы узлов скрытых слоев некоторый шум, аналогично методу [[Практики реализации нейронных сетей#Dropout|dropout]];&lt;br /&gt;
* модели становятся менее чувствительны к начальной инициализации весов.&lt;br /&gt;
&lt;br /&gt;
==Описание метода==&lt;br /&gt;
Опишем устройство метода пакетной нормализации. Пусть на вход некоторому слою нейронной сети поступает вектор размерности &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;x = (x^{(1)}, \ldots, x^{(d)})&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;\hat{x}^{(k)} = \displaystyle \frac{x^{(k)} - E(x^{(k)})}{\sqrt{D(x^{(k)})}}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где математическое ожидание и дисперсия считаются по всей обучающей выборке. Такая нормализация входа слоя нейронной сети может изменить представление данных в слое. Чтобы избежать данной проблемы, вводятся два параметра сжатия и сдвига нормализованной величины для каждого &amp;lt;tex&amp;gt;x^{(k)}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; {{---}} которые действуют следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данные параметры настраиваются в процессе обучения вместе с остальными [[Модель_алгоритма_и_ее_выбор|параметрами модели]].&lt;br /&gt;
&lt;br /&gt;
Пусть обучение модели производится с помощью пакетов &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; размера &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;B = \{x_{1},\ldots, x_{m}\}&amp;lt;/tex&amp;gt;. Здесь нормализация применяется к каждому элементу входа с номером &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; отдельно, поэтому в &amp;lt;tex&amp;gt;x^{(k)}&amp;lt;/tex&amp;gt; индекс опускается для ясности изложения. Пусть были получены нормализованные значения пакета &amp;lt;tex&amp;gt;\hat{x}_{1},\ldots, \hat{x}_{m}&amp;lt;/tex&amp;gt;. После применения операций сжатия и сдвига были получены &amp;lt;tex&amp;gt;y_{1},\ldots, y_{m}&amp;lt;/tex&amp;gt;. Обозначим данную функцию пакетной нормализации следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;BN_{\gamma, \beta}: \{x_{1},\ldots, x_{m}\} \rightarrow \{y_{1},\ldots, y_{m}\}&amp;lt;/tex&amp;gt;&lt;br /&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;B = \{x_{1},\ldots, x_{m}\}&amp;lt;/tex&amp;gt;; настраиваемые параметры &amp;lt;tex&amp;gt;\gamma, \beta&amp;lt;/tex&amp;gt;; константа &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; для вычислительной устойчивости.&lt;br /&gt;
 '''Выход''': &amp;lt;tex&amp;gt;\{y_{i} = BN_{\gamma, \beta}(x_{i})\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\mu_{B} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} x_{i}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// математическое ожидание пакета&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\sigma_{B}^{2} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} (x_{i} - \mu_{B})^{2}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// дисперсия пакета&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\hat{x}_{i} = \displaystyle \frac{x_{i} - \mu_{B}}{\sqrt{\sigma_{B}^{2} + \epsilon}}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// нормализация&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;y_{i} = \gamma \hat{x}_{i} + \beta \equiv BN_{\gamma, \beta}(x_{i}) &amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// сжатие и сдвиг&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что если &amp;lt;tex&amp;gt;\beta=\mu_{B}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\gamma=\sqrt{\sigma_{B}^{2} + \epsilon}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;y_{i}&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;x_{i}&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;BN_{\gamma, \beta}(\cdot)&amp;lt;/tex&amp;gt; является тождественным отображением.&lt;br /&gt;
Таким образом, использование пакетной нормализации не может привести к снижению точности, поскольку оптимизатор просто может использовать нормализацию как тождественное отображение.&lt;br /&gt;
&lt;br /&gt;
==Обучение нейронных сетей с пакетной нормализацией==&lt;br /&gt;
[[Файл:BNcircuit.png|700px|thumb|Рисунок 2. [[Настройка_глубокой_сети#Граф вычислений|Граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки. Слева-направо черными стрелками показана работа алгоритма в прямом направлении. А справа-налево красными стрелками {{---}} в обратном направлении, где вычисляется градиент функции потерь. Здесь &amp;lt;tex&amp;gt;N=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D=d&amp;lt;/tex&amp;gt;. Иллюстрация из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи].]]&lt;br /&gt;
&lt;br /&gt;
Для обучения нейронных сетей необходимо вычислять [[wikipedia:ru:Градиент|градиент]] [[wikipedia:en:Loss_function|функции потерь]] &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;. В случае использования метода пакетной нормализации градиент вычисляется следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \hat{x}_{i}} = \frac{\partial l}{\partial y_{i}} \cdot \gamma&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \sigma_{B}^{2}} = \sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot (x_{i} - \mu_{B}) \cdot \frac{-1}{2}(\sigma_{B}^{2} + \epsilon)^{-3/2}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \mu_{B}} = \left(\sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{-1}{\sqrt{\sigma_{B}^{2} + \epsilon}}\right) + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{\sum_{i=1}^{m}-2(x_{i}-\mu_{B})}{m}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (3)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial x_{i}} = \frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{1}{\sqrt{\sigma_{B}^{2} + \epsilon}} + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{2(x_{i}-\mu_{B})}{m} + \frac{\partial l}{\partial \mu_{B}} \cdot \frac{1}{m}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (4)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \gamma} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}} \cdot \hat{x}_{i}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (5)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \beta} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (6)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На Рисунке 2 изображен [[Настройка_глубокой_сети#Граф вычислений|граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки.&lt;br /&gt;
&lt;br /&gt;
В прямом направлении, как и описано в алгоритме метода, из входа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; вычисляется среднее значение по каждой размерности признакового пространства. Затем полученный вектор средних значение вычитается из каждого элемента обучающей выборки. Далее вычисляется дисперсия,  и с помощью нее вычисляется знаменатель для нормализации. Затем полученное значение инвертируется и умножается на разницу входа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и средних значений. В конце применяются параметры &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В обратном направлении вычисляются производные необходимых функций. В следующей таблице подробнее изображены шаги вычисления градиента функции потерь (иллюстрации из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи], здесь &amp;lt;tex&amp;gt;N=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D=d&amp;lt;/tex&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| cellpadding = &amp;quot;20&amp;quot; class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаг !! Изображение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 1&lt;br /&gt;
|[[Файл:step9.png|300px]]&lt;br /&gt;
|Сначала вычисляется производная по параметру &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, как в уравнении &amp;lt;tex&amp;gt;(6)&amp;lt;/tex&amp;gt;, так как к нему применяется только операции суммирования. И значение градиента выхода передается без изменений.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 2&lt;br /&gt;
|[[Файл:step8.png|300px]]&lt;br /&gt;
|Далее, пользуясь правилом вычисления производной при умножении, как в уравнении &amp;lt;tex&amp;gt;(5)&amp;lt;/tex&amp;gt;, вычисляется градиент по параметру &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;. Градиент выхода умножается на данную константу, получая уравнение &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;, и передается в следующий узел.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 3&lt;br /&gt;
|[[Файл:step7.png|300px]]&lt;br /&gt;
|Данный шаг вычисляется аналогично предыдущему, применяя правило вычисления производной при умножении.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 4&lt;br /&gt;
|[[Файл:step6.png|300px]]&lt;br /&gt;
|Пользуясь производной обратной величины, вычисляем следующий узел графа.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 5&lt;br /&gt;
|[[Файл:step5.png|300px]]&lt;br /&gt;
|Вычисляем производную квадратного корня с добавлением &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 6&lt;br /&gt;
|[[Файл:step4.png|300px]]&lt;br /&gt;
|Вычисляем производную суммы по всем компонентам входного вектора, получая матрицу.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 7&lt;br /&gt;
|[[Файл:step3.png|300px]]&lt;br /&gt;
|Получаем производную квадрата входящей функции.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 8&lt;br /&gt;
|[[Файл:step2.png|300px]]&lt;br /&gt;
|На данном шаге в одном узле сходятся ветки, поэтому полученные производные просто складываются, получая уравнение &amp;lt;tex&amp;gt;(2)&amp;lt;/tex&amp;gt; для производной по дисперсии.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 9&lt;br /&gt;
|[[Файл:step1.png|300px]]&lt;br /&gt;
|Аналогично шагу 6 вычисляем матрицу по сумме для производной по математическому ожиданию, получая формулу &amp;lt;tex&amp;gt;(3)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 10&lt;br /&gt;
|[[Файл:step0.png|300px]]&lt;br /&gt;
|В начальной вершине получаем уравнение &amp;lt;tex&amp;gt;(4)&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;z = g(Wu + b)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;W&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} настраиваемые параметры модели, а &amp;lt;tex&amp;gt;g(\cdot)&amp;lt;/tex&amp;gt; {{---}} некоторая нелинейная функция, например [[Практики реализации нейронных сетей#Sigmoid function|cигмоида]] или [[Практики реализации нейронных сетей#Rectified Linear Units (ReLU)|ReLU]]. Данной функцией можно описать как обычные, так и сверточные слои нейронных сетей. Пакетная нормализация применяется сразу перед функцией &amp;lt;tex&amp;gt;g(\cdot)&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;x = Wu + b&amp;lt;/tex&amp;gt;. Параметр &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; может быть опущен, так как в дальнейших вычислениях его роль будет играть параметр &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. Поэтому &amp;lt;tex&amp;gt;z = g(Wu + b)&amp;lt;/tex&amp;gt; может быть записано так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;z = g(BN(Wu))&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;BN&amp;lt;/tex&amp;gt; применяется отдельно к каждой размерности &amp;lt;tex&amp;gt;x=Wu&amp;lt;/tex&amp;gt; с отдельной парой параметров &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; для каждой размерности.&lt;br /&gt;
&lt;br /&gt;
В случае свёрточных сетей, дополнительно необходима нормализация, чтобы удовлетворить свойство свёрточных сетей, что различные элементы в разных местах одной карты признаков (образ операции свёртки, англ. feature map) должны быть нормализованы одинаково. Чтобы этого добиться, нормализация выполняется совместно над всеми значениями в пакете. Пусть &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; {{---}} множество всех значений в карте признаков по всему пакету и всем точкам в карте признаков. Тогда для пакета размера &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; и карты признаков размера &amp;lt;tex&amp;gt;p \times q&amp;lt;/tex&amp;gt; размер &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;m'=|B|=m \cdot pq&amp;lt;/tex&amp;gt;. Тогда параметры &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; настраиваются для каждой карты признаков отдельно.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
[[File:bn_exp_1.png|300px|thumb|Рисунок 3. Точность распознавания в зависимости от итерации обучения. Оранжевая кривая изображает результаты для модели с использованием пакетной нормализации, синяя кривая {{---}} без. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]&lt;br /&gt;
[[File:bn_exp_2.png|300px|thumb|Рисунок 4. Точность распознавания в зависимости от итерации обучения c использованием сигмоиды в качетсве функции активации. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]&lt;br /&gt;
&lt;br /&gt;
Приведем пример демонстрирующий работу пакетной нормализации. &lt;br /&gt;
Рассмотрим задачу распознавания рукописных цифр на известном датасете MNIST &amp;lt;ref&amp;gt;[http://yann.lecun.com/exdb/mnist/ Датасет MNIST]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
Для решения задачи будет использоваться обычная нейронная сеть с &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; скрытыми полносвязными слоями по &amp;lt;tex&amp;gt;100&amp;lt;/tex&amp;gt; узлов в каждом. &lt;br /&gt;
Функция активации {{---}} ReLU. &lt;br /&gt;
Выходной слой содержит &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt; узлов. &lt;br /&gt;
Размер пакета равен &amp;lt;tex&amp;gt;60&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Сравниваются две одинаковые модели, но в первой перед каждым скрытым слоем используется пакетная нормализация, а во второй {{---}} нет. &lt;br /&gt;
Темп обучения равен &amp;lt;tex&amp;gt;0.01&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Веса инициализированы значениями с малой дисперсией. &lt;br /&gt;
&lt;br /&gt;
На Рисунке 3 изображены два графика, показывающие разницу между моделями. &lt;br /&gt;
Как видно, обе модели достигли высокой точности, но модель с использованием пакетной нормализации достигла точности более &amp;lt;tex&amp;gt;90\%&amp;lt;/tex&amp;gt; быстрее, почти сразу, и достигла максимума, примерно, уже на &amp;lt;tex&amp;gt;10000&amp;lt;/tex&amp;gt; итераций. Однако, модель без пакетной нормализации достигла скорости обучения примерно &amp;lt;tex&amp;gt;510&amp;lt;/tex&amp;gt; пакетов в секунду, а модель с использованием пакетной нормализации {{---}} &amp;lt;tex&amp;gt;270&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Однако, как можно видеть, пакетная нормализация позволяет выполнить меньшее количество итераций и, в итоге, сойтись за меньшее время.&lt;br /&gt;
&lt;br /&gt;
На Рисунке 4 изображен график, сравнивающий точно такие же модели, но с использованием сигмоиды в качестве функции активации. &lt;br /&gt;
Такая конфигурация моделей требует большего времени, чтобы начать обучение. &lt;br /&gt;
В итоге, модель обучается, но на это потребовалось более &amp;lt;tex&amp;gt;45000&amp;lt;/tex&amp;gt; итераций, чтобы получить точность более &amp;lt;tex&amp;gt;80\%&amp;lt;/tex&amp;gt;. &lt;br /&gt;
При использовании пакетной нормализации получилось достичь точность более &amp;lt;tex&amp;gt;90\%&amp;lt;/tex&amp;gt; примерно за &amp;lt;tex&amp;gt;1000&amp;lt;/tex&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
==Реализации==&lt;br /&gt;
Механизм пакетной нормализации реализован практически во всех современных инструментариях для машинного обучения, таких как: TensorFlow &amp;lt;ref&amp;gt;[https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization TensorFlow]&amp;lt;/ref&amp;gt;, Keras &amp;lt;ref&amp;gt;[https://keras.io/layers/normalization/ Keras]&amp;lt;/ref&amp;gt;, CNTK &amp;lt;ref&amp;gt;[https://docs.microsoft.com/en-us/cognitive-toolkit/BatchNormalization CNTK]&amp;lt;/ref&amp;gt;, Theano &amp;lt;ref&amp;gt;[http://deeplearning.net/software/theano/library/tensor/nnet/bn.html Theano]&amp;lt;/ref&amp;gt;, PyTorch &amp;lt;ref&amp;gt;[https://pytorch.org/docs/stable/_modules/torch/nn/modules/batchnorm.html PyTorch]&amp;lt;/ref&amp;gt; и т.д.&lt;br /&gt;
&lt;br /&gt;
Приведем пример&amp;lt;ref&amp;gt;[https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad Batch normalization: theory and how to use it with Tensorflow]&amp;lt;/ref&amp;gt; применения пакетной нормализации с использованием библиотеки TensorFlow на языке программирования Python &amp;lt;ref&amp;gt;[https://www.python.org/ Язык программирования Python]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''import''' tensorflow '''as''' tf&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  is_train = tf.placeholder(tf.bool, name=&amp;quot;is_train&amp;quot;);&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  x_norm = tf.layers.batch_normalization(x, training=is_train)&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)&lt;br /&gt;
  '''with''' tf.control_dependencies(update_ops):&lt;br /&gt;
      train_op = optimizer.minimize(loss)&lt;br /&gt;
&lt;br /&gt;
==Модификации==&lt;br /&gt;
Существует несколько модификаций и вариаций метода пакетной нормализации:&lt;br /&gt;
# Тим Койманс&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1603.09025.pdf Cooijmans T. {{---}} Recurrent batch normalization, 2016]&amp;lt;/ref&amp;gt; в 2016 г. предложил способ применения пакетной нормализации к [[Рекуррентные нейронные сети|рекуррентным нейронным сетям]].&lt;br /&gt;
# Расширение метода пакетной нормализации было предложено Ликси Хуангом&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1804.08450.pdf Huang L. {{---}} Decorrelated Batch Normalization, 2018]&amp;lt;/ref&amp;gt; в 2018 г. Метод получил название декоррелированная пакетная нормализация (англ. Decorrelated Batch Normalization). В данном методе кроме операций масштабирования и сдвига была предложено использование специальной функции затирания данных. &lt;br /&gt;
# Джимми Лей Ба&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1607.06450.pdf Ba J. L., Kiros J. R., Hinton G. E. {{---}} Layer normalization, 2016]&amp;lt;/ref&amp;gt; в 2016 г. предложил метод нормализации слоев (англ. Layer Normalization), который решает проблему выбора размера пакета.&lt;br /&gt;
# В работе Сергея Иоффе&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1702.03275.pdf Ioffe S. {{---}} Batch renormalization: Towards reducing minibatch dependence in batch-normalized models, 2017]&amp;lt;/ref&amp;gt; в 2017 г. было представлено расширение метода пакетной нормализации: пакетная ренормализация (англ. Batch Renormalization). Данный метод улучшает пакетную нормализацию, когда размер пакетов мал и не состоит из независимых данных.&lt;br /&gt;
# Метод потоковой нормализации (англ. Streaming Normalization) был предложен Кифэном Ляо&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1610.06160.pdf Liao Q., Kawaguchi K., Poggio T. {{---}} Streaming normalization: Towards simpler and more biologically-plausible normalizations for online and recurrent learning, 2016]&amp;lt;/ref&amp;gt; в 2016 г. Данный метод убирает два ограничения пакетной нормализации: использование при [[wikipedia:ru:Онлайновое_обучение_машин|online-обучении]] и использование в рекуррентных нейронных сетях.&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;
* [https://arxiv.org/pdf/1502.03167.pdf Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift]&lt;br /&gt;
* [https://towardsdatascience.com/batch-normalization-in-neural-networks-1ac91516821c Glossary of Deep Learning: Batch Normalisation]&lt;br /&gt;
* [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html Understanding the backward pass through Batch Normalization Layer]&lt;br /&gt;
* [https://medium.com/@SeoJaeDuk/deeper-understanding-of-batch-normalization-with-interactive-code-in-tensorflow-manual-back-1d50d6903d35 Deeper Understanding of Batch Normalization with Interactive Code in Tensorflow]&lt;br /&gt;
* [https://www.learnopencv.com/batch-normalization-in-deep-networks/ Batch Normalization in Deep Networks]&lt;br /&gt;
* [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb Batch Normalization {{---}} Lesson]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Batch-normalization&amp;diff=69539</id>
		<title>Batch-normalization</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Batch-normalization&amp;diff=69539"/>
				<updated>2019-01-28T14:40:56Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Ковариантный сдвиг */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Пакетная нормализация''' (англ. batch-normalization) {{---}} это метод, который позволяет повысить производительность и стабилизировать работу [[Нейронные сети, перцептрон | искусственных нейронных сетей]]. Суть данного метода заключается в том, что некоторым слоям нейронной сети на вход подаются данные, предварительно обработанные и имеющие нулевое [[Математическое ожидание случайной величины|математическое ожидание]] и единичную [[Дисперсия случайной величины|дисперсию]]. Впервые данный метод был представлен в &amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1502.03167.pdf Ioffe S., Szegedy C. {{---}} Batch normalization: Accelerating deep network training by reducing internal covariate shift, 2016]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея==&lt;br /&gt;
Нормализация входного слоя нейронной сети обычно выполняется путем масштабирования данных, подаваемых в функции активации. Например, когда есть признаки со значениями от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и некоторые признаки со значениями от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;1000&amp;lt;/tex&amp;gt;, то их необходимо нормализовать, чтобы ускорить обучение. Нормализацию данных можно выполнить и в скрытых слоях нейронных сетей, что и делает метод пакетной нормализации.&lt;br /&gt;
===Пакет===&lt;br /&gt;
Предварительно, напомним, что такое '''пакет''' (англ. batch). Возможны два подхода к реализации алгоритма градиентного спуска для обучения нейросетевых моделей: стохастический и пакетный&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=Метод_стохастического_градиента Метод стохастического градиента]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
* [[Стохастический градиентный спуск|Стохастический градиентный спуск]] (англ. stochastic gradient descent) {{---}} реализация, в которой на каждой итерации алгоритма из обучающей выборки каким-то (случайным) образом выбирается только один объект. &lt;br /&gt;
* Пакетный (батч) (англ. batch gradient descent) {{---}} реализация градиентного спуска, когда на каждой итерации обучающая выборка просматривается целиком, и только после этого изменяются веса модели. &lt;br /&gt;
&lt;br /&gt;
Также существует &amp;quot;золотая середина&amp;quot; между стохастическим градиентным спуском и пакетным градиентным спуском {{---}} когда просматривается только некоторое подмножество обучающей выборки фиксированного размера (англ. batch-size). В таком случае такие подмножества принято называть мини-пакетом (англ. mini-batch). Здесь и далее, мини-пакеты будем также называть пакетом.&lt;br /&gt;
&lt;br /&gt;
===Ковариантный сдвиг===&lt;br /&gt;
[[Файл:covariate-shift1.png|600px|thumb|Рисунок 1. Верхние две строки роз показывают первое подмножество данных, а нижние две строки показывают другое подмножество. Два подмножества имеют разные пропорции изображения роз. На графиках показано распределение двух классов в пространстве объектов с использованием красных и зеленых точек. Синяя линия показывает границу между двумя классами. Иллюстрация из [https://www.learnopencv.com/batch-normalization-in-deep-networks/ статьи].]]&lt;br /&gt;
Пакетная нормализация уменьшает величину, на которую смещаются значения узлов в скрытых слоях (т.н. '''[[Ковариация случайных величин|ковариантный]] сдвиг''' (англ. covariance shift)). &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;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; изменяется, то появляется необходимость обучить модель заново, чтобы &amp;quot;выровнять&amp;quot; пропорции элементов в &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;
Это довольно сильно замедляет процесс обучения модели. На Рисунке 1 изображена разница в пропорциях.&lt;br /&gt;
&lt;br /&gt;
Простой способ решить проблему ковариантного сдвига для входного слоя {{---}} это случайным образом перемешать данные перед созданием пакетов. &lt;br /&gt;
Но для скрытых слоев нейронной сети такой метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый раз, когда происходит обновление параметров в предыдущем слое. &lt;br /&gt;
Эта проблема называется '''внутренним ковариантным сдвигом''' (англ. internal covariate shift). &lt;br /&gt;
Для решения данной проблемы часто приходится использовать низкий [[Стохастический градиентный спуск|темп обучения]] (англ. learning rate) и методы [[wikipedia:ru:Регуляризация_(математика)|регуляризации]] при обучении модели. &lt;br /&gt;
Другим способом устранения внутреннего ковариантного сдвига является метод пакетной нормализации.&lt;br /&gt;
&lt;br /&gt;
===Свойства пакетной нормализации===&lt;br /&gt;
Кроме того, использование пакетной нормализации обладает еще несколькими дополнительными полезными свойствами:&lt;br /&gt;
* достигается более быстрая сходимость моделей, несмотря на выполнение дополнительных вычислений;&lt;br /&gt;
* пакетная нормализация позволяет каждому слою сети обучатся более независимо от других слоев;&lt;br /&gt;
* становится возможным использование более высокого темпа обучения, так как пакетная нормализация гарантирует, что выходы узлов нейронной сети не будут иметь слишком больших или малых значений;&lt;br /&gt;
* пакетная нормализация в каком-то смысле также является механизмом регуляризации: данный метод привносит в выходы узлов скрытых слоев некоторый шум, аналогично методу [[Практики реализации нейронных сетей#Dropout|dropout]];&lt;br /&gt;
* модели становятся менее чувствительны к начальной инициализации весов.&lt;br /&gt;
&lt;br /&gt;
==Описание метода==&lt;br /&gt;
Опишем устройство метода пакетной нормализации. Пусть на вход некоторому слою нейронной сети поступает вектор размерности &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;x = (x^{(1)}, \ldots, x^{(d)})&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;\hat{x}^{(k)} = \displaystyle \frac{x^{(k)} - E(x^{(k)})}{\sqrt{D(x^{(k)})}}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где математическое ожидание и дисперсия считаются по всей обучающей выборке. Такая нормализация входа слоя нейронной сети может изменить представление данных в слое. Чтобы избежать данной проблемы, вводятся два параметра сжатия и сдвига нормализованной величины для каждого &amp;lt;tex&amp;gt;x^{(k)}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; {{---}} которые действуют следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данные параметры настраиваются в процессе обучения вместе с остальными [[Модель_алгоритма_и_ее_выбор|параметрами модели]].&lt;br /&gt;
&lt;br /&gt;
Пусть обучение модели производится с помощью пакетов &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; размера &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;B = \{x_{1},\ldots, x_{m}\}&amp;lt;/tex&amp;gt;. Здесь нормализация применяется к каждому элементу входа с номером &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; отдельно, поэтому в &amp;lt;tex&amp;gt;x^{(k)}&amp;lt;/tex&amp;gt; индекс опускается для ясности изложения. Пусть были получены нормализованные значения пакета &amp;lt;tex&amp;gt;\hat{x}_{1},\ldots, \hat{x}_{m}&amp;lt;/tex&amp;gt;. После применения операций сжатия и сдвига были получены &amp;lt;tex&amp;gt;y_{1},\ldots, y_{m}&amp;lt;/tex&amp;gt;. Обозначим данную функцию пакетной нормализации следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;BN_{\gamma, \beta}: \{x_{1},\ldots, x_{m}\} \rightarrow \{y_{1},\ldots, y_{m}\}&amp;lt;/tex&amp;gt;&lt;br /&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;B = \{x_{1},\ldots, x_{m}\}&amp;lt;/tex&amp;gt;; настраиваемые параметры &amp;lt;tex&amp;gt;\gamma, \beta&amp;lt;/tex&amp;gt;; константа &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; для вычислительной устойчивости.&lt;br /&gt;
 '''Выход''': &amp;lt;tex&amp;gt;\{y_{i} = BN_{\gamma, \beta}(x_{i})\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\mu_{B} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} x_{i}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// математическое ожидание пакета&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\sigma_{B}^{2} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} (x_{i} - \mu_{B})^{2}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// дисперсия пакета&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\hat{x}_{i} = \displaystyle \frac{x_{i} - \mu_{B}}{\sqrt{\sigma_{B}^{2} + \epsilon}}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// нормализация&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;y_{i} = \gamma \hat{x}_{i} + \beta \equiv BN_{\gamma, \beta}(x_{i}) &amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// сжатие и сдвиг&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что если &amp;lt;tex&amp;gt;\beta=\mu_{B}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\gamma=\sqrt{\sigma_{B}^{2} + \epsilon}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;y_{i}&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;x_{i}&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;BN_{\gamma, \beta}(\cdot)&amp;lt;/tex&amp;gt; является тождественным отображением.&lt;br /&gt;
Таким образом, использование пакетной нормализации не может привести к снижению точности, поскольку оптимизатор просто может использовать нормализацию как тождественное отображение.&lt;br /&gt;
&lt;br /&gt;
==Обучение нейронных сетей с пакетной нормализацией==&lt;br /&gt;
[[Файл:BNcircuit.png|700px|thumb|Рисунок 2. [[Настройка_глубокой_сети#Граф вычислений|Граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки. Слева-направо черными стрелками показана работа алгоритма в прямом направлении. А справа-налево красными стрелками {{---}} в обратном направлении, где вычисляется градиент функции потерь. Здесь &amp;lt;tex&amp;gt;N=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D=d&amp;lt;/tex&amp;gt;. Иллюстрация из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи].]]&lt;br /&gt;
&lt;br /&gt;
Для обучения нейронных сетей необходимо вычислять [[wikipedia:ru:Градиент|градиент]] [[wikipedia:en:Loss_function|функции потерь]] &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;. В случае использования метода пакетной нормализации градиент вычисляется следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \hat{x}_{i}} = \frac{\partial l}{\partial y_{i}} \cdot \gamma&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \sigma_{B}^{2}} = \sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot (x_{i} - \mu_{B}) \cdot \frac{-1}{2}(\sigma_{B}^{2} + \epsilon)^{-3/2}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \mu_{B}} = \left(\sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{-1}{\sqrt{\sigma_{B}^{2} + \epsilon}}\right) + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{\sum_{i=1}^{m}-2(x_{i}-\mu_{B})}{m}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (3)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial x_{i}} = \frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{1}{\sqrt{\sigma_{B}^{2} + \epsilon}} + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{2(x_{i}-\mu_{B})}{m} + \frac{\partial l}{\partial \mu_{B}} \cdot \frac{1}{m}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (4)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \gamma} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}} \cdot \hat{x}_{i}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (5)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \beta} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (6)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На Рисунке 2 изображен [[Настройка_глубокой_сети#Граф вычислений|граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки.&lt;br /&gt;
&lt;br /&gt;
В прямом направлении, как и описано в алгоритме метода, из входа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; вычисляется среднее значение по каждой размерности признакового пространства. Затем полученный вектор средних значение вычитается из каждого элемента обучающей выборки. Далее вычисляется дисперсия,  и с помощью нее вычисляется знаменатель для нормализации. Затем полученное значение инвертируется и умножается на разницу входа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и средних значений. В конце применяются параметры &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В обратном направлении вычисляются производные необходимых функций. В следующей таблице подробнее изображены шаги вычисления градиента функции потерь (иллюстрации из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи], здесь &amp;lt;tex&amp;gt;N=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D=d&amp;lt;/tex&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| cellpadding = &amp;quot;20&amp;quot; class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаг !! Изображение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 1&lt;br /&gt;
|[[Файл:step9.png|300px]]&lt;br /&gt;
|Сначала вычисляется производная по параметру &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, как в уравнении &amp;lt;tex&amp;gt;(6)&amp;lt;/tex&amp;gt;, так как к нему применяется только операции суммирования. И значение градиента выхода передается без изменений.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 2&lt;br /&gt;
|[[Файл:step8.png|300px]]&lt;br /&gt;
|Далее, пользуясь правилом вычисления производной при умножении, как в уравнении &amp;lt;tex&amp;gt;(5)&amp;lt;/tex&amp;gt;, вычисляется градиент по параметру &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;. Градиент выхода умножается на данную константу, получая уравнение &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;, и передается в следующий узел.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 3&lt;br /&gt;
|[[Файл:step7.png|300px]]&lt;br /&gt;
|Данный шаг вычисляется аналогично предыдущему, применяя правило вычисления производной при умножении.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 4&lt;br /&gt;
|[[Файл:step6.png|300px]]&lt;br /&gt;
|Пользуясь производной обратной величины, вычисляем следующий узел графа.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 5&lt;br /&gt;
|[[Файл:step5.png|300px]]&lt;br /&gt;
|Вычисляем производную квадратного корня с добавлением &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 6&lt;br /&gt;
|[[Файл:step4.png|300px]]&lt;br /&gt;
|Вычисляем производную суммы по всем компонентам входного вектора, получая матрицу.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 7&lt;br /&gt;
|[[Файл:step3.png|300px]]&lt;br /&gt;
|Получаем производную квадрата входящей функции.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 8&lt;br /&gt;
|[[Файл:step2.png|300px]]&lt;br /&gt;
|На данном шаге в одном узле сходятся ветки, поэтому полученные производные просто складываются, получая уравнение &amp;lt;tex&amp;gt;(2)&amp;lt;/tex&amp;gt; для производной по дисперсии.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 9&lt;br /&gt;
|[[Файл:step1.png|300px]]&lt;br /&gt;
|Аналогично шагу 6 вычисляем матрицу по сумме для производной по математическому ожиданию, получая формулу &amp;lt;tex&amp;gt;(3)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 10&lt;br /&gt;
|[[Файл:step0.png|300px]]&lt;br /&gt;
|В начальной вершине получаем уравнение &amp;lt;tex&amp;gt;(4)&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;z = g(Wu + b)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;W&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} настраиваемые параметры модели, а &amp;lt;tex&amp;gt;g(\cdot)&amp;lt;/tex&amp;gt; {{---}} некоторая нелинейная функция, например [[Практики реализации нейронных сетей#Sigmoid function|cигмоида]] или [[Практики реализации нейронных сетей#Rectified Linear Units (ReLU)|ReLU]]. Данной функцией можно описать как обычные, так и сверточные слои нейронных сетей. Пакетная нормализация применяется сразу перед функцией &amp;lt;tex&amp;gt;g(\cdot)&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;x = Wu + b&amp;lt;/tex&amp;gt;. Параметр &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; может быть опущен, так как в дальнейших вычислениях его роль будет играть параметр &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. Поэтому &amp;lt;tex&amp;gt;z = g(Wu + b)&amp;lt;/tex&amp;gt; может быть записано так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;z = g(BN(Wu))&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;BN&amp;lt;/tex&amp;gt; применяется отдельно к каждой размерности &amp;lt;tex&amp;gt;x=Wu&amp;lt;/tex&amp;gt; с отдельной парой параметров &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; для каждой размерности.&lt;br /&gt;
&lt;br /&gt;
В случае свёрточных сетей, дополнительно необходима нормализация, чтобы удовлетворить свойство свёрточных сетей, что различные элементы в разных местах одной карты признаков (образ операции свёртки, англ. feature map) должны быть нормализованы одинаково. Чтобы этого добиться, нормализация выполняется совместно над всеми значениями в пакете. Пусть &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; {{---}} множество всех значений в карте признаков по всему пакету и всем точкам в карте признаков. Тогда для пакета размера &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; и карты признаков размера &amp;lt;tex&amp;gt;p \times q&amp;lt;/tex&amp;gt; размер &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;m'=|B|=m \cdot pq&amp;lt;/tex&amp;gt;. Тогда параметры &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; настраиваются для каждой карты признаков отдельно.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
[[File:bn_exp_1.png|300px|thumb|Рисунок 3. Точность распознавания в зависимости от итерации обучения. Оранжевая кривая изображает результаты для модели с использованием пакетной нормализации, синяя кривая {{---}} без. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]&lt;br /&gt;
[[File:bn_exp_2.png|300px|thumb|Рисунок 4. Точность распознавания в зависимости от итерации обучения c использованием сигмоиды в качетсве функции активации. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]&lt;br /&gt;
&lt;br /&gt;
Приведем пример демонстрирующий работу пакетной нормализации. &lt;br /&gt;
Рассмотрим задачу распознавания рукописных цифр на известном датасете MNIST &amp;lt;ref&amp;gt;[http://yann.lecun.com/exdb/mnist/ Датасет MNIST]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
Для решения задачи будет использоваться обычная нейронная сеть с &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; скрытыми полносвязными слоями по &amp;lt;tex&amp;gt;100&amp;lt;/tex&amp;gt; узлов в каждом. &lt;br /&gt;
Функция активации {{---}} ReLU. &lt;br /&gt;
Выходной слой содержит &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt; узлов. &lt;br /&gt;
Размер пакета равен &amp;lt;tex&amp;gt;60&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Сравниваются две одинаковые модели, но в первой перед каждым скрытым слоем используется пакетная нормализация, а во второй {{---}} нет. &lt;br /&gt;
Темп обучения равен &amp;lt;tex&amp;gt;0.01&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Веса инициализированы значениями с малой дисперсией. &lt;br /&gt;
&lt;br /&gt;
На Рисунке 3 изображены два графика, показывающие разницу между моделями. &lt;br /&gt;
Как видно, обе модели достигли высокой точности, но модель с использованием пакетной нормализации достигла точности более &amp;lt;tex&amp;gt;90\%&amp;lt;/tex&amp;gt; быстрее, почти сразу, и достигла максимума, примерно, уже на &amp;lt;tex&amp;gt;10000&amp;lt;/tex&amp;gt; итераций. Однако, модель без пакетной нормализации достигла скорости обучения примерно &amp;lt;tex&amp;gt;510&amp;lt;/tex&amp;gt; пакетов в секунду, а модель с использованием пакетной нормализации {{---}} &amp;lt;tex&amp;gt;270&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Однако, как можно видеть, пакетная нормализация позволяет выполнить меньшее количество итераций и, в итоге, сойтись за меньшее время.&lt;br /&gt;
&lt;br /&gt;
На Рисунке 4 изображен график, сравнивающий точно такие же модели, но с использованием сигмоиды в качестве функции активации. &lt;br /&gt;
Такая конфигурация моделей требует большего времени, чтобы начать обучение. &lt;br /&gt;
В итоге, модель обучается, но на это потребовалось более &amp;lt;tex&amp;gt;45000&amp;lt;/tex&amp;gt; итераций, чтобы получить точность более &amp;lt;tex&amp;gt;80\%&amp;lt;/tex&amp;gt;. &lt;br /&gt;
При использовании пакетной нормализации получилось достичь точность более &amp;lt;tex&amp;gt;90\%&amp;lt;/tex&amp;gt; примерно за &amp;lt;tex&amp;gt;1000&amp;lt;/tex&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
==Реализации==&lt;br /&gt;
Механизм пакетной нормализации реализован практически во всех современных инструментариях для машинного обучения, таких как: TensorFlow &amp;lt;ref&amp;gt;[https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization TensorFlow]&amp;lt;/ref&amp;gt;, Keras &amp;lt;ref&amp;gt;[https://keras.io/layers/normalization/ Keras]&amp;lt;/ref&amp;gt;, CNTK &amp;lt;ref&amp;gt;[https://docs.microsoft.com/en-us/cognitive-toolkit/BatchNormalization CNTK]&amp;lt;/ref&amp;gt;, Theano &amp;lt;ref&amp;gt;[http://deeplearning.net/software/theano/library/tensor/nnet/bn.html Theano]&amp;lt;/ref&amp;gt;, PyTorch &amp;lt;ref&amp;gt;[https://pytorch.org/docs/stable/_modules/torch/nn/modules/batchnorm.html PyTorch]&amp;lt;/ref&amp;gt; и т.д.&lt;br /&gt;
&lt;br /&gt;
Приведем пример&amp;lt;ref&amp;gt;[https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad Batch normalization: theory and how to use it with Tensorflow]&amp;lt;/ref&amp;gt; применения пакетной нормализации с использованием библиотеки TensorFlow на языке программирования Python &amp;lt;ref&amp;gt;[https://www.python.org/ Язык программирования Python]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''import''' tensorflow '''as''' tf&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  is_train = tf.placeholder(tf.bool, name=&amp;quot;is_train&amp;quot;);&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  x_norm = tf.layers.batch_normalization(x, training=is_train)&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)&lt;br /&gt;
  '''with''' tf.control_dependencies(update_ops):&lt;br /&gt;
      train_op = optimizer.minimize(loss)&lt;br /&gt;
&lt;br /&gt;
==Модификации==&lt;br /&gt;
Существует несколько модификаций и вариаций метода пакетной нормализации:&lt;br /&gt;
# Тим Койманс&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1603.09025.pdf Cooijmans T. {{---}} Recurrent batch normalization, 2016]&amp;lt;/ref&amp;gt; в 2016 г. предложил способ применения пакетной нормализации к [[Рекуррентные нейронные сети|рекуррентным нейронным сетям]]&amp;lt;sup&amp;gt;[на 10.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Расширение метода пакетной нормализации было предложено Ликси Хуангом&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1804.08450.pdf Huang L. {{---}} Decorrelated Batch Normalization, 2018]&amp;lt;/ref&amp;gt; в 2018 г. Метод получил название декоррелированная пакетная нормализация (англ. Decorrelated Batch Normalization). В данном методе кроме операций масштабирования и сдвига была предложено использование специальной функции затирания данных. &lt;br /&gt;
# Джимми Лей Ба&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1607.06450.pdf Ba J. L., Kiros J. R., Hinton G. E. {{---}} Layer normalization, 2016]&amp;lt;/ref&amp;gt; в 2016 г. предложил метод нормализации слоев (англ. Layer Normalization), который решает проблему выбора размера пакета.&lt;br /&gt;
# В работе Сергея Иоффе&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1702.03275.pdf Ioffe S. {{---}} Batch renormalization: Towards reducing minibatch dependence in batch-normalized models, 2017]&amp;lt;/ref&amp;gt; в 2017 г. было представлено расширение метода пакетной нормализации: пакетная ренормализация (англ. Batch Renormalization). Данный метод улучшает пакетную нормализацию, когда размер пакетов мал и не состоит из независимых данных.&lt;br /&gt;
# Метод потоковой нормализации (англ. Streaming Normalization) был предложен Кифэном Ляо&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1610.06160.pdf Liao Q., Kawaguchi K., Poggio T. {{---}} Streaming normalization: Towards simpler and more biologically-plausible normalizations for online and recurrent learning, 2016]&amp;lt;/ref&amp;gt; в 2016 г. Данный метод убирает два ограничения пакетной нормализации: использование при [[wikipedia:ru:Онлайновое_обучение_машин|online-обучении]] и использование в рекуррентных нейронных сетях.&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;
* [https://arxiv.org/pdf/1502.03167.pdf Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift]&lt;br /&gt;
* [https://towardsdatascience.com/batch-normalization-in-neural-networks-1ac91516821c Glossary of Deep Learning: Batch Normalisation]&lt;br /&gt;
* [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html Understanding the backward pass through Batch Normalization Layer]&lt;br /&gt;
* [https://medium.com/@SeoJaeDuk/deeper-understanding-of-batch-normalization-with-interactive-code-in-tensorflow-manual-back-1d50d6903d35 Deeper Understanding of Batch Normalization with Interactive Code in Tensorflow]&lt;br /&gt;
* [https://www.learnopencv.com/batch-normalization-in-deep-networks/ Batch Normalization in Deep Networks]&lt;br /&gt;
* [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb Batch Normalization {{---}} Lesson]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Batch-normalization&amp;diff=69538</id>
		<title>Batch-normalization</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Batch-normalization&amp;diff=69538"/>
				<updated>2019-01-28T14:40:39Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Пакет */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Пакетная нормализация''' (англ. batch-normalization) {{---}} это метод, который позволяет повысить производительность и стабилизировать работу [[Нейронные сети, перцептрон | искусственных нейронных сетей]]. Суть данного метода заключается в том, что некоторым слоям нейронной сети на вход подаются данные, предварительно обработанные и имеющие нулевое [[Математическое ожидание случайной величины|математическое ожидание]] и единичную [[Дисперсия случайной величины|дисперсию]]. Впервые данный метод был представлен в &amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1502.03167.pdf Ioffe S., Szegedy C. {{---}} Batch normalization: Accelerating deep network training by reducing internal covariate shift, 2016]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Идея==&lt;br /&gt;
Нормализация входного слоя нейронной сети обычно выполняется путем масштабирования данных, подаваемых в функции активации. Например, когда есть признаки со значениями от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; и некоторые признаки со значениями от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;1000&amp;lt;/tex&amp;gt;, то их необходимо нормализовать, чтобы ускорить обучение. Нормализацию данных можно выполнить и в скрытых слоях нейронных сетей, что и делает метод пакетной нормализации.&lt;br /&gt;
===Пакет===&lt;br /&gt;
Предварительно, напомним, что такое '''пакет''' (англ. batch). Возможны два подхода к реализации алгоритма градиентного спуска для обучения нейросетевых моделей: стохастический и пакетный&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=Метод_стохастического_градиента Метод стохастического градиента]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
* [[Стохастический градиентный спуск|Стохастический градиентный спуск]] (англ. stochastic gradient descent) {{---}} реализация, в которой на каждой итерации алгоритма из обучающей выборки каким-то (случайным) образом выбирается только один объект. &lt;br /&gt;
* Пакетный (батч) (англ. batch gradient descent) {{---}} реализация градиентного спуска, когда на каждой итерации обучающая выборка просматривается целиком, и только после этого изменяются веса модели. &lt;br /&gt;
&lt;br /&gt;
Также существует &amp;quot;золотая середина&amp;quot; между стохастическим градиентным спуском и пакетным градиентным спуском {{---}} когда просматривается только некоторое подмножество обучающей выборки фиксированного размера (англ. batch-size). В таком случае такие подмножества принято называть мини-пакетом (англ. mini-batch). Здесь и далее, мини-пакеты будем также называть пакетом.&lt;br /&gt;
&lt;br /&gt;
===Ковариантный сдвиг===&lt;br /&gt;
[[Файл:covariate-shift1.png|600px|thumb|Рисунок 1. Верхние две строки роз показывают первое подмножество данных, а нижние две строки показывают другое подмножество. Два подмножества имеют разные пропорции изображения роз. На графиках показано распределение двух классов в пространстве объектов с использованием красных и зеленых точек. Синяя линия показывает границу между двумя классами. Иллюстрация из [https://www.learnopencv.com/batch-normalization-in-deep-networks/ статьи].]]&lt;br /&gt;
Пакетная нормализация уменьшает величину, на которую смещаются значения узлов в скрытых слоях (т.н. '''[[Ковариация случайных величин|ковариантный]] сдвиг''' (англ. covariance shift)). &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;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; изменяется, то появляется необходимость обучить модель заново, чтобы &amp;quot;выровнять&amp;quot; пропорции элементов в &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;
Это довольно сильно замедляет процесс обучения модели. На Рисунке 1 изображена разница в пропорциях.&lt;br /&gt;
&lt;br /&gt;
Простой способ решить проблему ковариантного сдвига для входного слоя {{---}} это случайным образом перемешать данные перед созданием пакетов. &lt;br /&gt;
Но для скрытых слоев нейронной сети такой метод не подходит, так как распределение входных данных для каждого узла скрытых слоев изменяется каждый раз, когда происходит обновление параметров в предыдущем слое. &lt;br /&gt;
Эта проблема называется '''внутренним ковариантным сдвигом''' (англ. internal covariate shift). &lt;br /&gt;
Для решения данной проблемы часто приходится использовать низкий [[Стохастический градиентный спуск|темп обучения]]&amp;lt;sup&amp;gt;[на 10.01.18 не создано]&amp;lt;/sup&amp;gt; (англ. learning rate) и методы [[wikipedia:ru:Регуляризация_(математика)|регуляризации]] при обучении модели. &lt;br /&gt;
Другим способом устранения внутреннего ковариантного сдвига является метод пакетной нормализации.&lt;br /&gt;
&lt;br /&gt;
===Свойства пакетной нормализации===&lt;br /&gt;
Кроме того, использование пакетной нормализации обладает еще несколькими дополнительными полезными свойствами:&lt;br /&gt;
* достигается более быстрая сходимость моделей, несмотря на выполнение дополнительных вычислений;&lt;br /&gt;
* пакетная нормализация позволяет каждому слою сети обучатся более независимо от других слоев;&lt;br /&gt;
* становится возможным использование более высокого темпа обучения, так как пакетная нормализация гарантирует, что выходы узлов нейронной сети не будут иметь слишком больших или малых значений;&lt;br /&gt;
* пакетная нормализация в каком-то смысле также является механизмом регуляризации: данный метод привносит в выходы узлов скрытых слоев некоторый шум, аналогично методу [[Практики реализации нейронных сетей#Dropout|dropout]];&lt;br /&gt;
* модели становятся менее чувствительны к начальной инициализации весов.&lt;br /&gt;
&lt;br /&gt;
==Описание метода==&lt;br /&gt;
Опишем устройство метода пакетной нормализации. Пусть на вход некоторому слою нейронной сети поступает вектор размерности &amp;lt;tex&amp;gt;d&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;x = (x^{(1)}, \ldots, x^{(d)})&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;\hat{x}^{(k)} = \displaystyle \frac{x^{(k)} - E(x^{(k)})}{\sqrt{D(x^{(k)})}}&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где математическое ожидание и дисперсия считаются по всей обучающей выборке. Такая нормализация входа слоя нейронной сети может изменить представление данных в слое. Чтобы избежать данной проблемы, вводятся два параметра сжатия и сдвига нормализованной величины для каждого &amp;lt;tex&amp;gt;x^{(k)}&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; {{---}} которые действуют следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Данные параметры настраиваются в процессе обучения вместе с остальными [[Модель_алгоритма_и_ее_выбор|параметрами модели]].&lt;br /&gt;
&lt;br /&gt;
Пусть обучение модели производится с помощью пакетов &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; размера &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;B = \{x_{1},\ldots, x_{m}\}&amp;lt;/tex&amp;gt;. Здесь нормализация применяется к каждому элементу входа с номером &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; отдельно, поэтому в &amp;lt;tex&amp;gt;x^{(k)}&amp;lt;/tex&amp;gt; индекс опускается для ясности изложения. Пусть были получены нормализованные значения пакета &amp;lt;tex&amp;gt;\hat{x}_{1},\ldots, \hat{x}_{m}&amp;lt;/tex&amp;gt;. После применения операций сжатия и сдвига были получены &amp;lt;tex&amp;gt;y_{1},\ldots, y_{m}&amp;lt;/tex&amp;gt;. Обозначим данную функцию пакетной нормализации следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;BN_{\gamma, \beta}: \{x_{1},\ldots, x_{m}\} \rightarrow \{y_{1},\ldots, y_{m}\}&amp;lt;/tex&amp;gt;&lt;br /&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;B = \{x_{1},\ldots, x_{m}\}&amp;lt;/tex&amp;gt;; настраиваемые параметры &amp;lt;tex&amp;gt;\gamma, \beta&amp;lt;/tex&amp;gt;; константа &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt; для вычислительной устойчивости.&lt;br /&gt;
 '''Выход''': &amp;lt;tex&amp;gt;\{y_{i} = BN_{\gamma, \beta}(x_{i})\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\mu_{B} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} x_{i}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// математическое ожидание пакета&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\sigma_{B}^{2} = \displaystyle \frac{1}{m} \sum_{i=1}^{m} (x_{i} - \mu_{B})^{2}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// дисперсия пакета&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;\hat{x}_{i} = \displaystyle \frac{x_{i} - \mu_{B}}{\sqrt{\sigma_{B}^{2} + \epsilon}}&amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// нормализация&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt;y_{i} = \gamma \hat{x}_{i} + \beta \equiv BN_{\gamma, \beta}(x_{i}) &amp;lt;/tex&amp;gt; &amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;// сжатие и сдвиг&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что если &amp;lt;tex&amp;gt;\beta=\mu_{B}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\gamma=\sqrt{\sigma_{B}^{2} + \epsilon}&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;y_{i}&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;x_{i}&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;BN_{\gamma, \beta}(\cdot)&amp;lt;/tex&amp;gt; является тождественным отображением.&lt;br /&gt;
Таким образом, использование пакетной нормализации не может привести к снижению точности, поскольку оптимизатор просто может использовать нормализацию как тождественное отображение.&lt;br /&gt;
&lt;br /&gt;
==Обучение нейронных сетей с пакетной нормализацией==&lt;br /&gt;
[[Файл:BNcircuit.png|700px|thumb|Рисунок 2. [[Настройка_глубокой_сети#Граф вычислений|Граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки. Слева-направо черными стрелками показана работа алгоритма в прямом направлении. А справа-налево красными стрелками {{---}} в обратном направлении, где вычисляется градиент функции потерь. Здесь &amp;lt;tex&amp;gt;N=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D=d&amp;lt;/tex&amp;gt;. Иллюстрация из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи].]]&lt;br /&gt;
&lt;br /&gt;
Для обучения нейронных сетей необходимо вычислять [[wikipedia:ru:Градиент|градиент]] [[wikipedia:en:Loss_function|функции потерь]] &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt;. В случае использования метода пакетной нормализации градиент вычисляется следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \hat{x}_{i}} = \frac{\partial l}{\partial y_{i}} \cdot \gamma&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \sigma_{B}^{2}} = \sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot (x_{i} - \mu_{B}) \cdot \frac{-1}{2}(\sigma_{B}^{2} + \epsilon)^{-3/2}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \mu_{B}} = \left(\sum_{i=1}^{m}\frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{-1}{\sqrt{\sigma_{B}^{2} + \epsilon}}\right) + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{\sum_{i=1}^{m}-2(x_{i}-\mu_{B})}{m}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (3)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial x_{i}} = \frac{\partial l}{\partial \hat{x}_{i}} \cdot \frac{1}{\sqrt{\sigma_{B}^{2} + \epsilon}} + \frac{\partial l}{\partial \sigma_{B}^{2}} \cdot \frac{2(x_{i}-\mu_{B})}{m} + \frac{\partial l}{\partial \mu_{B}} \cdot \frac{1}{m}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (4)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \gamma} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}} \cdot \hat{x}_{i}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (5)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\displaystyle \frac{\partial l}{\partial \beta} = \sum_{i=1}^{m}\frac{\partial l}{\partial y_{i}}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; (6)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На Рисунке 2 изображен [[Настройка_глубокой_сети#Граф вычислений|граф вычислений]] слоя пакетной нормализации алгоритмом обратного распространения ошибки.&lt;br /&gt;
&lt;br /&gt;
В прямом направлении, как и описано в алгоритме метода, из входа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; вычисляется среднее значение по каждой размерности признакового пространства. Затем полученный вектор средних значение вычитается из каждого элемента обучающей выборки. Далее вычисляется дисперсия,  и с помощью нее вычисляется знаменатель для нормализации. Затем полученное значение инвертируется и умножается на разницу входа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; и средних значений. В конце применяются параметры &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В обратном направлении вычисляются производные необходимых функций. В следующей таблице подробнее изображены шаги вычисления градиента функции потерь (иллюстрации из [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html статьи], здесь &amp;lt;tex&amp;gt;N=m&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D=d&amp;lt;/tex&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
{| cellpadding = &amp;quot;20&amp;quot; class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаг !! Изображение !! Описание&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 1&lt;br /&gt;
|[[Файл:step9.png|300px]]&lt;br /&gt;
|Сначала вычисляется производная по параметру &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;, как в уравнении &amp;lt;tex&amp;gt;(6)&amp;lt;/tex&amp;gt;, так как к нему применяется только операции суммирования. И значение градиента выхода передается без изменений.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 2&lt;br /&gt;
|[[Файл:step8.png|300px]]&lt;br /&gt;
|Далее, пользуясь правилом вычисления производной при умножении, как в уравнении &amp;lt;tex&amp;gt;(5)&amp;lt;/tex&amp;gt;, вычисляется градиент по параметру &amp;lt;tex&amp;gt;\gamma&amp;lt;/tex&amp;gt;. Градиент выхода умножается на данную константу, получая уравнение &amp;lt;tex&amp;gt;(1)&amp;lt;/tex&amp;gt;, и передается в следующий узел.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 3&lt;br /&gt;
|[[Файл:step7.png|300px]]&lt;br /&gt;
|Данный шаг вычисляется аналогично предыдущему, применяя правило вычисления производной при умножении.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 4&lt;br /&gt;
|[[Файл:step6.png|300px]]&lt;br /&gt;
|Пользуясь производной обратной величины, вычисляем следующий узел графа.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 5&lt;br /&gt;
|[[Файл:step5.png|300px]]&lt;br /&gt;
|Вычисляем производную квадратного корня с добавлением &amp;lt;tex&amp;gt;\epsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 6&lt;br /&gt;
|[[Файл:step4.png|300px]]&lt;br /&gt;
|Вычисляем производную суммы по всем компонентам входного вектора, получая матрицу.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 7&lt;br /&gt;
|[[Файл:step3.png|300px]]&lt;br /&gt;
|Получаем производную квадрата входящей функции.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 8&lt;br /&gt;
|[[Файл:step2.png|300px]]&lt;br /&gt;
|На данном шаге в одном узле сходятся ветки, поэтому полученные производные просто складываются, получая уравнение &amp;lt;tex&amp;gt;(2)&amp;lt;/tex&amp;gt; для производной по дисперсии.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 9&lt;br /&gt;
|[[Файл:step1.png|300px]]&lt;br /&gt;
|Аналогично шагу 6 вычисляем матрицу по сумме для производной по математическому ожиданию, получая формулу &amp;lt;tex&amp;gt;(3)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| style = &amp;quot;text-align: center&amp;quot; | 10&lt;br /&gt;
|[[Файл:step0.png|300px]]&lt;br /&gt;
|В начальной вершине получаем уравнение &amp;lt;tex&amp;gt;(4)&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;z = g(Wu + b)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;W&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; {{---}} настраиваемые параметры модели, а &amp;lt;tex&amp;gt;g(\cdot)&amp;lt;/tex&amp;gt; {{---}} некоторая нелинейная функция, например [[Практики реализации нейронных сетей#Sigmoid function|cигмоида]] или [[Практики реализации нейронных сетей#Rectified Linear Units (ReLU)|ReLU]]. Данной функцией можно описать как обычные, так и сверточные слои нейронных сетей. Пакетная нормализация применяется сразу перед функцией &amp;lt;tex&amp;gt;g(\cdot)&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;x = Wu + b&amp;lt;/tex&amp;gt;. Параметр &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; может быть опущен, так как в дальнейших вычислениях его роль будет играть параметр &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt;. Поэтому &amp;lt;tex&amp;gt;z = g(Wu + b)&amp;lt;/tex&amp;gt; может быть записано так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;z = g(BN(Wu))&amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt;BN&amp;lt;/tex&amp;gt; применяется отдельно к каждой размерности &amp;lt;tex&amp;gt;x=Wu&amp;lt;/tex&amp;gt; с отдельной парой параметров &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; для каждой размерности.&lt;br /&gt;
&lt;br /&gt;
В случае свёрточных сетей, дополнительно необходима нормализация, чтобы удовлетворить свойство свёрточных сетей, что различные элементы в разных местах одной карты признаков (образ операции свёртки, англ. feature map) должны быть нормализованы одинаково. Чтобы этого добиться, нормализация выполняется совместно над всеми значениями в пакете. Пусть &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; {{---}} множество всех значений в карте признаков по всему пакету и всем точкам в карте признаков. Тогда для пакета размера &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; и карты признаков размера &amp;lt;tex&amp;gt;p \times q&amp;lt;/tex&amp;gt; размер &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;m'=|B|=m \cdot pq&amp;lt;/tex&amp;gt;. Тогда параметры &amp;lt;tex&amp;gt;\gamma^{(k)}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta^{(k)}&amp;lt;/tex&amp;gt; настраиваются для каждой карты признаков отдельно.&lt;br /&gt;
&lt;br /&gt;
==Пример==&lt;br /&gt;
[[File:bn_exp_1.png|300px|thumb|Рисунок 3. Точность распознавания в зависимости от итерации обучения. Оранжевая кривая изображает результаты для модели с использованием пакетной нормализации, синяя кривая {{---}} без. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]&lt;br /&gt;
[[File:bn_exp_2.png|300px|thumb|Рисунок 4. Точность распознавания в зависимости от итерации обучения c использованием сигмоиды в качетсве функции активации. Иллюстрация из [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb статьи].]]&lt;br /&gt;
&lt;br /&gt;
Приведем пример демонстрирующий работу пакетной нормализации. &lt;br /&gt;
Рассмотрим задачу распознавания рукописных цифр на известном датасете MNIST &amp;lt;ref&amp;gt;[http://yann.lecun.com/exdb/mnist/ Датасет MNIST]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
Для решения задачи будет использоваться обычная нейронная сеть с &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; скрытыми полносвязными слоями по &amp;lt;tex&amp;gt;100&amp;lt;/tex&amp;gt; узлов в каждом. &lt;br /&gt;
Функция активации {{---}} ReLU. &lt;br /&gt;
Выходной слой содержит &amp;lt;tex&amp;gt;10&amp;lt;/tex&amp;gt; узлов. &lt;br /&gt;
Размер пакета равен &amp;lt;tex&amp;gt;60&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Сравниваются две одинаковые модели, но в первой перед каждым скрытым слоем используется пакетная нормализация, а во второй {{---}} нет. &lt;br /&gt;
Темп обучения равен &amp;lt;tex&amp;gt;0.01&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Веса инициализированы значениями с малой дисперсией. &lt;br /&gt;
&lt;br /&gt;
На Рисунке 3 изображены два графика, показывающие разницу между моделями. &lt;br /&gt;
Как видно, обе модели достигли высокой точности, но модель с использованием пакетной нормализации достигла точности более &amp;lt;tex&amp;gt;90\%&amp;lt;/tex&amp;gt; быстрее, почти сразу, и достигла максимума, примерно, уже на &amp;lt;tex&amp;gt;10000&amp;lt;/tex&amp;gt; итераций. Однако, модель без пакетной нормализации достигла скорости обучения примерно &amp;lt;tex&amp;gt;510&amp;lt;/tex&amp;gt; пакетов в секунду, а модель с использованием пакетной нормализации {{---}} &amp;lt;tex&amp;gt;270&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Однако, как можно видеть, пакетная нормализация позволяет выполнить меньшее количество итераций и, в итоге, сойтись за меньшее время.&lt;br /&gt;
&lt;br /&gt;
На Рисунке 4 изображен график, сравнивающий точно такие же модели, но с использованием сигмоиды в качестве функции активации. &lt;br /&gt;
Такая конфигурация моделей требует большего времени, чтобы начать обучение. &lt;br /&gt;
В итоге, модель обучается, но на это потребовалось более &amp;lt;tex&amp;gt;45000&amp;lt;/tex&amp;gt; итераций, чтобы получить точность более &amp;lt;tex&amp;gt;80\%&amp;lt;/tex&amp;gt;. &lt;br /&gt;
При использовании пакетной нормализации получилось достичь точность более &amp;lt;tex&amp;gt;90\%&amp;lt;/tex&amp;gt; примерно за &amp;lt;tex&amp;gt;1000&amp;lt;/tex&amp;gt; итераций.&lt;br /&gt;
&lt;br /&gt;
==Реализации==&lt;br /&gt;
Механизм пакетной нормализации реализован практически во всех современных инструментариях для машинного обучения, таких как: TensorFlow &amp;lt;ref&amp;gt;[https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization TensorFlow]&amp;lt;/ref&amp;gt;, Keras &amp;lt;ref&amp;gt;[https://keras.io/layers/normalization/ Keras]&amp;lt;/ref&amp;gt;, CNTK &amp;lt;ref&amp;gt;[https://docs.microsoft.com/en-us/cognitive-toolkit/BatchNormalization CNTK]&amp;lt;/ref&amp;gt;, Theano &amp;lt;ref&amp;gt;[http://deeplearning.net/software/theano/library/tensor/nnet/bn.html Theano]&amp;lt;/ref&amp;gt;, PyTorch &amp;lt;ref&amp;gt;[https://pytorch.org/docs/stable/_modules/torch/nn/modules/batchnorm.html PyTorch]&amp;lt;/ref&amp;gt; и т.д.&lt;br /&gt;
&lt;br /&gt;
Приведем пример&amp;lt;ref&amp;gt;[https://towardsdatascience.com/batch-normalization-theory-and-how-to-use-it-with-tensorflow-1892ca0173ad Batch normalization: theory and how to use it with Tensorflow]&amp;lt;/ref&amp;gt; применения пакетной нормализации с использованием библиотеки TensorFlow на языке программирования Python &amp;lt;ref&amp;gt;[https://www.python.org/ Язык программирования Python]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  '''import''' tensorflow '''as''' tf&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  is_train = tf.placeholder(tf.bool, name=&amp;quot;is_train&amp;quot;);&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  x_norm = tf.layers.batch_normalization(x, training=is_train)&lt;br /&gt;
  &amp;lt;font color=green&amp;gt;# ...&amp;lt;/font&amp;gt;&lt;br /&gt;
  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)&lt;br /&gt;
  '''with''' tf.control_dependencies(update_ops):&lt;br /&gt;
      train_op = optimizer.minimize(loss)&lt;br /&gt;
&lt;br /&gt;
==Модификации==&lt;br /&gt;
Существует несколько модификаций и вариаций метода пакетной нормализации:&lt;br /&gt;
# Тим Койманс&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1603.09025.pdf Cooijmans T. {{---}} Recurrent batch normalization, 2016]&amp;lt;/ref&amp;gt; в 2016 г. предложил способ применения пакетной нормализации к [[Рекуррентные нейронные сети|рекуррентным нейронным сетям]]&amp;lt;sup&amp;gt;[на 10.01.18 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
# Расширение метода пакетной нормализации было предложено Ликси Хуангом&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1804.08450.pdf Huang L. {{---}} Decorrelated Batch Normalization, 2018]&amp;lt;/ref&amp;gt; в 2018 г. Метод получил название декоррелированная пакетная нормализация (англ. Decorrelated Batch Normalization). В данном методе кроме операций масштабирования и сдвига была предложено использование специальной функции затирания данных. &lt;br /&gt;
# Джимми Лей Ба&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1607.06450.pdf Ba J. L., Kiros J. R., Hinton G. E. {{---}} Layer normalization, 2016]&amp;lt;/ref&amp;gt; в 2016 г. предложил метод нормализации слоев (англ. Layer Normalization), который решает проблему выбора размера пакета.&lt;br /&gt;
# В работе Сергея Иоффе&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1702.03275.pdf Ioffe S. {{---}} Batch renormalization: Towards reducing minibatch dependence in batch-normalized models, 2017]&amp;lt;/ref&amp;gt; в 2017 г. было представлено расширение метода пакетной нормализации: пакетная ренормализация (англ. Batch Renormalization). Данный метод улучшает пакетную нормализацию, когда размер пакетов мал и не состоит из независимых данных.&lt;br /&gt;
# Метод потоковой нормализации (англ. Streaming Normalization) был предложен Кифэном Ляо&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1610.06160.pdf Liao Q., Kawaguchi K., Poggio T. {{---}} Streaming normalization: Towards simpler and more biologically-plausible normalizations for online and recurrent learning, 2016]&amp;lt;/ref&amp;gt; в 2016 г. Данный метод убирает два ограничения пакетной нормализации: использование при [[wikipedia:ru:Онлайновое_обучение_машин|online-обучении]] и использование в рекуррентных нейронных сетях.&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;
* [https://arxiv.org/pdf/1502.03167.pdf Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift]&lt;br /&gt;
* [https://towardsdatascience.com/batch-normalization-in-neural-networks-1ac91516821c Glossary of Deep Learning: Batch Normalisation]&lt;br /&gt;
* [https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html Understanding the backward pass through Batch Normalization Layer]&lt;br /&gt;
* [https://medium.com/@SeoJaeDuk/deeper-understanding-of-batch-normalization-with-interactive-code-in-tensorflow-manual-back-1d50d6903d35 Deeper Understanding of Batch Normalization with Interactive Code in Tensorflow]&lt;br /&gt;
* [https://www.learnopencv.com/batch-normalization-in-deep-networks/ Batch Normalization in Deep Networks]&lt;br /&gt;
* [https://github.com/udacity/deep-learning/blob/master/batch-norm/Batch_Normalization_Lesson.ipynb Batch Normalization {{---}} Lesson]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=69537</id>
		<title>Настройка глубокой сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B9_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=69537"/>
				<updated>2019-01-28T14:40:10Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См.также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5 Глубокая сеть] состоит из нескольких слоев, где каждый слой организован таким образом, что каждый нейрон в одном слое получает свою копию всех выходных данных предыдущего слоя. Эта модель идеально подходит для определенных типов задач, например, обучение на ограниченном количество более или менее неструктурированных параметров. Существует множество способов изменения параметров (весов) в такой модели, когда ей на вход поступают необработанные данные. &lt;br /&gt;
&lt;br /&gt;
== Инициализация сети ==&lt;br /&gt;
&lt;br /&gt;
Принцип выбора начальных значений весов для слоев, составляющих модель очень важен: установка всех весов в 0 будет серьезным препятствием для обучения, так как ни один из весов изначально не будет активен. Присваивать весам значения из интервала ±1 — тоже обычно не лучший вариант — на самом деле, иногда (в зависимости от задачи и сложности модели) от правильной инициализации модели может зависеть, достигнет она высочайшей производительности или вообще не будет сходиться. Даже если задача не предполагает такой крайности, удачно выбранный способ инициализации весов может значительно влиять на способность модели к обучению, так как он предустанавливает параметры модели с учетом функции потерь&amp;lt;ref&amp;gt;[https://habr.com/company/wunderfund/blog/315476/ Тонкая настройка нейронной сети, Habr]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Всегда можно выбрать случайно начальное приближение, но лучше выбирать определённым образом, ниже приведены самые распространённые из них.&lt;br /&gt;
&lt;br /&gt;
Метод инициализации Завьера (Xavier) (иногда — метод Glorot’а)&amp;lt;ref&amp;gt;[http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf Understanding the difficulty of training deep feedforward neural networks]&amp;lt;/ref&amp;gt;. Основная идея этого метода — упростить прохождение сигнала через слой во время как прямого, так и обратного распространения ошибки для линейной функции активации (этот метод также хорошо работает для сигмоидной функции, так как участок, где она ненасыщена, также имеет линейный характер). При вычислении весов этот метод опирается на вероятностное распределение (равномерное или нормальное) с дисперсией, равной &amp;lt;tex&amp;gt;\mathrm{Var}(W) = {2 \over{n_{in} + n_{out}}}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n_{in}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;n_{out}&amp;lt;/tex&amp;gt; — количества нейронов в предыдущем и последующем слоях соответственно.&lt;br /&gt;
&lt;br /&gt;
Метод инициализации Ге (He) — это вариация метода Завьера, больше подходящая функции активации ReLU, компенсирующая тот факт, что эта функция возвращает нуль для половины области определения. А именно, в этом случае &amp;lt;tex&amp;gt;\mathrm{Var}(W) = {2 \over{n_{in}}}&amp;lt;/tex&amp;gt;&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1502.01852.pdf Delving Deep into Rectifiers]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Граф вычислений ==&lt;br /&gt;
Глубокие сети являются особенной формой графа вычиcлений.&lt;br /&gt;
[[Файл: Graph_comp.png|800px|thumb|Рис.1. Граф вычислений для функции &amp;lt;tex&amp;gt;f(a,b)=(a+b)*(b+1)&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Граф вычислений — это ориентированный граф, узлы которого соответствуют операциям или переменным. Переменные могут передавать свое значение в операции, а операции могут передавать свои результаты в другие операции. Таким образом, каждый узел в графе определяет функцию переменных.&lt;br /&gt;
&lt;br /&gt;
Значения, которые вводятся в узлы и выходят из узлов, называются тензорами (т.е. многомерными массивами). На рисунке 1 представлен граф вычислений для функции &amp;lt;tex&amp;gt;f(a,b)=(a+b)*(b+1)&amp;lt;/tex&amp;gt;. В нейронах сетях функций имеют больше аргументов и сложнее, но смысл операций остаётся прежним.&lt;br /&gt;
&lt;br /&gt;
Процесс передачи значений от входных нейронов к выходным называется прямым распространеним (от англ. Forward pass). После чего мы вычисляем ошибку обработанных сетью данных на выходном нейроне и, основываясь на её значении, делаем обратную передачу (Back propagation)&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Backpropagation Backpropagation, Wikipedia]&amp;lt;/ref&amp;gt;. Back propagation заключается в том, чтобы последовательно менять веса нейронной сети, начиная с весов выходного нейрона. Значения весов будут меняться в сторону уменьшения ошибки.&lt;br /&gt;
&lt;br /&gt;
[[Файл: Graph_compilation.jpg|400px|thumb|Рис.2. Граф вычислений для функции &amp;lt;tex&amp;gt;f(x,y,z)=(x+y)*z&amp;lt;/tex&amp;gt;. Зелёные цифры — значения вычислений по ходу выполнения операций графа, красные — значения производной выходной функции по текущей переменной в точке &amp;lt;tex&amp;gt;(x_0=-2, y_0=5, z_0=-4)&amp;lt;/tex&amp;gt;]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Преимуществом такого представления функции является простота вычисления производных. Используя следующие правила вычисления частных производных: &amp;lt;tex&amp;gt;q=x+y:\frac{\partial q}{\partial x}=1, \frac{\partial q}{\partial y}=1;&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;q=xy:\frac{\partial q}{\partial x}=y, \frac{\partial q}{\partial y}=x;&amp;lt;/tex&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y}&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим граф вычислений на рисунке 2 с поданными на вход значениями &amp;lt;tex&amp;gt;(x_0=-2, y_0=5, z_0=-4)&amp;lt;/tex&amp;gt;. Подсчёт производных по графу вычислений производим от значения функции к значениям независимых переменных-входов.&lt;br /&gt;
#&amp;lt;tex&amp;gt;\frac{\partial f}{\partial f} = 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
#&amp;lt;tex&amp;gt;\frac{\partial f}{\partial q} = z_0 = -4&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\frac{\partial f}{\partial z} = q_0 = 3&amp;lt;/tex&amp;gt;&lt;br /&gt;
#&amp;lt;tex&amp;gt;\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial x} = -4&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\frac{\partial f}{\partial y} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial y} = -4&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл: Schematic-diagram-of-a-general-back-propagation-neural-network.png|400px|thumb|Рис.3. Архитекутра нейронной сети: &amp;lt;tex&amp;gt;x_{N_i}&amp;lt;/tex&amp;gt; — входные значения, &amp;lt;tex&amp;gt;y_{N_i}&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;w&amp;lt;/tex&amp;gt; (числа, на которые умножаются входные для этого слоя значения) с помощью градиентного спуска сдвигаемся&lt;br /&gt;
в сторону градиента (при максимизации) или обратную ему&lt;br /&gt;
(при минимизации) &amp;lt;tex&amp;gt;w:=w-\eta\nabla_w f&amp;lt;/tex&amp;gt;, или его модификаций&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D1%81%D0%BF%D1%83%D1%81%D0%BA%D0%B0 Метод градиентного спуска]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Способы настройки параметров ==&lt;br /&gt;
[[File:basins.png|450px|thumb|right|Рисунок 4. Сравение мотификаций метода градиентного спуска на ландшафте &amp;quot;бассейны и стены&amp;quot;.]]&lt;br /&gt;
[[File:wolby.png|450px|thumb|right|Рисунок 5. Сравение мотификаций метода градиентного спуска на &amp;quot;шатком&amp;quot; ландшафте.]]&lt;br /&gt;
Ниже представлены различные вариации градиентного спуска (более подробное сравнение, применительно к данной задаче &amp;lt;ref&amp;gt;[https://habr.com/post/318970/ Методы оптимизации нейронных сетей, Habr]&amp;lt;/ref&amp;gt;). Градиентный спуск — итеративный алгоритм поиска минимума или максимума функции, метриками качества алгоритма этого семейства методов являются скорость сходимости и сходимость в глобальный оптимум. Методы имеют различные преимущества на различных функциях. Так например на рисунке 4 из локального минимума методы adam и nag не могут достигнуть глобального, а в случае &amp;quot;шаткого&amp;quot; ландшафта (рисунок 5) эти методы сходятся быстрее.&lt;br /&gt;
&lt;br /&gt;
* Стохастический градиентный спуск&amp;lt;ref&amp;gt;[http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D1%81%D1%82%D0%BE%D1%85%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%B0 Метод стохастического градиента]&amp;lt;/ref&amp;gt; заключается в том, что алгоритм делает шаг постоянной величины в направлении, указанном градиентом в текущей точке: &amp;lt;tex&amp;gt;w^{(0)}&amp;lt;/tex&amp;gt; — начальные весы сети, &amp;lt;tex&amp;gt;w^{(k+1)}=w^{(k)}-\mu\frac{\partial L(w^{(k)})}{\partial w}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Модификация Momentum &amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Stochastic_gradient_descent#Momentum Momentum, Wikipedia]&amp;lt;/ref&amp;gt; запоминает скорость на предыдущем шаге и добавляет в &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; раз меньшую величину на следующем шаге: &amp;lt;tex&amp;gt; \Delta w:=\alpha \Delta w-\eta \nabla Q_{i}(w)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; w:=w+\Delta w&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; w:=w-\eta \nabla Q_{i}(w)+\alpha \Delta w&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* NAG (Nesterov accelerated gradient)&amp;lt;ref&amp;gt;[https://jlmelville.github.io/mize/nesterov.html#nag Nesterov accelerated gradient]&amp;lt;/ref&amp;gt; добавляет к методу Momentum идею &amp;quot;заглядывания вперёд&amp;quot;, используя производную не в текущей точке, а в следующей (если бы мы продолжали двигаться в этом же направлении без измений): &amp;lt;tex&amp;gt; w^{(k+1)} = w^{(k)}-v^{(k)}; v^{(k+1)}=\gamma v^{(k)}+\mu\frac{\partial L(w^{(k)}-v^{(k)})}{\partial w}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Adagrad имеет преимущество в плане обучения нейронных сетей в предположении, что процесс обучения должен сходится (т.е. не нужно сильно менять веса сети, когда мы уже немного научились). В процессе обучения после каждого прецендента алгоритм будет уменьшать шаг за счёт суммы квадратов координат градиента предыдущих итераций&amp;lt;ref&amp;gt;[http://akyrillidis.github.io/notes/AdaGrad AdaGrad]&amp;lt;/ref&amp;gt;: &amp;lt;tex&amp;gt;g_{i,(k)}=\frac{\partial L(w_i^{(k)})}{\partial w_i}, w_i^{(k+1)}=w_i^{(k)}-\frac{\mu}{\sqrt{G^{(k)}_i,i+\epsilon}}g_{i,(k)}&amp;lt;/tex&amp;gt;, где G — диагональная матрица, элементы которой, суммы квадратов координат градиента к k-ой итерации алгоритма;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*RMSProp&amp;lt;ref&amp;gt;[https://towardsdatascience.com/a-look-at-gradient-descent-and-rmsprop-optimizers-f77d483ef08b RMSProp]&amp;lt;/ref&amp;gt; основан на идее Adagrad'a, но с учётом того элементы матрицы G могут быть большими величинами и начать препятствовать обучению. Для этого RMSProp делит шаг не на полную сумму градиентов, а на скользящую, т.е. &amp;lt;tex&amp;gt;E^{(k)}[g_i^2] = \gamma E^{(k-1)}[g_i^2]+(1-\gamma)g^2_{i, (k)}&amp;lt;/tex&amp;gt;, обновление весов осталось таким же как в Adagrad : &amp;lt;tex&amp;gt; w^{(k+1)}_i = w_i^{(k)}-\frac{\mu}{\sqrt{E^{(k)}[g_i^2]+\epsilon}}g_{i, (k)}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Adadelta&amp;lt;ref&amp;gt;[https://arxiv.org/abs/1212.5701 Adadelta]&amp;lt;/ref&amp;gt; устраняет &amp;quot;нефизичность&amp;quot; методов Adagrad и RMSProp, добавка с градиентом в которых не имеет размерности весов(точнее вообще безразмерна). Умножение этого слагаемого на любую величину правильной размерности — не самая хорошая идея. Используем разложение ряда Тейлора в точке с большим числом членов, тогда появится матрица Q вторых производных:&amp;lt;tex&amp;gt;w^{(k+1)}=w^{(k)}-\mu(Q''(w^{(k)})^{-1}Q'(w^{(k)}&amp;lt;/tex&amp;gt;, рассчёт которой повлечёт за собой дополнительные затраты на её расчёт (сами градиенты мы получаем сразу при обратном распространии ошибки), поэтому вместо неё можно брать приближение (из сложных выводов получаем необходимиый множитель &amp;lt;tex&amp;gt;RMS^{(k-1)}[\delta w_i]&amp;lt;/tex&amp;gt;, однако в данном случае знание предыдущей скорости не довляет алгоритму &amp;quot;инерции&amp;quot; методов Momentum и NAG): &amp;lt;tex&amp;gt;w^{(k+1)}=w^{(k)}-\frac{RMS^{(k-1)}[\delta w_i]}{RMS^{(k)}[g_i]}g_i^{(k)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;RMS^{(k)}[x_i]=\sqrt{E^{(k)}[x^2_i]+\epsilon}&amp;lt;/tex&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Adam&amp;lt;ref&amp;gt;[https://arxiv.org/pdf/1412.6980.pdf Adam]&amp;lt;/ref&amp;gt; сочетает в себе преимущества Nag и Adadelta над обычным градиентным спуском: &amp;lt;tex&amp;gt; w^{(k+1)}_i = w_i^{(k)}-\frac{\mu}{\sqrt{\hat{b}^2_{(k)}+\epsilon}}\hat{m}_{(k)}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\hat{m}_{(k)}=\frac{\gamma_1 E^{(k-1)}[g_i]+(1-\gamma_1)g_{i,(k)}}{1-\gamma_1^k}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\hat{b}^2_{(k)}= \frac{\gamma_2 E^{(k-1)}[g^2_i]+(1-\gamma_2)g:2_{i,(k)}}{1-\gamma_2^k}&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;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
&lt;br /&gt;
#[http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%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_%28%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%29 Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
# Riedmiller, M., &amp;amp; Braun, H. (1993). A direct adaptive method for faster backpropagation learning: The RPROP algorithm. In Neural Networks, 1993., IEEE International Conference on (pp. 586-591). IEEE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Глубокое обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69536</id>
		<title>Глубокое обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69536"/>
				<updated>2019-01-28T14:39:45Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Ml_areas.jpg|thumb|250px|Глубокое обучение как часть машинного обучения.]]&lt;br /&gt;
&lt;br /&gt;
'''Глубокое обучение''' (англ. deep learning) {{---}} совокупность широкого семейства методов машинного обучения, основанных на имитации работы человеческого мозга в процессе обработки данных и создания паттернов, используемых для принятия решений&amp;lt;ref&amp;gt;[https://www.investopedia.com/terms/d/deep-learning.asp Deep Learning, Investopedia]&amp;lt;/ref&amp;gt;. Как правило, глубокое обучение предназначено для работы с большими объемами данных и использует сложные алгоритмы для обучения модели&amp;lt;ref&amp;gt;[https://www.quora.com/What-is-the-difference-between-Neural-Networks-and-Deep-Learning The difference between neural networks and deep learning]&amp;lt;/ref&amp;gt;. На больших датасетах глубокое обучение показывает более высокую точность результатов в сравнении с традиционным машинным обучением. Зависимость производительности (качества результатов) от объема данных представлена на рисунке ниже.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Perfm_data.jpg|border|450px|thumb|left|Зависимость производительности от объема данных.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что данный раздел машинного обучения появился еще в 1980-х, до недавнего времени его применение было сильно ограничено из-за недостака вычислительных мощностей существовавших компьютеров. Ситуация изменилась только в середине 2000-х.&lt;br /&gt;
&lt;br /&gt;
На создание моделей глубокого обучения оказали влияние некоторые процессы и паттерны, происходящие в биологических нейронных системах. Несмотря на это, данные модели во многом отличаются от биологического мозга (и в структуре и в функциях), что делает невозможным использование теорем и доказательств, применяющихся в нейробиологии.&lt;br /&gt;
&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; {{---}} узел искусственной нейронной сети, являющийся упрощённой моделью естественного нейрона.&lt;br /&gt;
* 1949 {{---}} Принцип обучения нейронов Хебба&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hebbian_theory Hebbian theory, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} изначально наблюдаемая причинно-следственная связь между активациями пре- и постсинаптического нейрона имеет тенденцию к усилению.&lt;br /&gt;
* 1957 {{---}} Модель перцептрона предложена Фрэнком Розенблаттом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} математическая или компьютерная модель восприятия информации мозгом.&lt;br /&gt;
* 1960 {{---}} Дельта-правило обучения перцептрона&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Delta_rule Delta rule, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} метод обучения перцептрона по принципу градиентного спуска по поверхности ошибки.&lt;br /&gt;
* 1969 {{---}} Выход книги Марвина Минска и Сеймура Паперта &amp;quot;Перцептроны&amp;quot;&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptrons_(book) Perceptrons book, WIkipedia]&amp;lt;/ref&amp;gt;. В данной книге математически показаны ограничения перцептронов.&lt;br /&gt;
* 1974 {{---}} Метод обратного распространения ошибки впервые предложен А. И. Галушкиным и Дж. Вербосом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Backpropagation Backpropagation, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} метод вычисления градиента, который используется при обновлении весов многослойного перцептрона.&lt;br /&gt;
* 1980 {{---}} Первая свёрточная нейронная сеть предложена Кунихико Фукусимой&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Convolutional_neural_network Convolutional_neural_network, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} специальная архитектура искусственных нейронных сетей использующая некоторые особенности зрительной коры.&lt;br /&gt;
* 1982 {{---}} Рекуррентные нейронные сети предложены Д. Хопфилдом {{---}} вид нейронных сетей, где связи между элементами образуют направленную последовательность.&lt;br /&gt;
* 1991 {{---}} Проблема &amp;quot;исчезающего&amp;quot; градиента была сформулирована С. Хочрейтом. Проблема &amp;quot;исчезающего&amp;quot; градиента заключается в быстрой потере информации с течением времени.&lt;br /&gt;
* 1997 {{---}} Долгая краткосрочная память предложена С. Хочрейтом и Ю. Шмидхубером&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Long_short-term_memory Long short-term memory, Wikipedia]&amp;lt;/ref&amp;gt;. В отличие от традиционных рекуррентных нейронных сетей, LSTM-сеть хорошо приспособлена к обучению на задачах классификации, обработки и прогнозирования временных рядов в случаях, когда важные события разделены временными промежутками с неопределённой продолжительностью и границами.&lt;br /&gt;
* 1998 {{---}} Градиентный спуск для сверточных нейронных сетей предложен Я. Лекуном.&lt;br /&gt;
* 2006 {{---}} Публикации Г. Хинтона, С. Осиндера и Я. Теха об обучении сетей глубокого доверия. Данные публикации, а также их активное освещение в средствах массовой информации смогли привлечь внимание ученых и разработчиков со всего мира к глубоким сетям.&lt;br /&gt;
* 2012 {{---}} Предложение дропаута Г. Хинтоном, А. Крижевски и И. Шутковичем&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Dropout_(neural_networks) Dropout, Wikipedia]&amp;lt;/ref&amp;gt;. Дропаут (от англ. dropout) {{---}} метод регуляризации искусственных нейронных сетей, предназначен для предотвращения переобучения сети.&lt;br /&gt;
* 2012 {{---}} Нейронные сети побеждают в ImageNet Challenge&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/ImageNet#ImageNet_Challenge ImageNet Challenge, Wikipedia]&amp;lt;/ref&amp;gt;. Данное событие ознаменовало начало эры нейронных сетей и глубокого обучения.&lt;br /&gt;
* 2014 {{---}} Группа исследователей под руководством Зеппа Хохрейтера использовала глубокое обучение для определения токсичного воздействия лекарств и бытовых средств на окружающую среду. Данна работа была отмечена первым местом на соревновании &amp;quot;Tox21 Data Challenge&amp;quot;&amp;lt;ref&amp;gt;[https://tripod.nih.gov/tox21/challenge/leaderboard.jsp Tox21 Data Challenge Winners]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* 2016 {{---}} Программа для игры в го Google AlphaGo выиграла со счётом 4:1 у Ли Седоля, лучшего международного игрока в эту игру. AlphaGo, разработанная DeepMind, использует глубокое обучение с помощью многоуровневых нейронных сетей.&lt;br /&gt;
* 2018 {{---}} Глубокое обучение впервые используется для планирования лучевой терапии&amp;lt;ref&amp;gt;[https://aapm.onlinelibrary.wiley.com/doi/abs/10.1002/mp.13271 Automatic treatment planning based on three‐dimensional dose distribution predicted from deep learning technique]&amp;lt;/ref&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;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;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Network_dif.png|border|550px|thumb|left|Глубокие и неглубокие нейронные сети.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== Применения ==&lt;br /&gt;
* Распознавание речи&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Speech_recognition Speech recognition, Wikipedia]&amp;lt;/ref&amp;gt;. Все основные коммерческие системы распознавания речи (например, Microsoft Cortana, Xbox, Skype Translator, Amazon Alexa, Google Now, Apple Siri, Baidu и iFlyTek) основаны на глубоком обучении.&lt;br /&gt;
* [[:Задача нахождения объектов на изображении | Компьютерное зрение]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. На сегодняшний день системы распознавания образов основанные на глубоком обучении уже умеют давать более точные результаты, чем человеческий глаз&amp;lt;ref&amp;gt;[https://www.sciencedirect.com/science/article/pii/S0893608012000524 Multi-column deep neural network for traffic sign classification]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Обработка естественного языка&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Natural_language_processing Natural language processing, Wikipedia]&amp;lt;/ref&amp;gt;. Нейронные сети использовались для реализации языковых моделей еще с начала 2000-х годов. Изобретение LSTM помогло улучшить машинный перевод и языковое моделирование&amp;lt;ref&amp;gt;[https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf Sequence to Sequence Learning with Neural Networks]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Обнаружение новых лекарственных препаратов. К примеру, нейронная сеть AtomNet использовалась для прогнозирования новых биомолекул {{---}} кандидатов для лечения таких заболевания, как вирус Эбола и рассеянный склероз.&lt;br /&gt;
* Рекомендательные системы&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Recommender_system Recommender system, Wikipedia]&amp;lt;/ref&amp;gt;. На сегодняшний день глубокое обучение применяется для изучения пользовательских предпочтений во многих доменах.&lt;br /&gt;
* Предсказание генномных онтологий в биоинформатике&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deep_learning#Bioinformatics Deep learning in bioinformatics, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полный список возможных применений глубокого обучения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deep_learning#Applications Applications of deep learning, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Transfer learning ==&lt;br /&gt;
[[Файл:Transfer.jpeg|border|450px|thumb|Transfer learning. Иллюстрация из [https://habr.com/company/binarydistrict/blog/428255/ статьи] на habr.com.]]&lt;br /&gt;
'''Transfer learning''' - это применение к решению задачи знаний, извлеченных нейронной сетью при решении другой задачи. &lt;br /&gt;
&lt;br /&gt;
Глубокие нейронные сети требуют больших объемов данных для сходимости обучения. Поэтому часто встречается ситуация, когда для решаемой задачи недостаточно данных для того, чтобы хорошо натренировать все слои нейросети. Для решения этой проблемы и используется '''transfer learning'''&amp;lt;ref&amp;gt;[https://habr.com/company/binarydistrict/blog/428255/ Transfer Learning: как быстро обучить нейросеть на своих данных, habr.com]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Чаще всего '''transfer learning''' выглядит следующим образом: к натренированной на определенную задачу нейросети добавляется еще несколько скрытый слоев, которые позволяют использовать уже полученные знания для решения более конкретной задачи. Например, знания, полученные при обучении распознаванию различных предметов, могут применяться при решении задачи распознавания еды.&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;
== Фреймворки для глубокого обучения ==&lt;br /&gt;
* TensorFlow&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/TensorFlow TensorFlow, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Microsoft Cognitive Toolkit&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Microsoft_Cognitive_Toolkit Microsoft Cognitive Toolkit, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Wolfram Mathematica&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Wolfram_Mathematica Wolfram Mathematica, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Keras&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Keras Keras, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Deeplearning4j&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deeplearning4j Deeplearning4j, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Caffe&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Caffe_(software) Caffe, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Torch/PyTorch&amp;lt;ref&amp;gt;[https://habr.com/post/334380 PyTorch — ваш новый фреймворк глубокого обучения, habr]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* MXNet&amp;lt;ref&amp;gt;[https://mxnet.apache.org MXNet, official site]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Chainer&amp;lt;ref&amp;gt;[https://chainer.org Chainer, official site]&amp;lt;/ref&amp;gt;&lt;br /&gt;
Сопоставление фреймворков, библиотек и отдельных программ для глубокого обучения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software Comparison of deep learning software, Wikipedia]&amp;lt;/ref&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;
* [https://en.wikipedia.org/wiki/Deep_learning Deep learning, Wikipedia]&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/Глубокое_обучение Глубокое обучение, Wikipedia]&lt;br /&gt;
* [http://www.deeplearningbook.org/ Deep Learning Book, MIT]&lt;br /&gt;
* [https://towardsdatascience.com/multi-layer-neural-networks-with-sigmoid-function-deep-learning-for-rookies-2-bf464f09eb7f Multi-Layer Neural Networks with Sigmoid Function, Towards Data Science]&lt;br /&gt;
* [https://www.kaggle.com/dansbecker/rectified-linear-units-relu-in-deep-learning Rectified Linear Units (ReLU) in Deep Learning, Kaggle]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69535</id>
		<title>Глубокое обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69535"/>
				<updated>2019-01-28T14:39:27Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Применения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Ml_areas.jpg|thumb|250px|Глубокое обучение как часть машинного обучения.]]&lt;br /&gt;
&lt;br /&gt;
'''Глубокое обучение''' (англ. deep learning) {{---}} совокупность широкого семейства методов машинного обучения, основанных на имитации работы человеческого мозга в процессе обработки данных и создания паттернов, используемых для принятия решений&amp;lt;ref&amp;gt;[https://www.investopedia.com/terms/d/deep-learning.asp Deep Learning, Investopedia]&amp;lt;/ref&amp;gt;. Как правило, глубокое обучение предназначено для работы с большими объемами данных и использует сложные алгоритмы для обучения модели&amp;lt;ref&amp;gt;[https://www.quora.com/What-is-the-difference-between-Neural-Networks-and-Deep-Learning The difference between neural networks and deep learning]&amp;lt;/ref&amp;gt;. На больших датасетах глубокое обучение показывает более высокую точность результатов в сравнении с традиционным машинным обучением. Зависимость производительности (качества результатов) от объема данных представлена на рисунке ниже.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Perfm_data.jpg|border|450px|thumb|left|Зависимость производительности от объема данных.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что данный раздел машинного обучения появился еще в 1980-х, до недавнего времени его применение было сильно ограничено из-за недостака вычислительных мощностей существовавших компьютеров. Ситуация изменилась только в середине 2000-х.&lt;br /&gt;
&lt;br /&gt;
На создание моделей глубокого обучения оказали влияние некоторые процессы и паттерны, происходящие в биологических нейронных системах. Несмотря на это, данные модели во многом отличаются от биологического мозга (и в структуре и в функциях), что делает невозможным использование теорем и доказательств, применяющихся в нейробиологии.&lt;br /&gt;
&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; {{---}} узел искусственной нейронной сети, являющийся упрощённой моделью естественного нейрона.&lt;br /&gt;
* 1949 {{---}} Принцип обучения нейронов Хебба&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hebbian_theory Hebbian theory, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} изначально наблюдаемая причинно-следственная связь между активациями пре- и постсинаптического нейрона имеет тенденцию к усилению.&lt;br /&gt;
* 1957 {{---}} Модель перцептрона предложена Фрэнком Розенблаттом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} математическая или компьютерная модель восприятия информации мозгом.&lt;br /&gt;
* 1960 {{---}} Дельта-правило обучения перцептрона&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Delta_rule Delta rule, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} метод обучения перцептрона по принципу градиентного спуска по поверхности ошибки.&lt;br /&gt;
* 1969 {{---}} Выход книги Марвина Минска и Сеймура Паперта &amp;quot;Перцептроны&amp;quot;&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptrons_(book) Perceptrons book, WIkipedia]&amp;lt;/ref&amp;gt;. В данной книге математически показаны ограничения перцептронов.&lt;br /&gt;
* 1974 {{---}} Метод обратного распространения ошибки впервые предложен А. И. Галушкиным и Дж. Вербосом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Backpropagation Backpropagation, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} метод вычисления градиента, который используется при обновлении весов многослойного перцептрона.&lt;br /&gt;
* 1980 {{---}} Первая свёрточная нейронная сеть предложена Кунихико Фукусимой&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Convolutional_neural_network Convolutional_neural_network, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} специальная архитектура искусственных нейронных сетей использующая некоторые особенности зрительной коры.&lt;br /&gt;
* 1982 {{---}} Рекуррентные нейронные сети предложены Д. Хопфилдом {{---}} вид нейронных сетей, где связи между элементами образуют направленную последовательность.&lt;br /&gt;
* 1991 {{---}} Проблема &amp;quot;исчезающего&amp;quot; градиента была сформулирована С. Хочрейтом. Проблема &amp;quot;исчезающего&amp;quot; градиента заключается в быстрой потере информации с течением времени.&lt;br /&gt;
* 1997 {{---}} Долгая краткосрочная память предложена С. Хочрейтом и Ю. Шмидхубером&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Long_short-term_memory Long short-term memory, Wikipedia]&amp;lt;/ref&amp;gt;. В отличие от традиционных рекуррентных нейронных сетей, LSTM-сеть хорошо приспособлена к обучению на задачах классификации, обработки и прогнозирования временных рядов в случаях, когда важные события разделены временными промежутками с неопределённой продолжительностью и границами.&lt;br /&gt;
* 1998 {{---}} Градиентный спуск для сверточных нейронных сетей предложен Я. Лекуном.&lt;br /&gt;
* 2006 {{---}} Публикации Г. Хинтона, С. Осиндера и Я. Теха об обучении сетей глубокого доверия. Данные публикации, а также их активное освещение в средствах массовой информации смогли привлечь внимание ученых и разработчиков со всего мира к глубоким сетям.&lt;br /&gt;
* 2012 {{---}} Предложение дропаута Г. Хинтоном, А. Крижевски и И. Шутковичем&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Dropout_(neural_networks) Dropout, Wikipedia]&amp;lt;/ref&amp;gt;. Дропаут (от англ. dropout) {{---}} метод регуляризации искусственных нейронных сетей, предназначен для предотвращения переобучения сети.&lt;br /&gt;
* 2012 {{---}} Нейронные сети побеждают в ImageNet Challenge&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/ImageNet#ImageNet_Challenge ImageNet Challenge, Wikipedia]&amp;lt;/ref&amp;gt;. Данное событие ознаменовало начало эры нейронных сетей и глубокого обучения.&lt;br /&gt;
* 2014 {{---}} Группа исследователей под руководством Зеппа Хохрейтера использовала глубокое обучение для определения токсичного воздействия лекарств и бытовых средств на окружающую среду. Данна работа была отмечена первым местом на соревновании &amp;quot;Tox21 Data Challenge&amp;quot;&amp;lt;ref&amp;gt;[https://tripod.nih.gov/tox21/challenge/leaderboard.jsp Tox21 Data Challenge Winners]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* 2016 {{---}} Программа для игры в го Google AlphaGo выиграла со счётом 4:1 у Ли Седоля, лучшего международного игрока в эту игру. AlphaGo, разработанная DeepMind, использует глубокое обучение с помощью многоуровневых нейронных сетей.&lt;br /&gt;
* 2018 {{---}} Глубокое обучение впервые используется для планирования лучевой терапии&amp;lt;ref&amp;gt;[https://aapm.onlinelibrary.wiley.com/doi/abs/10.1002/mp.13271 Automatic treatment planning based on three‐dimensional dose distribution predicted from deep learning technique]&amp;lt;/ref&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;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;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Network_dif.png|border|550px|thumb|left|Глубокие и неглубокие нейронные сети.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== Применения ==&lt;br /&gt;
* Распознавание речи&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Speech_recognition Speech recognition, Wikipedia]&amp;lt;/ref&amp;gt;. Все основные коммерческие системы распознавания речи (например, Microsoft Cortana, Xbox, Skype Translator, Amazon Alexa, Google Now, Apple Siri, Baidu и iFlyTek) основаны на глубоком обучении.&lt;br /&gt;
* [[:Задача нахождения объектов на изображении | Компьютерное зрение]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;. На сегодняшний день системы распознавания образов основанные на глубоком обучении уже умеют давать более точные результаты, чем человеческий глаз&amp;lt;ref&amp;gt;[https://www.sciencedirect.com/science/article/pii/S0893608012000524 Multi-column deep neural network for traffic sign classification]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Обработка естественного языка&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Natural_language_processing Natural language processing, Wikipedia]&amp;lt;/ref&amp;gt;. Нейронные сети использовались для реализации языковых моделей еще с начала 2000-х годов. Изобретение LSTM помогло улучшить машинный перевод и языковое моделирование&amp;lt;ref&amp;gt;[https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf Sequence to Sequence Learning with Neural Networks]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Обнаружение новых лекарственных препаратов. К примеру, нейронная сеть AtomNet использовалась для прогнозирования новых биомолекул {{---}} кандидатов для лечения таких заболевания, как вирус Эбола и рассеянный склероз.&lt;br /&gt;
* Рекомендательные системы&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Recommender_system Recommender system, Wikipedia]&amp;lt;/ref&amp;gt;. На сегодняшний день глубокое обучение применяется для изучения пользовательских предпочтений во многих доменах.&lt;br /&gt;
* Предсказание генномных онтологий в биоинформатике&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deep_learning#Bioinformatics Deep learning in bioinformatics, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полный список возможных применений глубокого обучения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deep_learning#Applications Applications of deep learning, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Transfer learning ==&lt;br /&gt;
[[Файл:Transfer.jpeg|border|450px|thumb|Transfer learning. Иллюстрация из [https://habr.com/company/binarydistrict/blog/428255/ статьи] на habr.com.]]&lt;br /&gt;
'''Transfer learning''' - это применение к решению задачи знаний, извлеченных нейронной сетью при решении другой задачи. &lt;br /&gt;
&lt;br /&gt;
Глубокие нейронные сети требуют больших объемов данных для сходимости обучения. Поэтому часто встречается ситуация, когда для решаемой задачи недостаточно данных для того, чтобы хорошо натренировать все слои нейросети. Для решения этой проблемы и используется '''transfer learning'''&amp;lt;ref&amp;gt;[https://habr.com/company/binarydistrict/blog/428255/ Transfer Learning: как быстро обучить нейросеть на своих данных, habr.com]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Чаще всего '''transfer learning''' выглядит следующим образом: к натренированной на определенную задачу нейросети добавляется еще несколько скрытый слоев, которые позволяют использовать уже полученные знания для решения более конкретной задачи. Например, знания, полученные при обучении распознаванию различных предметов, могут применяться при решении задачи распознавания еды.&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;
== Фреймворки для глубокого обучения ==&lt;br /&gt;
* TensorFlow&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/TensorFlow TensorFlow, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Microsoft Cognitive Toolkit&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Microsoft_Cognitive_Toolkit Microsoft Cognitive Toolkit, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Wolfram Mathematica&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Wolfram_Mathematica Wolfram Mathematica, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Keras&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Keras Keras, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Deeplearning4j&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deeplearning4j Deeplearning4j, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Caffe&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Caffe_(software) Caffe, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Torch/PyTorch&amp;lt;ref&amp;gt;[https://habr.com/post/334380 PyTorch — ваш новый фреймворк глубокого обучения, habr]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* MXNet&amp;lt;ref&amp;gt;[https://mxnet.apache.org MXNet, official site]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Chainer&amp;lt;ref&amp;gt;[https://chainer.org Chainer, official site]&amp;lt;/ref&amp;gt;&lt;br /&gt;
Сопоставление фреймворков, библиотек и отдельных программ для глубокого обучения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software Comparison of deep learning software, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[:Нейронные сети, перцептрон]]&amp;lt;sup&amp;gt;[на 06.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[:Сверточные нейронные сети]]&lt;br /&gt;
* [[:Рекуррентные нейронные сети]]&amp;lt;sup&amp;gt;[на 06.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[:Обучение с подкреплением]]&amp;lt;sup&amp;gt;[на 06.12.18 не создан]&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;
* [https://en.wikipedia.org/wiki/Deep_learning Deep learning, Wikipedia]&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/Глубокое_обучение Глубокое обучение, Wikipedia]&lt;br /&gt;
* [http://www.deeplearningbook.org/ Deep Learning Book, MIT]&lt;br /&gt;
* [https://towardsdatascience.com/multi-layer-neural-networks-with-sigmoid-function-deep-learning-for-rookies-2-bf464f09eb7f Multi-Layer Neural Networks with Sigmoid Function, Towards Data Science]&lt;br /&gt;
* [https://www.kaggle.com/dansbecker/rectified-linear-units-relu-in-deep-learning Rectified Linear Units (ReLU) in Deep Learning, Kaggle]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69534</id>
		<title>Глубокое обучение</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=69534"/>
				<updated>2019-01-28T14:39:14Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Определение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Ml_areas.jpg|thumb|250px|Глубокое обучение как часть машинного обучения.]]&lt;br /&gt;
&lt;br /&gt;
'''Глубокое обучение''' (англ. deep learning) {{---}} совокупность широкого семейства методов машинного обучения, основанных на имитации работы человеческого мозга в процессе обработки данных и создания паттернов, используемых для принятия решений&amp;lt;ref&amp;gt;[https://www.investopedia.com/terms/d/deep-learning.asp Deep Learning, Investopedia]&amp;lt;/ref&amp;gt;. Как правило, глубокое обучение предназначено для работы с большими объемами данных и использует сложные алгоритмы для обучения модели&amp;lt;ref&amp;gt;[https://www.quora.com/What-is-the-difference-between-Neural-Networks-and-Deep-Learning The difference between neural networks and deep learning]&amp;lt;/ref&amp;gt;. На больших датасетах глубокое обучение показывает более высокую точность результатов в сравнении с традиционным машинным обучением. Зависимость производительности (качества результатов) от объема данных представлена на рисунке ниже.&lt;br /&gt;
&lt;br /&gt;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Perfm_data.jpg|border|450px|thumb|left|Зависимость производительности от объема данных.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
Несмотря на то, что данный раздел машинного обучения появился еще в 1980-х, до недавнего времени его применение было сильно ограничено из-за недостака вычислительных мощностей существовавших компьютеров. Ситуация изменилась только в середине 2000-х.&lt;br /&gt;
&lt;br /&gt;
На создание моделей глубокого обучения оказали влияние некоторые процессы и паттерны, происходящие в биологических нейронных системах. Несмотря на это, данные модели во многом отличаются от биологического мозга (и в структуре и в функциях), что делает невозможным использование теорем и доказательств, применяющихся в нейробиологии.&lt;br /&gt;
&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; {{---}} узел искусственной нейронной сети, являющийся упрощённой моделью естественного нейрона.&lt;br /&gt;
* 1949 {{---}} Принцип обучения нейронов Хебба&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Hebbian_theory Hebbian theory, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} изначально наблюдаемая причинно-следственная связь между активациями пре- и постсинаптического нейрона имеет тенденцию к усилению.&lt;br /&gt;
* 1957 {{---}} Модель перцептрона предложена Фрэнком Розенблаттом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptron Perceptron, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} математическая или компьютерная модель восприятия информации мозгом.&lt;br /&gt;
* 1960 {{---}} Дельта-правило обучения перцептрона&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Delta_rule Delta rule, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} метод обучения перцептрона по принципу градиентного спуска по поверхности ошибки.&lt;br /&gt;
* 1969 {{---}} Выход книги Марвина Минска и Сеймура Паперта &amp;quot;Перцептроны&amp;quot;&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Perceptrons_(book) Perceptrons book, WIkipedia]&amp;lt;/ref&amp;gt;. В данной книге математически показаны ограничения перцептронов.&lt;br /&gt;
* 1974 {{---}} Метод обратного распространения ошибки впервые предложен А. И. Галушкиным и Дж. Вербосом&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Backpropagation Backpropagation, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} метод вычисления градиента, который используется при обновлении весов многослойного перцептрона.&lt;br /&gt;
* 1980 {{---}} Первая свёрточная нейронная сеть предложена Кунихико Фукусимой&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Convolutional_neural_network Convolutional_neural_network, Wikipedia]&amp;lt;/ref&amp;gt; {{---}} специальная архитектура искусственных нейронных сетей использующая некоторые особенности зрительной коры.&lt;br /&gt;
* 1982 {{---}} Рекуррентные нейронные сети предложены Д. Хопфилдом {{---}} вид нейронных сетей, где связи между элементами образуют направленную последовательность.&lt;br /&gt;
* 1991 {{---}} Проблема &amp;quot;исчезающего&amp;quot; градиента была сформулирована С. Хочрейтом. Проблема &amp;quot;исчезающего&amp;quot; градиента заключается в быстрой потере информации с течением времени.&lt;br /&gt;
* 1997 {{---}} Долгая краткосрочная память предложена С. Хочрейтом и Ю. Шмидхубером&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Long_short-term_memory Long short-term memory, Wikipedia]&amp;lt;/ref&amp;gt;. В отличие от традиционных рекуррентных нейронных сетей, LSTM-сеть хорошо приспособлена к обучению на задачах классификации, обработки и прогнозирования временных рядов в случаях, когда важные события разделены временными промежутками с неопределённой продолжительностью и границами.&lt;br /&gt;
* 1998 {{---}} Градиентный спуск для сверточных нейронных сетей предложен Я. Лекуном.&lt;br /&gt;
* 2006 {{---}} Публикации Г. Хинтона, С. Осиндера и Я. Теха об обучении сетей глубокого доверия. Данные публикации, а также их активное освещение в средствах массовой информации смогли привлечь внимание ученых и разработчиков со всего мира к глубоким сетям.&lt;br /&gt;
* 2012 {{---}} Предложение дропаута Г. Хинтоном, А. Крижевски и И. Шутковичем&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Dropout_(neural_networks) Dropout, Wikipedia]&amp;lt;/ref&amp;gt;. Дропаут (от англ. dropout) {{---}} метод регуляризации искусственных нейронных сетей, предназначен для предотвращения переобучения сети.&lt;br /&gt;
* 2012 {{---}} Нейронные сети побеждают в ImageNet Challenge&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/ImageNet#ImageNet_Challenge ImageNet Challenge, Wikipedia]&amp;lt;/ref&amp;gt;. Данное событие ознаменовало начало эры нейронных сетей и глубокого обучения.&lt;br /&gt;
* 2014 {{---}} Группа исследователей под руководством Зеппа Хохрейтера использовала глубокое обучение для определения токсичного воздействия лекарств и бытовых средств на окружающую среду. Данна работа была отмечена первым местом на соревновании &amp;quot;Tox21 Data Challenge&amp;quot;&amp;lt;ref&amp;gt;[https://tripod.nih.gov/tox21/challenge/leaderboard.jsp Tox21 Data Challenge Winners]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* 2016 {{---}} Программа для игры в го Google AlphaGo выиграла со счётом 4:1 у Ли Седоля, лучшего международного игрока в эту игру. AlphaGo, разработанная DeepMind, использует глубокое обучение с помощью многоуровневых нейронных сетей.&lt;br /&gt;
* 2018 {{---}} Глубокое обучение впервые используется для планирования лучевой терапии&amp;lt;ref&amp;gt;[https://aapm.onlinelibrary.wiley.com/doi/abs/10.1002/mp.13271 Automatic treatment planning based on three‐dimensional dose distribution predicted from deep learning technique]&amp;lt;/ref&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;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;
{|align=&amp;quot;center&amp;quot;&lt;br /&gt;
 |-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
 |[[Файл:Network_dif.png|border|550px|thumb|left|Глубокие и неглубокие нейронные сети.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== Применения ==&lt;br /&gt;
* Распознавание речи&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Speech_recognition Speech recognition, Wikipedia]&amp;lt;/ref&amp;gt;. Все основные коммерческие системы распознавания речи (например, Microsoft Cortana, Xbox, Skype Translator, Amazon Alexa, Google Now, Apple Siri, Baidu и iFlyTek) основаны на глубоком обучении.&lt;br /&gt;
* [[:Задача нахождения объектов на изображении | Компьютерное зрение]]&amp;lt;sup&amp;gt;[на 06.12.18 не создан]&amp;lt;/sup&amp;gt;. На сегодняшний день системы распознавания образов основанные на глубоком обучении уже умеют давать более точные результаты, чем человеческий глаз&amp;lt;ref&amp;gt;[https://www.sciencedirect.com/science/article/pii/S0893608012000524 Multi-column deep neural network for traffic sign classification]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Обработка естественного языка&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Natural_language_processing Natural language processing, Wikipedia]&amp;lt;/ref&amp;gt;. Нейронные сети использовались для реализации языковых моделей еще с начала 2000-х годов. Изобретение LSTM помогло улучшить машинный перевод и языковое моделирование&amp;lt;ref&amp;gt;[https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf Sequence to Sequence Learning with Neural Networks]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Обнаружение новых лекарственных препаратов. К примеру, нейронная сеть AtomNet использовалась для прогнозирования новых биомолекул {{---}} кандидатов для лечения таких заболевания, как вирус Эбола и рассеянный склероз.&lt;br /&gt;
* Рекомендательные системы&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Recommender_system Recommender system, Wikipedia]&amp;lt;/ref&amp;gt;. На сегодняшний день глубокое обучение применяется для изучения пользовательских предпочтений во многих доменах.&lt;br /&gt;
* Предсказание генномных онтологий в биоинформатике&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deep_learning#Bioinformatics Deep learning in bioinformatics, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Полный список возможных применений глубокого обучения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deep_learning#Applications Applications of deep learning, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Transfer learning ==&lt;br /&gt;
[[Файл:Transfer.jpeg|border|450px|thumb|Transfer learning. Иллюстрация из [https://habr.com/company/binarydistrict/blog/428255/ статьи] на habr.com.]]&lt;br /&gt;
'''Transfer learning''' - это применение к решению задачи знаний, извлеченных нейронной сетью при решении другой задачи. &lt;br /&gt;
&lt;br /&gt;
Глубокие нейронные сети требуют больших объемов данных для сходимости обучения. Поэтому часто встречается ситуация, когда для решаемой задачи недостаточно данных для того, чтобы хорошо натренировать все слои нейросети. Для решения этой проблемы и используется '''transfer learning'''&amp;lt;ref&amp;gt;[https://habr.com/company/binarydistrict/blog/428255/ Transfer Learning: как быстро обучить нейросеть на своих данных, habr.com]&amp;lt;/ref&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Чаще всего '''transfer learning''' выглядит следующим образом: к натренированной на определенную задачу нейросети добавляется еще несколько скрытый слоев, которые позволяют использовать уже полученные знания для решения более конкретной задачи. Например, знания, полученные при обучении распознаванию различных предметов, могут применяться при решении задачи распознавания еды.&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;
== Фреймворки для глубокого обучения ==&lt;br /&gt;
* TensorFlow&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/TensorFlow TensorFlow, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Microsoft Cognitive Toolkit&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Microsoft_Cognitive_Toolkit Microsoft Cognitive Toolkit, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Wolfram Mathematica&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Wolfram_Mathematica Wolfram Mathematica, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Keras&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Keras Keras, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Deeplearning4j&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Deeplearning4j Deeplearning4j, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Caffe&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Caffe_(software) Caffe, Wikipedia]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Torch/PyTorch&amp;lt;ref&amp;gt;[https://habr.com/post/334380 PyTorch — ваш новый фреймворк глубокого обучения, habr]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* MXNet&amp;lt;ref&amp;gt;[https://mxnet.apache.org MXNet, official site]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Chainer&amp;lt;ref&amp;gt;[https://chainer.org Chainer, official site]&amp;lt;/ref&amp;gt;&lt;br /&gt;
Сопоставление фреймворков, библиотек и отдельных программ для глубокого обучения&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Comparison_of_deep_learning_software Comparison of deep learning software, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[:Нейронные сети, перцептрон]]&amp;lt;sup&amp;gt;[на 06.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[:Сверточные нейронные сети]]&lt;br /&gt;
* [[:Рекуррентные нейронные сети]]&amp;lt;sup&amp;gt;[на 06.12.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[:Обучение с подкреплением]]&amp;lt;sup&amp;gt;[на 06.12.18 не создан]&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;
* [https://en.wikipedia.org/wiki/Deep_learning Deep learning, Wikipedia]&lt;br /&gt;
* [https://ru.wikipedia.org/wiki/Глубокое_обучение Глубокое обучение, Wikipedia]&lt;br /&gt;
* [http://www.deeplearningbook.org/ Deep Learning Book, MIT]&lt;br /&gt;
* [https://towardsdatascience.com/multi-layer-neural-networks-with-sigmoid-function-deep-learning-for-rookies-2-bf464f09eb7f Multi-Layer Neural Networks with Sigmoid Function, Towards Data Science]&lt;br /&gt;
* [https://www.kaggle.com/dansbecker/rectified-linear-units-relu-in-deep-learning Rectified Linear Units (ReLU) in Deep Learning, Kaggle]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=CatBoost&amp;diff=69533</id>
		<title>CatBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=CatBoost&amp;diff=69533"/>
				<updated>2019-01-28T14:38:47Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Статья посвящена работе с библиотекой CatBoost {{---}} методу машинного обучения, основанному на градиентном бустинге (англ. ''gradient boosting'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Практически любой современный метод на основе градиентного бустинга работает с числовыми признаками. Если у нас в наборе данных присутствуют не только числовые, но и категориальные признаки (англ. ''categorical features''), то необходимо переводить категориальные признаки в числовые. Это приводит к искажению их сути и потенциальному снижению точности работы модели.&lt;br /&gt;
Именно поэтому было важно разработать алгоритм, который умеет работать не только с числовыми признаками, но и с категориальными напрямую, закономерности между которыми этот алгоритм будет выявлять самостоятельно, без ручной «помощи».&lt;br /&gt;
CatBoost {{---}} библиотека для градиентного бустинга, главным преимуществом которой является то, что она одинаково хорошо работает «из коробки» как с числовыми признаками, так и с категориальными. &lt;br /&gt;
&lt;br /&gt;
Документацию по CatBoost можно найти на сайте&amp;lt;ref&amp;gt;[https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/ Документация CatBoost]&amp;lt;/ref&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;
Идея бустинг-подхода заключается в комбинации слабых (с невысокой обобщающей способностью) функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с  использованием  данных  об  ошибках  предыдущих. Результирующая функция представляет собой линейную комбинацию базовых, слабых моделей. Более подробно можно посмотреть в статье про градиентный бустинг&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Gradient_boosting |Gradient Boosting, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее будет рассматриваться бустинг деревьев решений. Будем строить несколько деревьев, чтобы добавление новых деревьев уменьшало ошибку. Итого при достаточно большом количестве деревьев мы сможем сильно уменьшить ошибку, однако не стоит забывать, что чем больше деревьев, тем дольше обучается модель и в какой-то момент прирост качества становится незначительным.&lt;br /&gt;
&lt;br /&gt;
=== Градиентный бустинг ===&lt;br /&gt;
&lt;br /&gt;
* В основе CatBoost лежит градиентный бустинг.&lt;br /&gt;
&lt;br /&gt;
* Градиент функции ошибки {{---}} все производные по всем значениям функции&lt;br /&gt;
Градиентный бустинг {{---}} метод машинного обучения, который создает решающую модель прогнозирования в виде ансамбля слабых моделей прогнозирования, обычно деревьев решений. Он строит модель поэтапно, позволяя оптимизировать произвольную дифференцируемую функцию потерь.&lt;br /&gt;
&lt;br /&gt;
== Особенности CatBoost ==&lt;br /&gt;
&lt;br /&gt;
=== Режимы работы ===&lt;br /&gt;
&lt;br /&gt;
* Регрессия (англ. ''regression'') &lt;br /&gt;
* Классификация (англ. ''classification'')&lt;br /&gt;
 Функция потерь (англ. ''loss function'') {{---}} максимизируем вероятность того, что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулы.&lt;br /&gt;
 Функция ''predict_proba'' {{---}} на выходе получаем готовые вероятности. Нужно отметить, что складывать их уже нельзя.&lt;br /&gt;
 Функция ''predict'' {{---}} выдает необработанный результат. Такой результат можно складывать, например, с результатами других моделей.&lt;br /&gt;
* Мультиклассификация (англ. ''multiclass classification'')&lt;br /&gt;
* Ранжирование (англ. ''ranking'')&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; (англ. ''metrics''), таких как:&lt;br /&gt;
* Регрессия: ''MAE, MAPE, RMSE, SMAPE'' etc.&lt;br /&gt;
* Классификация: ''Logloss , Precision, Recall, F1, CrossEntropy, BalancedAccuracy'' etc.&lt;br /&gt;
* Мультиклассификация: ''MultiClass, MultiClassOneVsAll, HammingLoss, F1'' etc.&lt;br /&gt;
* Ранжирование: ''NDCG, PrecisionAt, RecallAt, PFound, PairLogit'' etc.&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;
=== Вычисление значений в листьях === &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;
 ''Score += random_strength *  Rand (0, lenofgrad * q)'' &lt;br /&gt;
&lt;br /&gt;
''q'' {{---}} множитель, уменьшающийся при увеличении итерации. &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;
CatBoost поддерживает несколько режимов выборки данных&lt;br /&gt;
&lt;br /&gt;
* Бутстрап (англ. ''bootstrap'') Бернулли {{---}} выбираем документ с вероятностью ''p''. Регулируется параметром ''sample_rate''&lt;br /&gt;
* Байесовский бутстрап {{---}} байесовское распределение. Регулируется параметром ''bagging_temp''&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;
* Uniform. Равномерно разбиваем отрезок от минимума значения для данного признака до максимума.&lt;br /&gt;
* Медианная сетка. Задаем количество разбиений над множеством значений, далее идем по объектам в порядке сортировки и разбиваем на группы по k объектов, где k {{---}} количество объектов в одном слоте разбиения.&lt;br /&gt;
* UniformAndQuantiles. Комбинация 1 и 2 пунктов.&lt;br /&gt;
* MaxSumLog {{---}} в основе лежит динамика, работает долго.&lt;br /&gt;
* GreedyLogSum {{---}} аналог MaxSumLog, используется жадный алгоритм, поэтому работает не точно, однако быстрее чем MaxSumLog&lt;br /&gt;
&lt;br /&gt;
=== Работа с категориальными признаками ===&lt;br /&gt;
&lt;br /&gt;
* LabelEncoding {{---}} на реальных примерах точность работы низкая, так как появляется отношения порядка между объектами.&lt;br /&gt;
* One-hot encoding {{---}} дает неплохую точность, если различных значений признаков не много. Иначе один признак размножится на множество признаков и будет влиять на модель заведомо сильнее остальных признаков.&lt;br /&gt;
&lt;br /&gt;
 Лучше не делать препроцессинг самим, из-за проблем, описанных выше. В CatBoost можно задать параметр cat_features, передав туда индексы категориальных признаков. Также можно отрегулировать параметр ''one_hot_max_size'' {{---}} максимальное количество различных значений у категориального признака, чтобы он мог в последствии быть подвержен one-hot encoding.&lt;br /&gt;
&lt;br /&gt;
== Подбор параметров ==&lt;br /&gt;
&lt;br /&gt;
Ниже описаны гиперпараметры (англ. ''hyperparameters''), на которые стоит обратить внимание при использовании библиотеки.&lt;br /&gt;
&lt;br /&gt;
* cat_features&lt;br /&gt;
* Overfitting detector&lt;br /&gt;
* Число итераций и learning rate&lt;br /&gt;
* L2_reg&lt;br /&gt;
* Random_srength&lt;br /&gt;
* Bagging_temp&lt;br /&gt;
* Глубина дерева (стоит попробовать 10 и 6)&lt;br /&gt;
&lt;br /&gt;
== Полезная функциональность ==&lt;br /&gt;
&lt;br /&gt;
* Snapshots&lt;br /&gt;
* Overfitting detector&lt;br /&gt;
* CV&lt;br /&gt;
* eval_metrics&lt;br /&gt;
&lt;br /&gt;
== Бенчмарки ==&lt;br /&gt;
&lt;br /&gt;
Сравнение библиотеки CatBoost с открытыми аналогами XGBoost, LightGBM и H20 на наборе публичных датасетов&amp;lt;ref&amp;gt;[https://catboost.yandex/#benchmark| Benchmarks]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример использования ==&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.5, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' catboost '''import''' CatBoostClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = CatBoostClassifier(&lt;br /&gt;
    '''bagging_temperature'''=1,&lt;br /&gt;
    '''random_strength'''=1,&lt;br /&gt;
    '''thread_count'''=3,&lt;br /&gt;
    '''iterations'''=500,&lt;br /&gt;
    '''l2_leaf_reg''' = 4.0, &lt;br /&gt;
    '''learning_rate''' = 0.07521709965938336,&lt;br /&gt;
    '''save_snapshot'''=True,&lt;br /&gt;
    '''snapshot_file'''='snapshot_best.bkp',&lt;br /&gt;
    '''random_seed'''=63,&lt;br /&gt;
    '''od_type'''='Iter',&lt;br /&gt;
    '''od_wait'''=20,&lt;br /&gt;
    '''custom_loss'''=['AUC', 'Accuracy'],&lt;br /&gt;
    '''use_best_model'''=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(&lt;br /&gt;
    X_train, y_train,&lt;br /&gt;
    '''cat_features'''=cat_features,&lt;br /&gt;
    '''eval_set'''=(X_validation, y_validation),&lt;br /&gt;
    '''logging_level'''='Silent',&lt;br /&gt;
    '''plot'''=True&lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
* Вывод числа деревьев в модели&lt;br /&gt;
&lt;br /&gt;
 '''print'''('Resulting tree count:', best_model.tree_count_)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Resulting tree count: 217'''&lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль (англ. cross validation)&lt;br /&gt;
 '''from''' catboost '''import''' cv&lt;br /&gt;
&lt;br /&gt;
 params = best_model.get_params()&lt;br /&gt;
 params['iterations'] = 10&lt;br /&gt;
 params['custom_loss'] = 'AUC'&lt;br /&gt;
 del params['use_best_model']&lt;br /&gt;
 pool1 = Pool(X, '''label'''=y, '''cat_features'''=cat_features)&lt;br /&gt;
&lt;br /&gt;
 cv_data = cv(&lt;br /&gt;
    '''params''' = params,&lt;br /&gt;
    '''pool''' = pool1,&lt;br /&gt;
    '''fold_count'''=2,&lt;br /&gt;
    '''inverted'''=False,&lt;br /&gt;
    '''shuffle'''=True,&lt;br /&gt;
    '''stratified'''=False,&lt;br /&gt;
    '''partition_random_seed'''=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 best_value = np.max(cv_data['AUC_test_avg'])&lt;br /&gt;
 best_iter = np.argmax(cv_data['AUC_test_avg'])&lt;br /&gt;
 '''print'''('Best validation AUC score: {:.2f}±{:.2f} on step {}'.format(&lt;br /&gt;
    best_value,&lt;br /&gt;
    cv_data['AUC_test_stddev'][best_iter],&lt;br /&gt;
    best_iter&lt;br /&gt;
 ))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Best validation AUC score: 0.91±0.00 on step 9'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Больше примеров&amp;lt;ref&amp;gt;[https://tech.yandex.com/catboost/doc/dg/concepts/python-usages-examples-docpage Примеры ипользования CatBoost]&amp;lt;/ref&amp;gt; можно найти на сайте библиотеки''.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Дерево_решений_и_случайный_леc|Дерево решений и случайный леc]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
*[[:Бустинг,_AdaBoost|Бустинг, AdaBoost]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/| Overview of CatBoost]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Gradient_boosting| Gradient Boosting, WIkipedia]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=CatBoost&amp;diff=69532</id>
		<title>CatBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=CatBoost&amp;diff=69532"/>
				<updated>2019-01-28T14:38:32Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Метрики */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Статья посвящена работе с библиотекой CatBoost {{---}} методу машинного обучения, основанному на градиентном бустинге (англ. ''gradient boosting'').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Практически любой современный метод на основе градиентного бустинга работает с числовыми признаками. Если у нас в наборе данных присутствуют не только числовые, но и категориальные признаки (англ. ''categorical features''), то необходимо переводить категориальные признаки в числовые. Это приводит к искажению их сути и потенциальному снижению точности работы модели.&lt;br /&gt;
Именно поэтому было важно разработать алгоритм, который умеет работать не только с числовыми признаками, но и с категориальными напрямую, закономерности между которыми этот алгоритм будет выявлять самостоятельно, без ручной «помощи».&lt;br /&gt;
CatBoost {{---}} библиотека для градиентного бустинга, главным преимуществом которой является то, что она одинаково хорошо работает «из коробки» как с числовыми признаками, так и с категориальными. &lt;br /&gt;
&lt;br /&gt;
Документацию по CatBoost можно найти на сайте&amp;lt;ref&amp;gt;[https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/ Документация CatBoost]&amp;lt;/ref&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;
Идея бустинг-подхода заключается в комбинации слабых (с невысокой обобщающей способностью) функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с  использованием  данных  об  ошибках  предыдущих. Результирующая функция представляет собой линейную комбинацию базовых, слабых моделей. Более подробно можно посмотреть в статье про градиентный бустинг&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Gradient_boosting |Gradient Boosting, Wikipedia]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее будет рассматриваться бустинг деревьев решений. Будем строить несколько деревьев, чтобы добавление новых деревьев уменьшало ошибку. Итого при достаточно большом количестве деревьев мы сможем сильно уменьшить ошибку, однако не стоит забывать, что чем больше деревьев, тем дольше обучается модель и в какой-то момент прирост качества становится незначительным.&lt;br /&gt;
&lt;br /&gt;
=== Градиентный бустинг ===&lt;br /&gt;
&lt;br /&gt;
* В основе CatBoost лежит градиентный бустинг.&lt;br /&gt;
&lt;br /&gt;
* Градиент функции ошибки {{---}} все производные по всем значениям функции&lt;br /&gt;
Градиентный бустинг {{---}} метод машинного обучения, который создает решающую модель прогнозирования в виде ансамбля слабых моделей прогнозирования, обычно деревьев решений. Он строит модель поэтапно, позволяя оптимизировать произвольную дифференцируемую функцию потерь.&lt;br /&gt;
&lt;br /&gt;
== Особенности CatBoost ==&lt;br /&gt;
&lt;br /&gt;
=== Режимы работы ===&lt;br /&gt;
&lt;br /&gt;
* Регрессия (англ. ''regression'') &lt;br /&gt;
* Классификация (англ. ''classification'')&lt;br /&gt;
 Функция потерь (англ. ''loss function'') {{---}} максимизируем вероятность того, что все объекты в обучающей выборке классифицированы правильно, вероятность - это сигмоида над значением формулы.&lt;br /&gt;
 Функция ''predict_proba'' {{---}} на выходе получаем готовые вероятности. Нужно отметить, что складывать их уже нельзя.&lt;br /&gt;
 Функция ''predict'' {{---}} выдает необработанный результат. Такой результат можно складывать, например, с результатами других моделей.&lt;br /&gt;
* Мультиклассификация (англ. ''multiclass classification'')&lt;br /&gt;
* Ранжирование (англ. ''ranking'')&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; (англ. ''metrics''), таких как:&lt;br /&gt;
* Регрессия: ''MAE, MAPE, RMSE, SMAPE'' etc.&lt;br /&gt;
* Классификация: ''Logloss , Precision, Recall, F1, CrossEntropy, BalancedAccuracy'' etc.&lt;br /&gt;
* Мультиклассификация: ''MultiClass, MultiClassOneVsAll, HammingLoss, F1'' etc.&lt;br /&gt;
* Ранжирование: ''NDCG, PrecisionAt, RecallAt, PFound, PairLogit'' etc.&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;
=== Вычисление значений в листьях === &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;
 ''Score += random_strength *  Rand (0, lenofgrad * q)'' &lt;br /&gt;
&lt;br /&gt;
''q'' {{---}} множитель, уменьшающийся при увеличении итерации. &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;
CatBoost поддерживает несколько режимов выборки данных&lt;br /&gt;
&lt;br /&gt;
* Бутстрап (англ. ''bootstrap'') Бернулли {{---}} выбираем документ с вероятностью ''p''. Регулируется параметром ''sample_rate''&lt;br /&gt;
* Байесовский бутстрап {{---}} байесовское распределение. Регулируется параметром ''bagging_temp''&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;
* Uniform. Равномерно разбиваем отрезок от минимума значения для данного признака до максимума.&lt;br /&gt;
* Медианная сетка. Задаем количество разбиений над множеством значений, далее идем по объектам в порядке сортировки и разбиваем на группы по k объектов, где k {{---}} количество объектов в одном слоте разбиения.&lt;br /&gt;
* UniformAndQuantiles. Комбинация 1 и 2 пунктов.&lt;br /&gt;
* MaxSumLog {{---}} в основе лежит динамика, работает долго.&lt;br /&gt;
* GreedyLogSum {{---}} аналог MaxSumLog, используется жадный алгоритм, поэтому работает не точно, однако быстрее чем MaxSumLog&lt;br /&gt;
&lt;br /&gt;
=== Работа с категориальными признаками ===&lt;br /&gt;
&lt;br /&gt;
* LabelEncoding {{---}} на реальных примерах точность работы низкая, так как появляется отношения порядка между объектами.&lt;br /&gt;
* One-hot encoding {{---}} дает неплохую точность, если различных значений признаков не много. Иначе один признак размножится на множество признаков и будет влиять на модель заведомо сильнее остальных признаков.&lt;br /&gt;
&lt;br /&gt;
 Лучше не делать препроцессинг самим, из-за проблем, описанных выше. В CatBoost можно задать параметр cat_features, передав туда индексы категориальных признаков. Также можно отрегулировать параметр ''one_hot_max_size'' {{---}} максимальное количество различных значений у категориального признака, чтобы он мог в последствии быть подвержен one-hot encoding.&lt;br /&gt;
&lt;br /&gt;
== Подбор параметров ==&lt;br /&gt;
&lt;br /&gt;
Ниже описаны гиперпараметры (англ. ''hyperparameters''), на которые стоит обратить внимание при использовании библиотеки.&lt;br /&gt;
&lt;br /&gt;
* cat_features&lt;br /&gt;
* Overfitting detector&lt;br /&gt;
* Число итераций и learning rate&lt;br /&gt;
* L2_reg&lt;br /&gt;
* Random_srength&lt;br /&gt;
* Bagging_temp&lt;br /&gt;
* Глубина дерева (стоит попробовать 10 и 6)&lt;br /&gt;
&lt;br /&gt;
== Полезная функциональность ==&lt;br /&gt;
&lt;br /&gt;
* Snapshots&lt;br /&gt;
* Overfitting detector&lt;br /&gt;
* CV&lt;br /&gt;
* eval_metrics&lt;br /&gt;
&lt;br /&gt;
== Бенчмарки ==&lt;br /&gt;
&lt;br /&gt;
Сравнение библиотеки CatBoost с открытыми аналогами XGBoost, LightGBM и H20 на наборе публичных датасетов&amp;lt;ref&amp;gt;[https://catboost.yandex/#benchmark| Benchmarks]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример использования ==&lt;br /&gt;
* Делим данные на тренировочное и тестовое множество&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
&lt;br /&gt;
 X_train, X_validation, y_train, y_validation = train_test_split(X, y, '''train_size'''=0.5, '''random_state'''=1234)&lt;br /&gt;
 '''print'''(X_train.shape, X_validation.shape)&lt;br /&gt;
&lt;br /&gt;
* Создаем классификатор&lt;br /&gt;
 '''from''' catboost '''import''' CatBoostClassifier&lt;br /&gt;
&lt;br /&gt;
 best_model = CatBoostClassifier(&lt;br /&gt;
    '''bagging_temperature'''=1,&lt;br /&gt;
    '''random_strength'''=1,&lt;br /&gt;
    '''thread_count'''=3,&lt;br /&gt;
    '''iterations'''=500,&lt;br /&gt;
    '''l2_leaf_reg''' = 4.0, &lt;br /&gt;
    '''learning_rate''' = 0.07521709965938336,&lt;br /&gt;
    '''save_snapshot'''=True,&lt;br /&gt;
    '''snapshot_file'''='snapshot_best.bkp',&lt;br /&gt;
    '''random_seed'''=63,&lt;br /&gt;
    '''od_type'''='Iter',&lt;br /&gt;
    '''od_wait'''=20,&lt;br /&gt;
    '''custom_loss'''=['AUC', 'Accuracy'],&lt;br /&gt;
    '''use_best_model'''=True&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Обучаемся&lt;br /&gt;
&lt;br /&gt;
 best_model.fit(&lt;br /&gt;
    X_train, y_train,&lt;br /&gt;
    '''cat_features'''=cat_features,&lt;br /&gt;
    '''eval_set'''=(X_validation, y_validation),&lt;br /&gt;
    '''logging_level'''='Silent',&lt;br /&gt;
    '''plot'''=True&lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
* Вывод числа деревьев в модели&lt;br /&gt;
&lt;br /&gt;
 '''print'''('Resulting tree count:', best_model.tree_count_)&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Resulting tree count: 217'''&lt;br /&gt;
&lt;br /&gt;
* Используем скользящий контроль (англ. cross validation)&lt;br /&gt;
 '''from''' catboost '''import''' cv&lt;br /&gt;
&lt;br /&gt;
 params = best_model.get_params()&lt;br /&gt;
 params['iterations'] = 10&lt;br /&gt;
 params['custom_loss'] = 'AUC'&lt;br /&gt;
 del params['use_best_model']&lt;br /&gt;
 pool1 = Pool(X, '''label'''=y, '''cat_features'''=cat_features)&lt;br /&gt;
&lt;br /&gt;
 cv_data = cv(&lt;br /&gt;
    '''params''' = params,&lt;br /&gt;
    '''pool''' = pool1,&lt;br /&gt;
    '''fold_count'''=2,&lt;br /&gt;
    '''inverted'''=False,&lt;br /&gt;
    '''shuffle'''=True,&lt;br /&gt;
    '''stratified'''=False,&lt;br /&gt;
    '''partition_random_seed'''=0&lt;br /&gt;
 )&lt;br /&gt;
&lt;br /&gt;
* Выводим результат&lt;br /&gt;
 best_value = np.max(cv_data['AUC_test_avg'])&lt;br /&gt;
 best_iter = np.argmax(cv_data['AUC_test_avg'])&lt;br /&gt;
 '''print'''('Best validation AUC score: {:.2f}±{:.2f} on step {}'.format(&lt;br /&gt;
    best_value,&lt;br /&gt;
    cv_data['AUC_test_stddev'][best_iter],&lt;br /&gt;
    best_iter&lt;br /&gt;
 ))&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; '''Best validation AUC score: 0.91±0.00 on step 9'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Больше примеров&amp;lt;ref&amp;gt;[https://tech.yandex.com/catboost/doc/dg/concepts/python-usages-examples-docpage Примеры ипользования CatBoost]&amp;lt;/ref&amp;gt; можно найти на сайте библиотеки''.&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
*[[:Дерево_решений_и_случайный_леc|Дерево решений и случайный леc]]&lt;br /&gt;
*[[:Бустинг,_AdaBoost|Бустинг, AdaBoost]]&lt;br /&gt;
&lt;br /&gt;
==Примечания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [https://tech.yandex.com/catboost/doc/dg/concepts/about-docpage/| Overview of CatBoost]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Gradient_boosting| Gradient Boosting, WIkipedia]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69531</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=69531"/>
				<updated>2019-01-28T14:38:14Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&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;
== См. также ==&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;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69530</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=69530"/>
				<updated>2019-01-28T14:37:50Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Задача классификации объектов */&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;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&lt;br /&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;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69529</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=69529"/>
				<updated>2019-01-28T14:37:32Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Описание */&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;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 22.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;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&lt;br /&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;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69527</id>
		<title>Иерархическая кластеризация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69527"/>
				<updated>2019-01-28T14:36:39Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Иерархическая кластеризация''' (англ. ''hierarchical clustering'') — множество алгоритмов &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;tex&amp;gt;\mathrm{R}(\{x\}, \{y\}) = \rho(x, y)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Для вычисления расстояния &amp;lt;tex&amp;gt;\mathrm{R}(U, V)&amp;lt;/tex&amp;gt; между кластерами &amp;lt;tex&amp;gt;\mathrm{U}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathrm{V}&amp;lt;/tex&amp;gt; на практике используются различные функции в зависимости от специфики задачи.&lt;br /&gt;
&lt;br /&gt;
== Функции расстояния между кластерами ==&lt;br /&gt;
* '''Метод одиночной связи''' (англ. ''single linkage'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\mathrm{R_{min}}(U, V) = \displaystyle\min_{u \in U, v \in V} \rho(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* '''Метод полной связи''' (англ. ''complete linkage'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\mathrm{R_{max}}(U, V) = \displaystyle\max_{u \in U, v \in V} \rho(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* '''Метод средней связи''' (англ. ''UPGMA (Unweighted Pair Group Method with Arithmetic mean)'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\mathrm{R_{avg}}(U, V) = \displaystyle\dfrac{1}{|U| \cdot |V|}\sum_{u \in U} \sum_{v \in V} \rho(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* '''Центроидный метод''' (англ. ''UPGMC (Unweighted Pair Group Method with Centroid average)'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\mathrm{R_{c}}(U, V) = \displaystyle\rho^2\left(\sum_{u \in U}\dfrac{u}{|U|}, \sum_{v \in V}\dfrac{v}{|V|}\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
* '''Метод Уорда''' (англ. ''Ward's method'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\mathrm{R_{ward}}(U, V) = \displaystyle\dfrac{|U| \cdot |V|}{|U| + |V|}\rho^2\left(\sum_{u \in U}\dfrac{u}{|U|}, \sum_{v \in V}\dfrac{v}{|V|}\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Формула Ланса-Уильямса ==&lt;br /&gt;
На каждом шаге необходимо уметь быстро подсчитывать расстояние от образовавшегося кластера &amp;lt;tex&amp;gt;\mathrm{W}=\mathrm{U}\cup\mathrm{V}&amp;lt;/tex&amp;gt; до любого другого кластера &amp;lt;tex&amp;gt;\mathrm{S}&amp;lt;/tex&amp;gt;, используя известные расстояния с предыдущих шагов.&lt;br /&gt;
Это легко выполняется при использовании формулы, предложенной Лансом и Уильямсом в 1967 году:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\mathrm{R}(W, S) = \alpha_U \cdot \mathrm{R}(U, S) + \alpha_V \cdot \mathrm{R}(V, S) + \beta \cdot \mathrm{R}(U, V) + \gamma \cdot |\mathrm{R}(U, S) - \mathrm{R}(V, S)| &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
, где &amp;lt;tex&amp;gt;\alpha_U, \alpha_V, \beta, \gamma &amp;lt;/tex&amp;gt; {{---}} числовые параметры.&lt;br /&gt;
&lt;br /&gt;
Каждая из указанных выше функций расстояния удовлетворяет формуле Ланса-Уильямса со следующими коэффициентами:&lt;br /&gt;
* '''Метод одиночной связи''' (англ. ''single linkage'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\alpha_U = \dfrac{1}{2}, \alpha_V = \dfrac{1}{2}, \beta = 0, \gamma = -\dfrac{1}{2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
* '''Метод полной связи''' (англ. ''complete linkage'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\alpha_U = \dfrac{1}{2}, \alpha_V = \dfrac{1}{2}, \beta = 0, \gamma = \dfrac{1}{2} &amp;lt;/tex&amp;gt;&lt;br /&gt;
* '''Метод средней связи''' (англ. ''UPGMA (Unweighted Pair Group Method with Arithmetic mean)'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\alpha_U = \dfrac{|U|}{|W|}, \alpha_V = \dfrac{|V|}{|W|}, \beta = 0, \gamma = 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
* '''Центроидный метод''' (англ. ''UPGMC (Unweighted Pair Group Method with Centroid average)'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\alpha_U = \dfrac{|U|}{|W|}, \alpha_V = \dfrac{|V|}{|W|}, \beta = -\alpha_U \cdot \alpha_V, \gamma = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
* '''Метод Уорда''' (англ. ''Ward's method'')&lt;br /&gt;
: &amp;lt;tex&amp;gt;\alpha_U = \dfrac{|S|+|U|}{|S|+|W|}, \alpha_V = \dfrac{|S|+|V|}{|S|+|W|}, \beta = \dfrac{-|S|}{|S|+|W|}, \gamma = 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойство монотонности ==&lt;br /&gt;
Введем обозначение &amp;lt;tex&amp;gt;\mathrm{R_t}&amp;lt;/tex&amp;gt; {{---}} расстояние между кластерами, выбранными на шаге &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; для объединения.&lt;br /&gt;
&lt;br /&gt;
Дендрограмма позволяет представлять зависимости между множеством объектов с любым числом заданных характеристик&lt;br /&gt;
на двумерном графике, где по одной из осей откладываются все объекты, а по другой {{---}} расстояние &amp;lt;tex&amp;gt;\mathrm{R_t}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Если не накладывать на это расстояние никаких ограничений, то дендрограмма будет иметь большое число самопересечений и изображение перестанет быть наглядным.&lt;br /&gt;
Чтобы любой кластер мог быть представлен в виде непрерывного отрезка на оси объектов и ребра не пересекались,&lt;br /&gt;
необходимо наложить ограничение монотонности на &amp;lt;tex&amp;gt;\mathrm{R_t}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Функция расстояния &amp;lt;tex&amp;gt;\mathrm{R}&amp;lt;/tex&amp;gt; является '''монотонной''', если на каждом следующем шаге расстояние между кластерами не уменьшается:&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{R_2} \leqslant \mathrm{R_3} \leqslant \dots \leqslant \mathrm{R_m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Расстояние является монотонным, если для коэффициентов в формул Ланса-Уильямса верна теорема Миллигана.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Миллиган, 1979&lt;br /&gt;
|statement=Если выполняются следующие три условия, то кластеризация является монотонной:&lt;br /&gt;
# &amp;lt;tex&amp;gt;\alpha_U \geqslant 0, \alpha_V \geqslant 0 &amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\alpha_U + \alpha_V + \beta \geqslant 1&amp;lt;/tex&amp;gt;;&lt;br /&gt;
# &amp;lt;tex&amp;gt;\min\{\alpha_U, \alpha_V\} + \gamma \geqslant 0 &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;|\mathrm{R_{t+1}} - \mathrm{R_t}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
В качестве итоговых кластеров выдаются кластеры, полученные на шаге &amp;lt;tex&amp;gt;\mathrm{t}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
При этом число кластеров равно &amp;lt;tex&amp;gt;m - t + 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Однако, когда число кластеров заранее неизвестно и объектов в выборке не очень много, бывает полезно изучить дендрограмму целиком.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
 &amp;lt;font color=darkgreen&amp;gt;// алгоритм принимает множество объектов и возвращает множество кластеров для каждого шага &amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' hierarchy(X: '''Set&amp;lt;Object&amp;gt;'''): '''Set&amp;lt;Set&amp;lt;Object&amp;gt;&amp;gt;'''&lt;br /&gt;
   t = 1&lt;br /&gt;
   &amp;lt;tex&amp;gt;\mathrm{C_t} = {{x_1}, \dots, {x_m}}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' i = 2 '''to''' m&lt;br /&gt;
      &amp;lt;tex&amp;gt;\langle U, V \rangle = \displaystyle \arg \min_{U \neq V, U \in C_{i-1}, V \in C_{i-1}} R(U, V)&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;\mathrm{R_{t}} = \mathrm{R}(U, V)&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt;\mathrm{C_{i}} = \mathrm{C_{i-1}} \cup \{\mathrm{W}\} \setminus \{\mathrm{U}, \mathrm{V}\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''for''' &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; '''in''' &amp;lt;tex&amp;gt; C_t &amp;lt;/tex&amp;gt; &lt;br /&gt;
          &amp;lt;tex&amp;gt;\mathrm{R_{i}}(W, S) = \alpha_U \cdot \mathrm{R_{i-1}}(U, S) + \alpha_V \cdot \mathrm{R_{i-1}}(V, S) + \beta \cdot \mathrm{R_{i-1}}(U, V) + \gamma \cdot |\mathrm{R_{i-1}}(U, S) - \mathrm{R{i-1}}(V, S)| &amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt; C &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
 &amp;lt;font color=darkgreen&amp;gt;# Подключение библиотек&amp;lt;/font&amp;gt;&lt;br /&gt;
 from scipy.cluster.hierarchy import linkage, dendrogram&lt;br /&gt;
 from sklearn import datasets&lt;br /&gt;
 import matplotlib.pyplot as plt&lt;br /&gt;
 &amp;lt;tex&amp;gt;&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;font color=darkgreen&amp;gt;# Создание полотна для рисования&amp;lt;/font&amp;gt;&lt;br /&gt;
 fig = plt.figure(figsize=(15, 30))&lt;br /&gt;
 fig.patch.set_facecolor('white')&lt;br /&gt;
 &amp;lt;tex&amp;gt;&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;font color=darkgreen&amp;gt;# Загрузка набора данных &amp;quot;Ирисы Фишера&amp;quot;&amp;lt;/font&amp;gt;&lt;br /&gt;
 iris = datasets.load_iris()&lt;br /&gt;
 &amp;lt;tex&amp;gt;&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;font color=darkgreen&amp;gt;# Реализация иерархической кластеризации при помощи функции linkage&amp;lt;/font&amp;gt;&lt;br /&gt;
 mergings = linkage(iris.data, method='ward')&lt;br /&gt;
 &amp;lt;tex&amp;gt;&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;font color=darkgreen&amp;gt;# Построение дендрограммы. Разными цветами выделены автоматически определенные кластеры&amp;lt;/font&amp;gt;&lt;br /&gt;
 R = dendrogram(mergings, labels=[iris.target_names[i] for i in iris.target], orientation = 'left', leaf_font_size = 12)&lt;br /&gt;
 &amp;lt;tex&amp;gt;&amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;font color=darkgreen&amp;gt;# Отображение дендрограммы&amp;lt;/font&amp;gt;&lt;br /&gt;
 plt.show()&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; font-weight:bold;&amp;quot; colspan = 4 |Дендрограммы кластеризации ирисов Фишера&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/%D0%98%D1%80%D0%B8%D1%81%D1%8B_%D0%A4%D0%B8%D1%88%D0%B5%D1%80%D0%B0 Википедия {{---}} Ирисы Фишера]&amp;lt;/ref&amp;gt; в зависимости от функции расстояния между кластерами&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:hierarchy_min.png|350px|Расстояние минимума.]]&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:hierarchy_max.png|350px|Расстояние максимума.]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Метод одиночной связи&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Метод полной связи&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:hierarchy_avg.png|350px|Расстояние среднего.]]&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:hierarchy_ward.png|350px|Расстояние Уорда.]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Метод средней связи&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Метод Уорда&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Лучше всего с задачей справился алгоритм с использованием расстояния Уорда. Он точно выделил класс ''Iris setosa'' и заметно отделил вид ''Iris virginica'' от ''Iris versicolor''.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Кластеризация|Кластеризация]]&lt;br /&gt;
* [[Оценка_качества_в_задаче_кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
* [[EM-алгоритм|EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[k-средних|&amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-средних]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&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;
* [https://ru.wikipedia.org/wiki/%D0%98%D0%B5%D1%80%D0%B0%D1%80%D1%85%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F Википедия {{---}} Иерархическая кластеризация] &lt;br /&gt;
* [https://docs.scipy.org/doc/scipy/reference/cluster.hierarchy.html Scipy Documentation {{---}} Hierarchical clustering (scipy.cluster.hierarchy)]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/c/ca/Voron-ML-Clustering.pdf К.В.Воронцов Лекции по алгоритмам кластеризации и многомерного шкалирования]&lt;br /&gt;
* G. N. Lance, W. T. Williams; A General Theory of Classificatory Sorting Strategies: 1. Hierarchical Systems, The Computer Journal, Volume 9, Issue 4, 1 February 1967, Pages 373–380&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Кластеризация]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69526</id>
		<title>Кластеризация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69526"/>
				<updated>2019-01-28T14:36:05Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Методы кластеризации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:clusters.png|thumb|300px|Пример кластеризации]]&lt;br /&gt;
'''Кластеризация''' (англ. ''cluster analysis'') {{---}} задача группировки множества объектов на подмножества ('''кластеры''') таким образом,&lt;br /&gt;
чтобы объекты из одного кластера были более похожи друг на друга, чем на объекты из других кластеров по какому-либо критерию.&lt;br /&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; {{---}} множество идентификаторов (меток) кластеров.&lt;br /&gt;
На множестве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; задана функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Дана конечная обучающая выборка объектов &amp;lt;tex&amp;gt;X^m = \{ x_1, \dots, x_m \} \subset X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Необходимо разбить выборку на подмножества (кластеры), то есть каждому объекту &amp;lt;tex&amp;gt;x_i \in X^m&amp;lt;/tex&amp;gt; сопоставить метку &amp;lt;tex&amp;gt;y_i \in Y&amp;lt;/tex&amp;gt;,&lt;br /&gt;
таким образом чтобы объекты внутри каждого кластера были близки относительно метрики &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;, а объекты из разных кластеров значительно различались.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Алгоритм кластеризации''' — функция &amp;lt;tex&amp;gt;a\colon X\to Y&amp;lt;/tex&amp;gt;, которая любому объекту &amp;lt;tex&amp;gt;x\in X&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;Y&amp;lt;/tex&amp;gt; в некоторых случаях известно заранее, однако чаще ставится задача&lt;br /&gt;
определить оптимальное число кластеров, с точки зрения того или иного ''критерия качества'' кластеризации.&lt;br /&gt;
&lt;br /&gt;
Кластеризация (обучение без учителя) отличается от классификации (обучения с учителем) тем,&lt;br /&gt;
что метки объектов из обучающей выборки &amp;lt;tex&amp;gt;y_i&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;quot;по построению&amp;quot;, однако все они могут давать разные результаты. Следовательно, для определения качества кластеризации и оценки выделенных кластеров необходим эксперт предметной области.&lt;br /&gt;
* Число кластеров, как правило, заранее не известно и выбирается по субъективным критериям. Даже если алгоритм не требует изначального знания о числе классов, конкретные реализации зачастую требуют указать этот параметр&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/clustering.html scikit-learn {{---}} Clustering]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Результат кластеризации существенно зависит от метрики. Однако существует ряд рекомендаций по выбору метрик для определенных классов задач.&amp;lt;ref&amp;gt;Cornwell, B. (2015). Linkage Criteria for Agglomerative Hierarchical Clustering. Social Sequence Analysis, 270–274.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Число кластеров фактически является гиперпараметром для алгоритмов кластеризации. Подробнее про другие гиперпараметры и их настройку можно прочитать в статье&amp;lt;ref&amp;gt;Shalamov Viacheslav, Valeria Efimova, Sergey Muravyov, and Andrey Filchenkov. &amp;quot;Reinforcement-based Method for Simultaneous Clustering Algorithm Selection and its Hyperparameters Optimization.&amp;quot; Procedia Computer Science 136 (2018): 144-153.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Теорема невозможности Клейнберга ==&lt;br /&gt;
Для формализации алгоритмов кластеризации была использована аксиоматическая теория. Клейнберг постулировал три простых свойства в качестве аксиом кластеризации и доказал теорему, связывающую эти свойства.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Алгоритм кластеризации &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; является '''масштабно инвариантным''' (англ. ''scale-invariant''), если для любой функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; и любой константы &amp;lt;tex&amp;gt;\alpha &amp;gt; 0&amp;lt;/tex&amp;gt; результаты кластеризации с использованием расстояний &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\alpha\cdot\rho&amp;lt;/tex&amp;gt; совпадают.&lt;br /&gt;
}} &lt;br /&gt;
Первая аксиома интуитивно понятна. Она требует, чтобы функция кластеризации не зависила от системы счисления функции расстояния и была нечувствительна к линейному растяжению и сжатию метрического пространства обучающей выборки.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Полнота''' (англ. ''Richness''). Множество результатов кластеризации алгоритма &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в зависимости от изменения функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; должно совпадать со множеством всех возможных разбиений множества объектов &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
Вторая аксиома утверждает, что алгоритм кластеризации должен уметь кластеризовать обучающую выборку на любое фиксированное разбиение для какой-то функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Функция расстояния &amp;lt;tex&amp;gt;{\rho}'&amp;lt;/tex&amp;gt; является '''допустимым преобразованием''' функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;, если&lt;br /&gt;
#&amp;lt;tex&amp;gt;{\rho}'(x_i, x_j) \leqslant \rho(x_i, x_j)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_j&amp;lt;/tex&amp;gt; лежат в одном кластере&lt;br /&gt;
#&amp;lt;tex&amp;gt;{\rho}'(x_i, x_j) \geqslant \rho(x_i, x_j)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_j&amp;lt;/tex&amp;gt; лежат в разных кластерах.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Алгоритм кластеризации является '''согласованным''' (англ. ''consistent''), если результат кластеризации не изменяется после допустимого преобразования функции расстояния.&lt;br /&gt;
}} &lt;br /&gt;
Третья аксиома требует сохранения кластеров при уменьшении внутрикластерного расстояния и увеличении межкластерного расстояния.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; font-weight:bold;&amp;quot; colspan=3|Примеры преобразований с сохранением кластеров&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:cluster_0.png|300px]]&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:clusters_scale_inv.png|300px]]&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:cluster_consist.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Исходное расположение объектов и их кластеризация&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Пример масштабной инвариантности. Уменьшен масштаб по оси ординат в два раза.&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Пример допустимого преобразования. Каждый объект в два раза приближен к центроиду своего класса. Внутриклассовое расстояние уменьшилось, межклассовое увеличилось.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из этих аксиом Клейнберг сформулировал и доказал теорему:&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Клейнберга&lt;br /&gt;
|about=о невозможности&lt;br /&gt;
|statement=Для множества объектов, состоящего из двух и более элементов, не существует алгоритма кластеризации, который был бы одновременно масштабно-инвариантным, согласованным и полным.&lt;br /&gt;
}}&lt;br /&gt;
Несмотря на эту теорему Клейнберг показал&amp;lt;ref&amp;gt;[https://www.cs.cornell.edu/home/kleinber/nips15.pdf Kleinberg J. An Impossibility Theorem for Clustering]&amp;lt;/ref&amp;gt;, &lt;br /&gt;
что иерархическая кластеризация по методу одиночной связи с различными критериями останова удовлетворяет любым двум из трех аксиом.&lt;br /&gt;
&lt;br /&gt;
== Типология задач кластеризации ==&lt;br /&gt;
=== Типы входных данных ===&lt;br /&gt;
* Признаковое описание объектов. Каждый объект описывается набором своих характеристик, называемых признаками (англ. ''features''). Признаки могут быть как числовыми, так и категориальными.&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;
** [[EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Иерархическая_кластеризация|Иерархические алгоритмы кластеризации]]. Упорядочивание данных путем создания иерархии вложенных кластеров.&lt;br /&gt;
* [[K-средних|Алгоритм &amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-средних]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt; (англ. ''&amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-means''). Итеративный алгоритм, основанный на минимизации суммарного квадратичного отклонения точек кластеров от центров этих кластеров.&lt;br /&gt;
* Распространение похожести (англ. ''affinity propagation''). Распространяет сообщения о похожести между парами объектов для выбора типичных представителей каждого кластера.&lt;br /&gt;
* Сдвиг среднего значения (англ. ''mean shift''). Выбирает центроиды кластеров в областях с наибольшей плотностью.&lt;br /&gt;
* Спектральная кластеризация (англ. ''spectral clustering''). Использует собственные значения матрицы расстояний для понижения размерности перед использованием других методов кластеризации.&lt;br /&gt;
* Основанная на плотности пространственная кластеризация для приложений с шумами (англ. ''Density-based spatial clustering of applications with noise'', ''DBSCAN''). Алгоритм группирует в один кластер точки в области с высокой плотностью. Одиноко расположенные точки помечает как шум.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:cluster_comparison.png|thumb|800px|center|&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;Сравнение алгоритмов кластеризации из пакета scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html scikit-learn {{---}} Comparing different clustering algorithms on toy datasets]&amp;lt;/ref&amp;gt;&amp;lt;/div&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== Меры качества кластеризации ==&lt;br /&gt;
Для оценки качества кластеризации задачу можно переформулировать в терминах задачи дискретной оптимизации. &lt;br /&gt;
Необходима так сопоставить объектам из множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; метки кластеров, чтобы значение выбранного функционала качества приняло наилучшее значение. &lt;br /&gt;
В качестве примера, стремятся достичь минимума среднего внутрикластерного расстояния &amp;lt;tex&amp;gt;F_0 = \dfrac{\sum_{i&amp;lt;j}{[y_i=y_j]\cdot\rho(x_i, x_j)}}{\sum_{i&amp;lt;j}[y_i=y_j]}&amp;lt;/tex&amp;gt; или максимума среднего межкластерного расстояния &amp;lt;tex&amp;gt;F_1 = \dfrac{\sum_{i&amp;lt;j}{[y_i\neq y_j]\cdot\rho(x_i, x_j)}}{\sum_{i&amp;lt;j}[y_i\neq y_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;
Кластеризация широко используется при изучении рынка для обработки данных, полученных из различных опросов.&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;
* [[EM-алгоритм|EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Иерархическая_кластеризация|Иерархическая кластеризация]]&lt;br /&gt;
* [[k-средних|&amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-средних]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&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;
* [https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7 Википедия {{---}} Кластерный анализ]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Cluster_analysis Wikipedia {{---}} Cluster analysis]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F MachineLearning {{---}} Кластеризация] &lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/c/ca/Voron-ML-Clustering.pdf К.В.Воронцов Лекции по алгоритмам кластеризации и многомерного шкалирования]&lt;br /&gt;
* [https://www.cs.cornell.edu/home/kleinber/nips15.pdf Kleinberg J. An Impossibility Theorem for Clustering]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Кластеризация]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69524</id>
		<title>Кластеризация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=69524"/>
				<updated>2019-01-28T14:35:43Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:clusters.png|thumb|300px|Пример кластеризации]]&lt;br /&gt;
'''Кластеризация''' (англ. ''cluster analysis'') {{---}} задача группировки множества объектов на подмножества ('''кластеры''') таким образом,&lt;br /&gt;
чтобы объекты из одного кластера были более похожи друг на друга, чем на объекты из других кластеров по какому-либо критерию.&lt;br /&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; {{---}} множество идентификаторов (меток) кластеров.&lt;br /&gt;
На множестве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; задана функция расстояния между объектами &amp;lt;tex&amp;gt;\rho(x,x')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Дана конечная обучающая выборка объектов &amp;lt;tex&amp;gt;X^m = \{ x_1, \dots, x_m \} \subset X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Необходимо разбить выборку на подмножества (кластеры), то есть каждому объекту &amp;lt;tex&amp;gt;x_i \in X^m&amp;lt;/tex&amp;gt; сопоставить метку &amp;lt;tex&amp;gt;y_i \in Y&amp;lt;/tex&amp;gt;,&lt;br /&gt;
таким образом чтобы объекты внутри каждого кластера были близки относительно метрики &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;, а объекты из разных кластеров значительно различались.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Алгоритм кластеризации''' — функция &amp;lt;tex&amp;gt;a\colon X\to Y&amp;lt;/tex&amp;gt;, которая любому объекту &amp;lt;tex&amp;gt;x\in X&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;Y&amp;lt;/tex&amp;gt; в некоторых случаях известно заранее, однако чаще ставится задача&lt;br /&gt;
определить оптимальное число кластеров, с точки зрения того или иного ''критерия качества'' кластеризации.&lt;br /&gt;
&lt;br /&gt;
Кластеризация (обучение без учителя) отличается от классификации (обучения с учителем) тем,&lt;br /&gt;
что метки объектов из обучающей выборки &amp;lt;tex&amp;gt;y_i&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;quot;по построению&amp;quot;, однако все они могут давать разные результаты. Следовательно, для определения качества кластеризации и оценки выделенных кластеров необходим эксперт предметной области.&lt;br /&gt;
* Число кластеров, как правило, заранее не известно и выбирается по субъективным критериям. Даже если алгоритм не требует изначального знания о числе классов, конкретные реализации зачастую требуют указать этот параметр&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/clustering.html scikit-learn {{---}} Clustering]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
* Результат кластеризации существенно зависит от метрики. Однако существует ряд рекомендаций по выбору метрик для определенных классов задач.&amp;lt;ref&amp;gt;Cornwell, B. (2015). Linkage Criteria for Agglomerative Hierarchical Clustering. Social Sequence Analysis, 270–274.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Число кластеров фактически является гиперпараметром для алгоритмов кластеризации. Подробнее про другие гиперпараметры и их настройку можно прочитать в статье&amp;lt;ref&amp;gt;Shalamov Viacheslav, Valeria Efimova, Sergey Muravyov, and Andrey Filchenkov. &amp;quot;Reinforcement-based Method for Simultaneous Clustering Algorithm Selection and its Hyperparameters Optimization.&amp;quot; Procedia Computer Science 136 (2018): 144-153.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Теорема невозможности Клейнберга ==&lt;br /&gt;
Для формализации алгоритмов кластеризации была использована аксиоматическая теория. Клейнберг постулировал три простых свойства в качестве аксиом кластеризации и доказал теорему, связывающую эти свойства.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Алгоритм кластеризации &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; является '''масштабно инвариантным''' (англ. ''scale-invariant''), если для любой функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; и любой константы &amp;lt;tex&amp;gt;\alpha &amp;gt; 0&amp;lt;/tex&amp;gt; результаты кластеризации с использованием расстояний &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\alpha\cdot\rho&amp;lt;/tex&amp;gt; совпадают.&lt;br /&gt;
}} &lt;br /&gt;
Первая аксиома интуитивно понятна. Она требует, чтобы функция кластеризации не зависила от системы счисления функции расстояния и была нечувствительна к линейному растяжению и сжатию метрического пространства обучающей выборки.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Полнота''' (англ. ''Richness''). Множество результатов кластеризации алгоритма &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; в зависимости от изменения функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt; должно совпадать со множеством всех возможных разбиений множества объектов &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
Вторая аксиома утверждает, что алгоритм кластеризации должен уметь кластеризовать обучающую выборку на любое фиксированное разбиение для какой-то функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Функция расстояния &amp;lt;tex&amp;gt;{\rho}'&amp;lt;/tex&amp;gt; является '''допустимым преобразованием''' функции расстояния &amp;lt;tex&amp;gt;\rho&amp;lt;/tex&amp;gt;, если&lt;br /&gt;
#&amp;lt;tex&amp;gt;{\rho}'(x_i, x_j) \leqslant \rho(x_i, x_j)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_j&amp;lt;/tex&amp;gt; лежат в одном кластере&lt;br /&gt;
#&amp;lt;tex&amp;gt;{\rho}'(x_i, x_j) \geqslant \rho(x_i, x_j)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;x_j&amp;lt;/tex&amp;gt; лежат в разных кластерах.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Алгоритм кластеризации является '''согласованным''' (англ. ''consistent''), если результат кластеризации не изменяется после допустимого преобразования функции расстояния.&lt;br /&gt;
}} &lt;br /&gt;
Третья аксиома требует сохранения кластеров при уменьшении внутрикластерного расстояния и увеличении межкластерного расстояния.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:center; font-weight:bold;&amp;quot; colspan=3|Примеры преобразований с сохранением кластеров&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:cluster_0.png|300px]]&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:clusters_scale_inv.png|300px]]&lt;br /&gt;
| style=&amp;quot;padding:5px;&amp;quot; |[[Файл:cluster_consist.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Исходное расположение объектов и их кластеризация&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Пример масштабной инвариантности. Уменьшен масштаб по оси ординат в два раза.&lt;br /&gt;
| style=&amp;quot;text-align:center;width:305px;&amp;quot; | Пример допустимого преобразования. Каждый объект в два раза приближен к центроиду своего класса. Внутриклассовое расстояние уменьшилось, межклассовое увеличилось.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходя из этих аксиом Клейнберг сформулировал и доказал теорему:&lt;br /&gt;
{{Теорема&lt;br /&gt;
|author=Клейнберга&lt;br /&gt;
|about=о невозможности&lt;br /&gt;
|statement=Для множества объектов, состоящего из двух и более элементов, не существует алгоритма кластеризации, который был бы одновременно масштабно-инвариантным, согласованным и полным.&lt;br /&gt;
}}&lt;br /&gt;
Несмотря на эту теорему Клейнберг показал&amp;lt;ref&amp;gt;[https://www.cs.cornell.edu/home/kleinber/nips15.pdf Kleinberg J. An Impossibility Theorem for Clustering]&amp;lt;/ref&amp;gt;, &lt;br /&gt;
что иерархическая кластеризация по методу одиночной связи с различными критериями останова удовлетворяет любым двум из трех аксиом.&lt;br /&gt;
&lt;br /&gt;
== Типология задач кластеризации ==&lt;br /&gt;
=== Типы входных данных ===&lt;br /&gt;
* Признаковое описание объектов. Каждый объект описывается набором своих характеристик, называемых признаками (англ. ''features''). Признаки могут быть как числовыми, так и категориальными.&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;
** [[EM-алгоритм]]&lt;br /&gt;
* [[Иерархическая_кластеризация|Иерархические алгоритмы кластеризации]]. Упорядочивание данных путем создания иерархии вложенных кластеров.&lt;br /&gt;
* [[K-средних|Алгоритм &amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-средних]] (англ. ''&amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-means''). Итеративный алгоритм, основанный на минимизации суммарного квадратичного отклонения точек кластеров от центров этих кластеров.&lt;br /&gt;
* Распространение похожести (англ. ''affinity propagation''). Распространяет сообщения о похожести между парами объектов для выбора типичных представителей каждого кластера.&lt;br /&gt;
* Сдвиг среднего значения (англ. ''mean shift''). Выбирает центроиды кластеров в областях с наибольшей плотностью.&lt;br /&gt;
* Спектральная кластеризация (англ. ''spectral clustering''). Использует собственные значения матрицы расстояний для понижения размерности перед использованием других методов кластеризации.&lt;br /&gt;
* Основанная на плотности пространственная кластеризация для приложений с шумами (англ. ''Density-based spatial clustering of applications with noise'', ''DBSCAN''). Алгоритм группирует в один кластер точки в области с высокой плотностью. Одиноко расположенные точки помечает как шум.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Файл:cluster_comparison.png|thumb|800px|center|&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;Сравнение алгоритмов кластеризации из пакета scikit-learn&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html scikit-learn {{---}} Comparing different clustering algorithms on toy datasets]&amp;lt;/ref&amp;gt;&amp;lt;/div&amp;gt;]]&lt;br /&gt;
== Меры качества кластеризации ==&lt;br /&gt;
Для оценки качества кластеризации задачу можно переформулировать в терминах задачи дискретной оптимизации. &lt;br /&gt;
Необходима так сопоставить объектам из множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; метки кластеров, чтобы значение выбранного функционала качества приняло наилучшее значение. &lt;br /&gt;
В качестве примера, стремятся достичь минимума среднего внутрикластерного расстояния &amp;lt;tex&amp;gt;F_0 = \dfrac{\sum_{i&amp;lt;j}{[y_i=y_j]\cdot\rho(x_i, x_j)}}{\sum_{i&amp;lt;j}[y_i=y_j]}&amp;lt;/tex&amp;gt; или максимума среднего межкластерного расстояния &amp;lt;tex&amp;gt;F_1 = \dfrac{\sum_{i&amp;lt;j}{[y_i\neq y_j]\cdot\rho(x_i, x_j)}}{\sum_{i&amp;lt;j}[y_i\neq y_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;
Кластеризация широко используется при изучении рынка для обработки данных, полученных из различных опросов.&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;
* [[EM-алгоритм|EM-алгоритм]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [[Иерархическая_кластеризация|Иерархическая кластеризация]]&lt;br /&gt;
* [[k-средних|&amp;lt;tex&amp;gt;\mathrm{k}&amp;lt;/tex&amp;gt;-средних]]&amp;lt;sup&amp;gt;[на 28.01.18 не создан]&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;
* [https://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7 Википедия {{---}} Кластерный анализ]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Cluster_analysis Wikipedia {{---}} Cluster analysis]&lt;br /&gt;
* [http://www.machinelearning.ru/wiki/index.php?title=%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F MachineLearning {{---}} Кластеризация] &lt;br /&gt;
* [http://www.machinelearning.ru/wiki/images/c/ca/Voron-ML-Clustering.pdf К.В.Воронцов Лекции по алгоритмам кластеризации и многомерного шкалирования]&lt;br /&gt;
* [https://www.cs.cornell.edu/home/kleinber/nips15.pdf Kleinberg J. An Impossibility Theorem for Clustering]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;br /&gt;
[[Категория: Кластеризация]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%B8_%D0%B5%D1%91_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80&amp;diff=69521</id>
		<title>Модель алгоритма и её выбор</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%B8_%D0%B5%D1%91_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80&amp;diff=69521"/>
				<updated>2019-01-28T14:34:43Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Мета-обучение */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Понятие модели==&lt;br /&gt;
Пусть дана обучающая выборка &amp;lt;tex&amp;gt;(X, 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; {{---}} конечное множество меток.&lt;br /&gt;
&lt;br /&gt;
Пусть задана функция &amp;lt;tex&amp;gt; g: X \times \Theta \rightarrow Y &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; {{---}} множество дополнительных параметров (весов) функции.&lt;br /&gt;
&lt;br /&gt;
Описанная выше функция &amp;lt;tex&amp;gt; g &amp;lt;/tex&amp;gt; для фиксированного значения весов &amp;lt;tex&amp;gt; \theta \in \Theta &amp;lt;/tex&amp;gt; называется '''решающим правилом'''.&lt;br /&gt;
&lt;br /&gt;
'''Модель''' {{---}} это совокупность всех решающих правил, которые получаются путем присваивания весам всех возможных допустимых значений. &lt;br /&gt;
&lt;br /&gt;
Формально модель &amp;lt;tex&amp;gt; A = \{g(x, \theta)| \theta \in \Theta\} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Модель определяется множеством допустимых весов &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; и структурой решающего правила &amp;lt;tex&amp;gt; g(x,\theta) &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;sup&amp;gt;[на 28.01.19 не создан]&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
[[Файл:Linear-regression.png|300px|thumb|[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 Рис 1. Пример линейной регрессии]]]&lt;br /&gt;
В качестве примера модели приведем [[Линейная регрессия | линейную регрессию]]&amp;lt;sup&amp;gt;[на 28.01.19 не создан].&lt;br /&gt;
&lt;br /&gt;
Линейная регрессия задается следующей формулой:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; g(x, \theta) = \theta_0 + \theta_1x_1 + ... + \theta_kx_k = \theta_0 + \sum_{i=1}^k \theta_ix_i = \theta_0 + x^T\theta&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; x^T = (x_1, x_2, ..., x_k) &amp;lt;/tex&amp;gt; {{---}} вектор признаков, &amp;lt;tex&amp;gt; \theta = (\theta_1, \theta_2, ..., \theta_k)&amp;lt;/tex&amp;gt; {{---}} веса модели, настраиваемые в процессе обучения.&lt;br /&gt;
&lt;br /&gt;
Гиперпараметром модели является число слагаемых в функции &amp;lt;tex&amp;gt; g(x, \theta) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Более подробный пример линейной регрессии можно посмотреть в статье [[Переобучение | переобучение]].&lt;br /&gt;
&lt;br /&gt;
== Задача выбора модели ==&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; {{---}} модель алгоритма, характеризующаяся гиперпараметрами &amp;lt;tex&amp;gt; \lambda = \{\lambda_1, ..., \lambda_m\}, \lambda_1 \in \Lambda_1, ..., \lambda_m \in \Lambda_m &amp;lt;/tex&amp;gt;. Тогда с ней связано пространство гиперпараметров &amp;lt;tex&amp;gt; \Lambda = \Lambda_1 \times ... \times \Lambda_m &amp;lt;/tex&amp;gt;. За &amp;lt;tex&amp;gt; A_{\lambda}&amp;lt;/tex&amp;gt; обозначим алгоритм, то есть модель алгоритма, для которой задан вектор гиперпараметров &amp;lt;tex&amp;gt; \lambda \in \Lambda &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для выбора наилучшего алгоритма необходимо зафиксировать меру качества работы алгоритма. Назовем эту меру &amp;lt;tex&amp;gt; Q(A_{\lambda}, D) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Задачу выбора наилучшего алгоритма можно разбить на две подзадачи: подзадачу выбора лучшего алгоритма из портфолио и подзадачу настройки гиперпараметров.&lt;br /&gt;
&lt;br /&gt;
==== Подзадача выбора лучшего алгоритма из портфолио ====&lt;br /&gt;
Дано некоторое множество алгоритмов с фиксированными структурными параметрами &amp;lt;tex&amp;gt; \mathcal{A} = \{A^1_{\lambda_1}, ..., A^m_{\lambda_m}\}&amp;lt;/tex&amp;gt; и обучающая выборка &amp;lt;tex&amp;gt; D = \{d_1, ..., d_n\}&amp;lt;/tex&amp;gt;. Здесь &amp;lt;tex&amp;gt; d_i = (x_i, y_i) \in (X, Y)&amp;lt;/tex&amp;gt;. Требуется выбрать алгоритм &amp;lt;tex&amp;gt; A^*_{\lambda_*} &amp;lt;/tex&amp;gt;, который окажется наиболее эффективным с точки зрения меры качества &amp;lt;tex&amp;gt; Q &amp;lt;/tex&amp;gt;&lt;br /&gt;
==== Подзадача оптимизации гиперпараметров ====&lt;br /&gt;
Подзадача оптимизации гиперпараметров заключается в подборе таких &amp;lt;tex&amp;gt; \lambda^* \in \Lambda &amp;lt;/tex&amp;gt;, при которых заданная модель алгоритма &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; будет наиболее эффективна.&lt;br /&gt;
&lt;br /&gt;
Гиперпараметры могут выбираться из ограниченного множества или с помощью перебора из неограниченного множества гиперпараметров, это зависит от непосредственной задачи. Во втором случае актуален вопрос максимального времени, которое можно потратить на поиск наилучших гиперпараметров, так как чем больше времени происходит перебор, тем лучше гиперпараметры можно найти, но при этом может быть ограничен временной бюджет, из-за чего перебор придется прервать.&lt;br /&gt;
&lt;br /&gt;
=== Методы выбора модели ===&lt;br /&gt;
Модель можно выбрать из некоторого множества моделей, проверив результат работы каждой модели из множества с помощью ручного тестирования, но ручное тестирование серьезно ограничивает количество моделей, которые можно перебрать, а также требует больших трудозатрат. Поэтому в большинстве случаев используются алгоритмы, позволяющие автоматически выбирать модель. Далее будут рассмотрены некоторые из таких алгоритмов.&lt;br /&gt;
[[Файл:Scikit-learn-scheme.png|900px|thumb|[https://www.codeastar.com/choose-machine-learning-models-python/ Рис 2. Схема выбора модели в библиотеке scikit-learn для Python]]]&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;
Целью мета-обучения является решение задачи выбора алгоритма из портфолио алгоритмов для решения поставленной задачи без непосредственного применения каждого из них. Решение этой задачи в рамках мета-обучения сводится к задаче [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D1%83%D1%87%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%BC обучения с учителем]. Для этого используется заранее отобранное множество наборов данных &amp;lt;tex&amp;gt; D &amp;lt;/tex&amp;gt;. Для каждого набора данных &amp;lt;tex&amp;gt; d \in D &amp;lt;/tex&amp;gt; вычисляется вектор мета-признаков, которые описывают свойства этого набора данных. Ими могут быть: число категориальных или численных признаков объеков в &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, число возможных меток, размер &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt; и [https://ieeexplore.ieee.org/document/7382962 многие другие], а еще эту статью можно найти вот [https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf тут]. Каждый алгоритм запускается на всех наборах данных из &amp;lt;tex&amp;gt; D &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;
Существует формула Вапника, связывающая ошибку на обучении &amp;lt;tex&amp;gt; P_{train}(\theta) &amp;lt;/tex&amp;gt;, емкость &amp;lt;tex&amp;gt; h(\theta) &amp;lt;/tex&amp;gt; и ошибку на генеральной совокупности &amp;lt;tex&amp;gt; P_{test}(\theta) &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; P_{test}(\theta) &amp;lt;= P_{train}(\theta) + \sqrt{\frac{h(\Theta) * (\log{(\frac{2d}{h(\Theta)})} + 1) - \log{(\frac{\eta}{4})}}{n}} &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt; {{---}} размерность пространства признаков.&lt;br /&gt;
&lt;br /&gt;
Неравенство верно с вероятностью &amp;lt;tex&amp;gt; 1 - \eta &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; \forall \theta \in \Theta &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;
===Автоматизированный выбор модели в библиотеке [https://www.ml4aad.org/wp-content/uploads/2018/07/automl_book_draft_auto-weka.pdf auto-WEKA] для Java.===&lt;br /&gt;
Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задач классификации и регрессии (начиная с версии 2.0).&lt;br /&gt;
&lt;br /&gt;
Библиотека позволяет автоматически выбирать из 27 базовых алгоритмов, 10 мета-алгоритмов и 2 ансамблевых алгоритмов лучший, одновременно настраивая его гиперпараметры при помощи алгоритма [https://www.ml4aad.org/automated-algorithm-design/algorithm-configuration/smac/ SMAC]. Решение достигается полным перебором: оптимизация гиперпараметров запускается на всех алгоритмах по очереди. Недостатком такого подхода является слишком большое время выбора модели.&lt;br /&gt;
===Автоматизированный выбор модели в библиотеке [https://epistasislab.github.io/tpot/ Tree-base Pipeline Optimization Tool (TPOT)] для Python.===&lt;br /&gt;
[[Файл:TPOT-scheme.jpeg|500px|thumb|[https://raw.githubusercontent.com/EpistasisLab/tpot/master/images/tpot-ml-pipeline.png Рис 3. Схема выбора модели в библиотеке TPOT]]]&lt;br /&gt;
Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задачи классификации.&lt;br /&gt;
&lt;br /&gt;
Выбор модели осуществляется на основе конвейера, организованного в древовидной структуре. Каждая вершина дерева {{---}} один из четырех операторов конвейера (preprocessing, decomposition, feature selection, modelling). Каждый конвейер начинается с одной или нескольких копий входного набора данных, которые являются листьями дерева и которые подаются в операторы в соответствии со структурой конвейера. Данные модифицируются оператором в вершине и поступают на вход следующей вершины. В библиотеке используются генетические алгоритмы для нахождения лучших конвейеров.&lt;br /&gt;
&lt;br /&gt;
После поиска конвейера его также можно экспортировать в файл Python.&lt;br /&gt;
&lt;br /&gt;
===Автоматизированный выбор модели в библиотеке [https://automl.github.io/auto-sklearn/stable/ auto-sklearn] для Python.===&lt;br /&gt;
[[Файл:Auto-sklearn-scheme.png|500px|thumb|[https://papers.nips.cc/paper/5872-efficient-and-robust-automated-machine-learning.pdf Рис 4. Схема выбора модели в библиотеке auto-sklearn]]]&lt;br /&gt;
Библиотека используется для одновременного поиска оптимальной модели и оптимальных гиперпараметров модели для задачи классификации.&lt;br /&gt;
&lt;br /&gt;
Сначала используется мета-обучение на основе различных признаков и мета-признаков набора данных, чтобы найти наилучшие модели. После этого используется подход [https://en.wikipedia.org/wiki/Bayesian_optimization Байесовской оптимизации], чтобы найти наилучшие гиперпараметры для наилучших моделей.&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;sup&amp;gt;[на 28.01.19 не создан]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%92%D0%B0%D0%BF%D0%BD%D0%B8%D0%BA%D0%B0-%D0%A7%D0%B5%D1%80%D0%B2%D0%BE%D0%BD%D0%B5%D0%BD%D0%BA%D0%B8%D1%81%D0%B0 Теория Вапника-Червоненкинса]&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Cross-validation_(statistics) Кросс-валидация]&lt;br /&gt;
# [https://link.springer.com/article/10.1023/B:MACH.0000015878.60765.42 Мета-обучение]&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D1%83%D1%87%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%BC Обучение с учителем]&lt;br /&gt;
# [https://ru.wikipedia.org/wiki/%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 Линейная регрессия]&lt;br /&gt;
# [https://www.fruct.org/publications/ainl-fruct/files/Fil.pdf Datasets Meta-Feature Description for Recommending Feature Selection Algorithm]&lt;br /&gt;
# [https://www.ml4aad.org/automated-algorithm-design/algorithm-configuration/smac/ SMAC]&lt;br /&gt;
# [https://7bce9816-a-62cb3a1a-s-sites.googlegroups.com/site/automl2017icml/accepted-papers/AutoML_2017_paper_23.pdf?attachauth=ANoY7cr6uPaUoNh3gc3A-A1UbLXQgNEATEkfZmKD8kozB3hpCYtM9JwnOevEsW9W42CwurzJKrxxEatcB4DCjWNB_Ndvy1uC0lbQyCTlDIfrW6eYJXvdbFJPilYfmf8_ryilH0IwG0ddntLYy-VA3Fm1JeM495fTZxorYth0DDKiqtKvSR92dGl8CM_mUB7sun0R6wurCxM36QqcYEaf5kIm13MM0reWlR3aPZVNe_-AefOCpoXznR-wH04mSWjH8jmlk5Bw51AN&amp;amp;attredirects=0 Fast Automated Selection of Learning Algorithm And its Hyperparameters by Reinforcement Learning]&lt;br /&gt;
# Shalamov V., Efimova V., Muravyov S., and Filchenkov A. &amp;quot;Reinforcement-based Method for Simultaneous Clustering Algorithm Selection and its Hyperparameters Optimization.&amp;quot; Procedia Computer Science 136 (2018): 144-153.&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/images/0/05/BMMO11_4.pdf Выбор модели] - презентация на MachineLearning.ru&lt;br /&gt;
# [https://en.wikipedia.org/wiki/Hyperparameter_(machine_learning) Гиперпараметры] - статья на Википедии&lt;br /&gt;
# [https://machinelearningmastery.com/difference-between-a-parameter-and-a-hyperparameter/ Разница между параметрами и гиперпараметрами] - описание разницы между параметрами и гиперпараметрами модели&lt;br /&gt;
# [http://jmlda.org/papers/doc/2016/no2/Efimova2016Reinforcement.pdf Применение обучения с подкреплением для одновременного выбора модели алгоритма классификации и ее структурных параметров]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69520</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=69520"/>
				<updated>2019-01-28T14:34:15Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&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;
&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;
&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 Логистическая регрессия] $-$ курс лекций Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.LogisticRegression] $-$ реализация алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69519</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=69519"/>
				<updated>2019-01-28T14:33:46Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Обоснование */&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;
&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;
&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://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 Логистическая регрессия] $-$ курс лекций Воронцова&lt;br /&gt;
#[https://en.wikipedia.org/wiki/Logistic_regression Logistic regression] $-$ Wikipedia&lt;br /&gt;
#[https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html sklearn.linear_model.LogisticRegression] $-$ реализация алгоритма на scikit-learn.org&lt;br /&gt;
&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>Alexey Katsman</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=69518</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=69518"/>
				<updated>2019-01-28T14:33:03Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* См. также */&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;
===Пример использования с помощью 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;
==См. также==&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>Alexey Katsman</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=69517</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=69517"/>
				<updated>2019-01-28T14:32:45Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Обучение перцептрона */&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;
===Пример использования с помощью 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;
==См. также==&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;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 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>Alexey Katsman</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=69516</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=69516"/>
				<updated>2019-01-28T14:32:24Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Обучение нейронной сети */&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;sup&amp;gt;[на 16.01.19 не создан]&amp;lt;/sup&amp;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;
===Пример использования с помощью 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;
==См. также==&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;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 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>Alexey Katsman</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=69515</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=69515"/>
				<updated>2019-01-28T14:32:00Z</updated>
		
		<summary type="html">&lt;p&gt;Alexey Katsman: /* Сети с обратными связями */&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;[на 16.01.19 не создан]&amp;lt;/sup&amp;gt; и [[Обучение без учителя|обучение без учителя]]&amp;lt;sup&amp;gt;[на 16.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;sup&amp;gt;[на 16.01.19 не создан]&amp;lt;/sup&amp;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;
===Пример использования с помощью 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;
==См. также==&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;
* Сергей Николенко, Артур Кадурин, Екатерина Архангельская. Глубокое обучение. Погружение в мир нейронных сетей. — «Питер», 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>Alexey Katsman</name></author>	</entry>

	</feed>