Примеры кода на Scala — различия между версиями
|  (→Метрический классификатор и метод ближайших соседей) | м (rollbackEdits.php mass rollback) | ||
| (не показана 31 промежуточная версия 7 участников) | |||
| Строка 2: | Строка 2: | ||
| ==Популярные библиотеки== | ==Популярные библиотеки== | ||
| − | * Breeze<ref>[https://github.com/scalanlp/breeze Breeze]</ref> {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB<ref>[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]</ref> и NumPy<ref>[https://en.wikipedia.org/wiki/NumPy NumPy wiki]</ref>. Breeze позволяет быстро  | + | * Breeze<ref>[https://github.com/scalanlp/breeze Breeze]</ref> {{---}} библиотека, которая копирует реализует идеи строения структур данных из MATLAB<ref>[https://www.mathworks.com/help/matlab/structures.html MATLAB, structures]</ref> и NumPy<ref>;[https://en.wikipedia.org/wiki/NumPy NumPy wiki]</ref>. Breeze позволяет быстро манипулировать данными и позволяет реализовать матричные и векторные операции, решать задачи оптимизации, обрабатывать сигналы устройств; | 
| − | * Epic<ref>[http://www.scalanlp.org/ ScalaNLP, Epic]</ref> {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста | + | * Epic<ref>[http://www.scalanlp.org/ ScalaNLP, Epic]</ref> {{---}} часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста; | 
| − | * Smpile<ref>[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]</ref> {{---}} развивающийся проект, похожий на scikit-learn<ref>[https://scikit-learn.org/ scikit-learn]</ref>, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого | + | * Smpile<ref>[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]</ref> {{---}} развивающийся проект, похожий на scikit-learn<ref>[https://scikit-learn.org/ scikit-learn]</ref>, разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого; | 
| − | * Apache Spark MLlib<ref>[https://spark.apache.org/mllib/ Apache Spark MLlib]</ref> {{---}} построенная на Spark<ref>[https://spark.apache.org/ Apache Spark]</ref> имеет большой набор алгоритмов, написанный на Scala | + | * Apache Spark MLlib<ref>[https://spark.apache.org/mllib/ Apache Spark MLlib]</ref> {{---}} построенная на Spark<ref>[https://spark.apache.org/ Apache Spark]</ref> имеет большой набор алгоритмов, написанный на Scala; | 
| * DeepLearning.scala <ref>[https://deeplearning.thoughtworks.school/ DeppLearning.scala]</ref> {{---}} набор инструментов для глубокого обучения<ref>[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 Глубокое обучение]</ref>. Позволяет создавать динамические нейронные сети, давая возможность параллельных вычеслений. | * DeepLearning.scala <ref>[https://deeplearning.thoughtworks.school/ DeppLearning.scala]</ref> {{---}} набор инструментов для глубокого обучения<ref>[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 Глубокое обучение]</ref>. Позволяет создавать динамические нейронные сети, давая возможность параллельных вычеслений. | ||
| ==Примеры кода== | ==Примеры кода== | ||
| ===Линейная регрессия=== | ===Линейная регрессия=== | ||
| − | + | {{main|Линейная регрессия|l1=Линейная регрессия<sup>[на 28.01.19 не создан]</sup>}} | |
| Sbt зависимость: | Sbt зависимость: | ||
| − |    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0" | + |    libraryDependencies '''+=''' "org.apache.spark" '''%%''' "spark-core" '''%''' "2.4.0" | 
| − |    libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.4.0" % "runtime" | + |    libraryDependencies '''+=''' "org.apache.spark" '''%%''' "spark-mllib" '''%''' "2.4.0" '''%''' "runtime" | 
| Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression<ref>[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]</ref>: | Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression<ref>[https://spark.apache.org/docs/latest/ml-classification-regression.html#linear-regression Spark, LinearRegression]</ref>: | ||
| − |    val training = spark.read.format("libsvm") | + |    '''val '''training = spark.read.format("libsvm") | 
|      .load("linear_regression.txt") |      .load("linear_regression.txt") | ||
| − |    val lr = new LinearRegression() | + |    '''val '''lr = '''new '''LinearRegression() | 
|      .setMaxIter(10) |      .setMaxIter(10) | ||
|      .setRegParam(0.3) |      .setRegParam(0.3) | ||
|      .setElasticNetParam(0.8) |      .setElasticNetParam(0.8) | ||
| − |    val lrModel = lr.fit(training) | + |    '''val '''lrModel = lr.fit(training) | 
| Вывод итоговых параметров модели: | Вывод итоговых параметров модели: | ||
|    println(lrModel.coefficients) |    println(lrModel.coefficients) | ||
|    println(lrModel.intercept) |    println(lrModel.intercept) | ||
| − |    val trainingSummary = lrModel.summary | + |    '''val '''trainingSummary = lrModel.summary | 
|    println(trainingSummary.totalIterations) |    println(trainingSummary.totalIterations) | ||
|    println(trainingSummary.objectiveHistory.mkString(",")) |    println(trainingSummary.objectiveHistory.mkString(",")) | ||
| Строка 34: | Строка 34: | ||
| ===Вариации регрессии=== | ===Вариации регрессии=== | ||
| − | + | {{main|Вариации регрессии}} | |
| Sbt зависимость: | Sbt зависимость: | ||
| − |    libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2" | + |    libraryDependencies '''+=''' "com.github.haifengl" '''%%''' "smile-scala" '''%''' "1.5.2" | 
| Пример ридж и лассо регрессии c применением smile.regression<ref>[https://haifengl.github.io/smile/regression.html Smile, Regression]</ref>: | Пример ридж и лассо регрессии c применением smile.regression<ref>[https://haifengl.github.io/smile/regression.html Smile, Regression]</ref>: | ||
| − |    import smile.data.{AttributeDataset, NumericAttribute} | + |    '''import '''smile.data.{AttributeDataset, NumericAttribute} | 
| − |    import smile.read | + |    '''import '''smile.read | 
| − |    import smile.regression.{LASSO, RidgeRegression, lasso, ridge} | + |    '''import '''smile.regression.{LASSO, RidgeRegression, lasso, ridge} | 
| − |    val data: AttributeDataset = read.table("regression.txt", delimiter = " ", response = Some((new NumericAttribute("class"), 0))) | + |    '''val '''data: AttributeDataset = read.table("regression.txt", delimiter = " ", response = Some(('''new '''NumericAttribute("class"), 0))) | 
| − |    val x: Array[Array[Double]] = data.x() | + |    '''val '''x: Array[Array['''Double''']] = data.x() | 
| − |    val y: Array[Double] = data.y() | + |    '''val '''y: Array['''Double'''] = data.y() | 
| − |    val ridgeRegression: RidgeRegression = ridge(x, y, 0.0057) | + |    '''val '''ridgeRegression: RidgeRegression = ridge(x, y, 0.0057) | 
| − |    val lassoRegression: LASSO = lasso(x, y, 10) | + |    '''val '''lassoRegression: LASSO = lasso(x, y, 10) | 
|    println(ridgeRegression) |    println(ridgeRegression) | ||
|    println(lassoRegression) |    println(lassoRegression) | ||
| ===Логистическая регрессия=== | ===Логистическая регрессия=== | ||
| − | + | {{main|Логистическая регрессия}} | |
| Sbt зависимость: | Sbt зависимость: | ||
| − |    libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0" | + |    libraryDependencies '''+=''' "org.apache.spark" '''%%''' "spark-core" '''%''' "2.4.0" | 
| − |    libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.4.0" % "runtime" | + |    libraryDependencies '''+=''' "org.apache.spark" '''%%''' "spark-mllib" '''%''' "2.4.0" '''%''' "runtime" | 
| Пример логистической регрессии c применением spark.mllib.classification<ref>[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]</ref>: | Пример логистической регрессии c применением spark.mllib.classification<ref>[https://spark.apache.org/docs/2.3.1/mllib-linear-methods.html#logistic-regression Spark, Logistic Regression]</ref>: | ||
| − |    import org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS} | + |    '''import '''org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS} | 
| − |    import org.apache.spark.mllib.evaluation.MulticlassMetrics | + |    '''import '''org.apache.spark.mllib.evaluation.MulticlassMetrics | 
| − |    import org.apache.spark.mllib.regression.LabeledPoint | + |    '''import '''org.apache.spark.mllib.regression.LabeledPoint | 
| − |    import org.apache.spark.mllib.util.MLUtils | + |    '''import '''org.apache.spark.mllib.util.MLUtils | 
| − |    val data = MLUtils.loadLibSVMFile(sc, "logisticRegresion.txt") | + |    '''val '''data = MLUtils.loadLibSVMFile(sc, "logisticRegresion.txt") | 
| − |    val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) | + |    '''val '''splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) | 
| − |    val training = splits(0).cache() | + |    '''val '''training = splits(0).cache() | 
| − |    val test = splits(1) | + |    '''val '''test = splits(1) | 
| − |    val model = new LogisticRegressionWithLBFGS() | + |    '''val '''model = '''new '''LogisticRegressionWithLBFGS() | 
|      .setNumClasses(10) |      .setNumClasses(10) | ||
|      .run(training) |      .run(training) | ||
| − |    val predictionAndLabels = test.map { case LabeledPoint(label, features) => | + |    '''val '''predictionAndLabels = test.map { '''case '''LabeledPoint(label, features) => | 
| − |      val prediction = model.predict(features) | + |      '''val '''prediction = model.predict(features) | 
|      (prediction, label) |      (prediction, label) | ||
|    } |    } | ||
| − |    val metrics = new MulticlassMetrics(predictionAndLabels) | + |    '''val '''metrics = '''new '''MulticlassMetrics(predictionAndLabels) | 
| − |    val accuracy = metrics.accuracy | + |    '''val '''accuracy = metrics.accuracy | 
|    println(accuracy) |    println(accuracy) | ||
| ===Классификация при помощи MLP=== | ===Классификация при помощи MLP=== | ||
| − | + | {{main|Нейронные сети, перцептрон}} | |
| Sbt зависимость: | Sbt зависимость: | ||
| − |    libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2" | + |    libraryDependencies '''+=''' "com.github.haifengl" '''%%''' "smile-scala" '''%''' "1.5.2" | 
| Пример классификации c применением smile.classification.mlp<ref>[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]</ref>: | Пример классификации c применением smile.classification.mlp<ref>[https://haifengl.github.io/smile/classification.html#neural-network Smile, MLP]</ref>: | ||
| − |    import smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction} | + |    '''import '''smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction} | 
| − |    import smile.data.{AttributeDataset, NumericAttribute} | + |    '''import '''smile.data.{AttributeDataset, NumericAttribute} | 
| − |    import smile.read | + |    '''import '''smile.read | 
| − |    import smile.classification.mlp | + |    '''import '''smile.classification.mlp | 
| − |    import smile.plot.plot | + |    '''import '''smile.plot.plot | 
| − |    val data: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2))) | + |    '''val '''data: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some(('''new '''NumericAttribute("class"), 2))) | 
| − |    val x: Array[Array[Double]] = data.x() | + |    '''val '''x: Array[Array['''Double''']] = data.x() | 
| − |    val y: Array[Int] = data.y().map(_.toInt) | + |    '''val '''y: Array['''Int'''] = data.y().map(_.toInt) | 
| − |    val mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID) | + |    '''val '''mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID) | 
|    plot(x, y, mlpModel) |    plot(x, y, mlpModel) | ||
| ===Рекуррентные нейронные сети=== | ===Рекуррентные нейронные сети=== | ||
| − | + | {{main|Рекуррентные нейронные сети}} | |
| − | Пример кода, с использованием  | + | Пример кода, с использованием библиотеки DeepLearning.scala | 
| − |      // Задание слоёв | + |      <span style="color:#3D9970>// Задание слоёв</span> | 
| − |      def tanh(x: INDArrayLayer): INDArrayLayer = { | + |      '''def '''tanh(x: INDArrayLayer): INDArrayLayer = { | 
| − |        val exp_x = hyperparameters.exp(x) | + |        '''val '''exp_x = hyperparameters.exp(x) | 
| − |        val exp_nx = hyperparameters.exp(-x) | + |        '''val '''exp_nx = hyperparameters.exp(-x) | 
|        (exp_x - exp_nx) / (exp_x + exp_nx) |        (exp_x - exp_nx) / (exp_x + exp_nx) | ||
|      } |      } | ||
| − |      def charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = { | + |      '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = { | 
| − |          val hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh) | + |          '''val '''hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh) | 
| − |          val yraw = why.dot(hnext) + by | + |          '''val '''yraw = why.dot(hnext) + by | 
| − |          val yraw_exp = hyperparameters.exp(yraw) | + |          '''val '''yraw_exp = hyperparameters.exp(yraw) | 
| − |          val prob = yraw_exp / yraw_exp.sum | + |          '''val '''prob = yraw_exp / yraw_exp.sum | 
| − |          val loss = -hyperparameters.log((prob * y).sum) | + |          '''val '''loss = -hyperparameters.log((prob * y).sum) | 
|          (loss, prob, hnext) |          (loss, prob, hnext) | ||
|      } |      } | ||
| − |      // Определение структуры | + |      <span style="color:#3D9970>// Определение структуры</span> | 
| − |      val batches = data.zip(data.tail).grouped(seqLength).toVector | + |      '''val '''batches = data.zip(data.tail).grouped(seqLength).toVector | 
|      type WithHiddenLayer[A] = (A, INDArrayLayer) |      type WithHiddenLayer[A] = (A, INDArrayLayer) | ||
|      type Batch = IndexedSeq[(Char, Char)] |      type Batch = IndexedSeq[(Char, Char)] | ||
| − |      type Losses = Vector[Double] | + |      type Losses = Vector['''Double'''] | 
| − |      def singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = { | + |      '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = { | 
| − |        batch match { | + |        batch '''match '''{ | 
| − |          case (batchseq, hprev) => batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) { | + |          '''case '''(batchseq, hprev) => batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) { | 
|            (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) => |            (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) => | ||
| − |              (bstate, xy) match { | + |              (bstate, xy) '''match '''{ | 
| − |                case ((tot, localhprev), (x, y)) => { | + |                '''case '''((tot, localhprev), (x, y)) => { | 
| − |                  charRNN(oneOfK(x), oneOfK(y), localhprev) match { | + |                  charRNN(oneOfK(x), oneOfK(y), localhprev) '''match '''{ | 
| − |                    case (localloss, _, localhnext) => { | + |                    '''case '''(localloss, _, localhnext) => { | 
|                      (tot + localloss, localhnext) |                      (tot + localloss, localhnext) | ||
|                    } |                    } | ||
| Строка 139: | Строка 139: | ||
|      } |      } | ||
| − |      // Определение одного шага обучения | + |      <span style="color:#3D9970>// Определение одного шага обучения</span> | 
| − |      def initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward) | + |      '''def '''initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward) | 
| − |      def singleRound(initprevloss: Losses): Future[Losses] = | + |      '''def '''singleRound(initprevloss: Losses): Future[Losses] = | 
|        (batches.foldLeftM((initprevloss, initH)) { |        (batches.foldLeftM((initprevloss, initH)) { | ||
|          (bstate: WithHiddenLayer[Losses], batch: Batch) => |          (bstate: WithHiddenLayer[Losses], batch: Batch) => | ||
| − |            bstate match { | + |            bstate '''match '''{ | 
| − |              case (prevloss, hprev) => singleBatch(batch, hprev) match { | + |              '''case '''(prevloss, hprev) => singleBatch(batch, hprev) '''match '''{ | 
| − |                case (bloss, hnext) => bloss.train.map { | + |                '''case '''(bloss, hnext) => bloss.train.map { | 
| − |                  (blossval: Double) => { | + |                  (blossval: '''Double''') => { | 
| − |                      val nloss = prevloss.last * 0.999 + blossval * 0.001 | + |                      '''val '''nloss = prevloss.last * 0.999 + blossval * 0.001 | 
| − |                      val loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001 | + |                      '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001 | 
|                      (loss_seq, hnext) |                      (loss_seq, hnext) | ||
|                  } |                  } | ||
| Строка 157: | Строка 157: | ||
|        }).map { |        }).map { | ||
|          (fstate: WithHiddenLayer[Losses]) => |          (fstate: WithHiddenLayer[Losses]) => | ||
| − |            fstate match { | + |            fstate '''match '''{ | 
| − |              case (floss, _) => floss | + |              '''case '''(floss, _) => floss | 
|            } |            } | ||
|        } |        } | ||
| − |      def allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) { | + |      '''def '''allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) { | 
| − |        (ploss: Losses, round: Int) => { | + |        (ploss: Losses, round: '''Int''') => { | 
|            singleRound(ploss) |            singleRound(ploss) | ||
|        } |        } | ||
|      } |      } | ||
| − |      // Обучение сети | + |      <span style="color:#3D9970>// Обучение сети</span> | 
| − |      def unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf) | + |      '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf) | 
| − |      val losses = unsafePerformFuture(allRounds) | + |      '''val '''losses = unsafePerformFuture(allRounds) | 
| ===Долгая краткосрочная память=== | ===Долгая краткосрочная память=== | ||
| − | + | Основная статья: [[Долгая краткосрочная память]]. | |
| [https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j<ref>[https://deeplearning4j.org/ DeepLearning4j]</ref> и ND4J<ref>[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]</ref> | [https://github.com/IlyaHalsky/neerc-wiki-ml-scala/blob/master/lstm/GravesLSTMCharModellingExample.scala Пример реализации LSTM] на основе DeepLearning4j<ref>[https://deeplearning4j.org/ DeepLearning4j]</ref> и ND4J<ref>[https://deeplearning4j.org/docs/latest/nd4j-overview ND4J]</ref> | ||
| + | |||
| ===Обработка естественного языка=== | ===Обработка естественного языка=== | ||
| − | Основная статья: [[Обработка естественного языка | + | Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]]. | 
| − | |||
| − | |||
| ===Метрический классификатор и метод ближайших соседей=== | ===Метрический классификатор и метод ближайших соседей=== | ||
| − | + | Основная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]]. | |
| ===Метод опорных векторов=== | ===Метод опорных векторов=== | ||
| − | + | Основная статья: [[Метод опорных векторов (SVM)]]<sup>[на 28.01.19 не создан]</sup>. | |
| SBT зависимость: | SBT зависимость: | ||
| − |    libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2" | + |    libraryDependencies '''+=''' "com.github.haifengl" '''%%''' "smile-scala" '''%''' "1.5.2" | 
| Пример классификации датасета и вычисления F1 меры<ref>[https://en.wikipedia.org/wiki/F1_score F1 мера]</ref> используя smile.classification.svm<ref>[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]</ref>: | Пример классификации датасета и вычисления F1 меры<ref>[https://en.wikipedia.org/wiki/F1_score F1 мера]</ref> используя smile.classification.svm<ref>[https://haifengl.github.io/smile/classification.html#svm Smile, SVM]</ref>: | ||
| − |    import smile.classification._ | + |    '''import '''smile.classification._ | 
| − |    import smile.data._ | + |    '''import '''smile.data._ | 
| − |    import smile.plot._ | + |    '''import '''smile.plot._ | 
| − |    import smile.read | + |    '''import '''smile.read | 
| − |    import smile.validation.FMeasure | + |    '''import '''smile.validation.FMeasure | 
| − |    val iris: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2))) | + |    '''val '''iris: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some(('''new '''NumericAttribute("class"), 2))) | 
| − |    val x: Array[Array[Double]] = iris.x() | + |    '''val '''x: Array[Array['''Double''']] = iris.x() | 
| − |    val y: Array[Int] = iris.y().map(_.toInt) | + |    '''val '''y: Array['''Int'''] = iris.y().map(_.toInt) | 
| − |    val SVM = svm(x, y, new GaussianKernel(8.0), 100) | + |    '''val '''SVM = svm(x, y, '''new '''GaussianKernel(8.0), 100) | 
| − |    val predictions: Array[Int] = x.map(SVM.predict) | + |    '''val '''predictions: Array['''Int'''] = x.map(SVM.predict) | 
| − |    val f1Score = new FMeasure().measure(predictions, y) | + |    '''val '''f1Score = '''new '''FMeasure().measure(predictions, y) | 
|    plot(x, y, SVM) |    plot(x, y, SVM) | ||
| + | |||
| ===Дерево решений и случайный лес=== | ===Дерево решений и случайный лес=== | ||
| − | + | Основная статья: [[Дерево решений и случайный лес#Пример на языке Scala | Дерево решений и случайный лес: Пример на языке Scala]]. | |
| ===Байесовская классификация=== | ===Байесовская классификация=== | ||
| − | + | Основная статья: [[Байесовская классификация]]. | |
| SBT зависимость: | SBT зависимость: | ||
| − |    libraryDependencies += "com.tsukaby" %% "naive-bayes-classifier-scala" % "0.2.0" | + |    libraryDependencies '''+=''' "com.tsukaby" '''%%''' "naive-bayes-classifier-scala" '''%''' "0.2.0" | 
| Пример классификации используя smile.classification.cart<ref>[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]</ref>: | Пример классификации используя smile.classification.cart<ref>[https://github.com/tsukaby/naive-bayes-classifier-scala Naive bayes classifier, Scala]</ref>: | ||
| − |    // Создание модели | + |    <span style="color:#3D9970>// Создание модели</span> | 
| − |    val bayes = new BayesClassifier[String, String]() | + |    '''val '''bayes = '''new '''BayesClassifier[String, String]() | 
| − |    // Задание соотвествия категория - слово | + |    <span style="color:#3D9970>// Задание соотвествия категория - слово</span> | 
|    bayes.learn("technology", "github" :: "git" :: "tech" :: "technology" :: Nil) |    bayes.learn("technology", "github" :: "git" :: "tech" :: "technology" :: Nil) | ||
|    bayes.learn("weather", "sun" :: "rain" :: "cloud" :: "weather" :: "snow" :: Nil) |    bayes.learn("weather", "sun" :: "rain" :: "cloud" :: "weather" :: "snow" :: Nil) | ||
|    bayes.learn("government", "ballot" :: "winner" :: "party" :: "money" :: "candidate" :: Nil) |    bayes.learn("government", "ballot" :: "winner" :: "party" :: "money" :: "candidate" :: Nil) | ||
| − |    // Тестовые примеры | + |    <span style="color:#3D9970>// Тестовые примеры</span> | 
| − |    val unknownText1 = "I use git".split(" ") | + |    '''val '''unknownText1 = "I use git".split(" ") | 
| − |    val unknownText2 = "Today's weather is snow".split(" ") | + |    '''val '''unknownText2 = "Today's weather is snow".split(" ") | 
| − |    val unknownText3 = "I will vote for that party".split(" ") | + |    '''val '''unknownText3 = "I will vote '''for '''that party".split(" ") | 
| − |    // Классификация | + |    <span style="color:#3D9970>// Классификация</span> | 
| − |    println(bayes.classify(unknownText1).map(_.category).getOrElse("")) // technology | + |    println(bayes.classify(unknownText1).map(_.category).getOrElse("")) <span style="color:#3D9970>// technology</span> | 
| − |    println(bayes.classify(unknownText2).map(_.category).getOrElse("")) // weather | + |    println(bayes.classify(unknownText2).map(_.category).getOrElse("")) <span style="color:#3D9970>// weather</span> | 
| − |    println(bayes.classify(unknownText3).map(_.category).getOrElse("")) // government | + |    println(bayes.classify(unknownText3).map(_.category).getOrElse("")) <span style="color:#3D9970>// government</span> | 
| ===EM-алгоритм=== | ===EM-алгоритм=== | ||
| − | + | Основная статья: [[EM-алгоритм]]<sup>[на 28.01.19 не создан]</sup>. | |
| SBT зависимость: | SBT зависимость: | ||
| − |    libraryDependencies += "com. | + |    libraryDependencies '''+=''' "com.github.haifengl" '''%%''' "smile-scala" '''%''' "1.5.2" | 
| Пример классификации используя smile.clustering.kmeans<ref>[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]</ref>: | Пример классификации используя smile.clustering.kmeans<ref>[https://haifengl.github.io/smile/clustering.html#k-means Smile, K-Means]</ref>: | ||
| − |    import smile.clustering._ | + |    '''import '''smile.clustering._ | 
| − |    import smile.data._ | + |    '''import '''smile.data._ | 
| − |    import smile.plot._ | + |    '''import '''smile.plot._ | 
| − |    import smile.read | + |    '''import '''smile.read | 
| − |    val iris: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2))) | + |    '''val '''iris: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some(('''new '''NumericAttribute("class"), 2))) | 
| − |    val x: Array[Array[Double]] = iris.x() | + |    '''val '''x: Array[Array['''Double''']] = iris.x() | 
| − |    val kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000) | + |    '''val '''kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000) | 
| − |    val y = kMeans.getClusterLabel | + |    '''val '''y = kMeans.getClusterLabel | 
|    plot(x, y, '.', Palette.COLORS) |    plot(x, y, '.', Palette.COLORS) | ||
| ===Бустинг, AdaBoost=== | ===Бустинг, AdaBoost=== | ||
| − | + | Основная статья: [[Бустинг, AdaBoost#Пример на языке Scala | Бустинг, AdaBoost: Пример на языке Scala]]. | |
| ===Уменьшение размерности=== | ===Уменьшение размерности=== | ||
| − | + | Основная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]]. | |
| == Примечания == | == Примечания == | ||
| <references/> | <references/> | ||
| + | [[Категория: Машинное обучение]] [[Категория: Примеры кода]] | ||
Текущая версия на 19:30, 4 сентября 2022
 
  Содержание
- 1 Популярные библиотеки
- 2 Примеры кода
- 2.1 Линейная регрессия
- 2.2 Вариации регрессии
- 2.3 Логистическая регрессия
- 2.4 Классификация при помощи MLP
- 2.5 Рекуррентные нейронные сети
- 2.6 Долгая краткосрочная память
- 2.7 Обработка естественного языка
- 2.8 Метрический классификатор и метод ближайших соседей
- 2.9 Метод опорных векторов
- 2.10 Дерево решений и случайный лес
- 2.11 Байесовская классификация
- 2.12 EM-алгоритм
- 2.13 Бустинг, AdaBoost
- 2.14 Уменьшение размерности
 
- 3 Примечания
Популярные библиотеки
- Breeze[1] — библиотека, которая копирует реализует идеи строения структур данных из MATLAB[2] и NumPy[3]. Breeze позволяет быстро манипулировать данными и позволяет реализовать матричные и векторные операции, решать задачи оптимизации, обрабатывать сигналы устройств;
- Epic[4] — часть ScalaNLP, позволяющая парсить и обрабатывать текст, поддерживающая использование GPU. Так же имеет фрэймворк для предсказаний текста;
- Smpile[5] — развивающийся проект, похожий на scikit-learn[6], разработанный на Java и имеющий API для Scala. Имеет большой набор алгоритмов для решения задач классификации, регрессии, выбора фичей и другого;
- Apache Spark MLlib[7] — построенная на Spark[8] имеет большой набор алгоритмов, написанный на Scala;
- DeepLearning.scala [9] — набор инструментов для глубокого обучения[10]. Позволяет создавать динамические нейронные сети, давая возможность параллельных вычеслений.
Примеры кода
Линейная регрессия
Sbt зависимость:
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0" libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.4.0" % "runtime"
Пример линейной регрессии c применением org.apache.spark.ml.regression.LinearRegression[11]:
 val training = spark.read.format("libsvm")
   .load("linear_regression.txt")
 val lr = new LinearRegression()
   .setMaxIter(10)
   .setRegParam(0.3)
   .setElasticNetParam(0.8)
 val lrModel = lr.fit(training)
Вывод итоговых параметров модели:
 println(lrModel.coefficients)
 println(lrModel.intercept)
 val trainingSummary = lrModel.summary
 println(trainingSummary.totalIterations)
 println(trainingSummary.objectiveHistory.mkString(","))
 trainingSummary.residuals.show()
 println(trainingSummary.rootMeanSquaredError)
 println(trainingSummary.r2)
Вариации регрессии
Sbt зависимость:
libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2"
Пример ридж и лассо регрессии c применением smile.regression[12]:
 import smile.data.{AttributeDataset, NumericAttribute}
 import smile.read
 import smile.regression.{LASSO, RidgeRegression, lasso, ridge}
 val data: AttributeDataset = read.table("regression.txt", delimiter = " ", response = Some((new NumericAttribute("class"), 0)))
 val x: Array[Array[Double]] = data.x()
 val y: Array[Double] = data.y()
 val ridgeRegression: RidgeRegression = ridge(x, y, 0.0057)
 val lassoRegression: LASSO = lasso(x, y, 10)
 println(ridgeRegression)
 println(lassoRegression)
Логистическая регрессия
Sbt зависимость:
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.4.0" libraryDependencies += "org.apache.spark" %% "spark-mllib" % "2.4.0" % "runtime"
Пример логистической регрессии c применением spark.mllib.classification[13]:
 import org.apache.spark.mllib.classification.{LogisticRegressionModel, LogisticRegressionWithLBFGS}
 import org.apache.spark.mllib.evaluation.MulticlassMetrics
 import org.apache.spark.mllib.regression.LabeledPoint
 import org.apache.spark.mllib.util.MLUtils
val data = MLUtils.loadLibSVMFile(sc, "logisticRegresion.txt") val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L) val training = splits(0).cache() val test = splits(1) val model = new LogisticRegressionWithLBFGS() .setNumClasses(10) .run(training)
 val predictionAndLabels = test.map { case LabeledPoint(label, features) =>
   val prediction = model.predict(features)
   (prediction, label)
 }
 val metrics = new MulticlassMetrics(predictionAndLabels)
 val accuracy = metrics.accuracy
 println(accuracy)
Классификация при помощи MLP
Sbt зависимость:
libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2"
Пример классификации c применением smile.classification.mlp[14]:
 import smile.classification.NeuralNetwork.{ActivationFunction, ErrorFunction}
 import smile.data.{AttributeDataset, NumericAttribute}
 import smile.read
 import smile.classification.mlp
 import smile.plot.plot
 val data: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2)))
 val x: Array[Array[Double]] = data.x()
 val y: Array[Int] = data.y().map(_.toInt)
 val mlpModel = mlp(x, y, Array(2, 10, 2), ErrorFunction.LEAST_MEAN_SQUARES, ActivationFunction.LOGISTIC_SIGMOID)
 plot(x, y, mlpModel)
Рекуррентные нейронные сети
Пример кода, с использованием библиотеки DeepLearning.scala
   // Задание слоёв
   def tanh(x: INDArrayLayer): INDArrayLayer = {
     val exp_x = hyperparameters.exp(x)
     val exp_nx = hyperparameters.exp(-x)
     (exp_x - exp_nx) / (exp_x + exp_nx)
   }
   def charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): (DoubleLayer, INDArrayLayer, INDArrayLayer) = {
       val hnext = tanh(wxh.dot(x) + whh.dot(hprev) + bh)
       val yraw = why.dot(hnext) + by
       val yraw_exp = hyperparameters.exp(yraw)
       val prob = yraw_exp / yraw_exp.sum
       val loss = -hyperparameters.log((prob * y).sum)
       (loss, prob, hnext)
   }
   // Определение структуры
   val batches = data.zip(data.tail).grouped(seqLength).toVector
   type WithHiddenLayer[A] = (A, INDArrayLayer)
   type Batch = IndexedSeq[(Char, Char)]
   type Losses = Vector[Double]
   def singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer[DoubleLayer] = {
     batch match {
       case (batchseq, hprev) => batchseq.foldLeft((DoubleLayer(0.0.forward), hprev)) {
         (bstate: WithHiddenLayer[DoubleLayer], xy: (Char, Char)) =>
           (bstate, xy) match {
             case ((tot, localhprev), (x, y)) => {
               charRNN(oneOfK(x), oneOfK(y), localhprev) match {
                 case (localloss, _, localhnext) => {
                   (tot + localloss, localhnext)
                 }
               }
             }
           }
       }
     }
   }
   // Определение одного шага обучения
   def initH = INDArrayLayer(Nd4j.zeros(hiddenSize, 1).forward)
   def singleRound(initprevloss: Losses): Future[Losses] =
     (batches.foldLeftM((initprevloss, initH)) {
       (bstate: WithHiddenLayer[Losses], batch: Batch) =>
         bstate match {
           case (prevloss, hprev) => singleBatch(batch, hprev) match {
             case (bloss, hnext) => bloss.train.map {
               (blossval: Double) => {
                   val nloss = prevloss.last * 0.999 + blossval * 0.001
                   val loss_seq = prevloss :+ prevloss.last * 0.999 + blossval * 0.001
                   (loss_seq, hnext)
               }
             }
           }
         }
     }).map {
       (fstate: WithHiddenLayer[Losses]) =>
         fstate match {
           case (floss, _) => floss
         }
     }
   def allRounds: Future[Losses] = (0 until 2048).foldLeftM(Vector(-math.log(1.0 / vocabSize) * seqLength)) {
     (ploss: Losses, round: Int) => {
         singleRound(ploss)
     }
   }
   // Обучение сети
   def unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)
   val losses = unsafePerformFuture(allRounds)
Долгая краткосрочная память
Основная статья: Долгая краткосрочная память.
Пример реализации LSTM на основе DeepLearning4j[15] и ND4J[16]
Обработка естественного языка
Основная статья: Обработка естественного языка: Пример кода на языке Scala.
Метрический классификатор и метод ближайших соседей
Основная статья: Метрический классификатор и метод ближайших соседей: Пример на языке Scala.
Метод опорных векторов
Основная статья: Метод опорных векторов (SVM)[на 28.01.19 не создан].
SBT зависимость:
libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2"
Пример классификации датасета и вычисления F1 меры[17] используя smile.classification.svm[18]:
import smile.classification._ import smile.data._ import smile.plot._ import smile.read import smile.validation.FMeasure
 val iris: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2)))
 val x: Array[Array[Double]] = iris.x()
 val y: Array[Int] = iris.y().map(_.toInt)
 val SVM = svm(x, y, new GaussianKernel(8.0), 100)
 val predictions: Array[Int] = x.map(SVM.predict)
 val f1Score = new FMeasure().measure(predictions, y)
 plot(x, y, SVM)
Дерево решений и случайный лес
Основная статья: Дерево решений и случайный лес: Пример на языке Scala.
Байесовская классификация
Основная статья: Байесовская классификация.
SBT зависимость:
libraryDependencies += "com.tsukaby" %% "naive-bayes-classifier-scala" % "0.2.0"
Пример классификации используя smile.classification.cart[19]:
// Создание модели val bayes = new BayesClassifier[String, String]() // Задание соотвествия категория - слово bayes.learn("technology", "github" :: "git" :: "tech" :: "technology" :: Nil) bayes.learn("weather", "sun" :: "rain" :: "cloud" :: "weather" :: "snow" :: Nil) bayes.learn("government", "ballot" :: "winner" :: "party" :: "money" :: "candidate" :: Nil) // Тестовые примеры val unknownText1 = "I use git".split(" ") val unknownText2 = "Today's weather is snow".split(" ") val unknownText3 = "I will vote for that party".split(" ") // Классификация println(bayes.classify(unknownText1).map(_.category).getOrElse("")) // technology println(bayes.classify(unknownText2).map(_.category).getOrElse("")) // weather println(bayes.classify(unknownText3).map(_.category).getOrElse("")) // government
EM-алгоритм
Основная статья: EM-алгоритм[на 28.01.19 не создан].
SBT зависимость:
libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2"
Пример классификации используя smile.clustering.kmeans[20]:
import smile.clustering._ import smile.data._ import smile.plot._ import smile.read
 val iris: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2)))
 val x: Array[Array[Double]] = iris.x()
 val kMeans: KMeans = kmeans(x, k = 6, maxIter = 1000)
 val y = kMeans.getClusterLabel
 plot(x, y, '.', Palette.COLORS)
Бустинг, AdaBoost
Основная статья: Бустинг, AdaBoost: Пример на языке Scala.
Уменьшение размерности
Основная статья: Уменьшение размерности: Пример на языке Scala.
Примечания
- ↑ Breeze
- ↑ MATLAB, structures
- ↑ ;NumPy wiki
- ↑ ScalaNLP, Epic
- ↑ Smile, Statistical Machine Intelligence and Learning Engine
- ↑ scikit-learn
- ↑ Apache Spark MLlib
- ↑ Apache Spark
- ↑ DeppLearning.scala
- ↑ Глубокое обучение
- ↑ Spark, LinearRegression
- ↑ Smile, Regression
- ↑ Spark, Logistic Regression
- ↑ Smile, MLP
- ↑ DeepLearning4j
- ↑ ND4J
- ↑ F1 мера
- ↑ Smile, SVM
- ↑ Naive bayes classifier, Scala
- ↑ Smile, K-Means
