Примеры кода на Scala — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показано 58 промежуточных версий 11 участников)
Строка 1: Строка 1:
Раздел в разработке
+
[[File:scala_logo.png|auto|thumb|Scala: https://www.scala-lang.org/]]
[<span style="color:#faecc8">WIP</span>]
 
  
 
==Популярные библиотеки==
 
==Популярные библиотеки==
* 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>. Позволяет создавать динамические нейронные сети, давая возможность параллельных вычеслений.
  
 
==Примеры кода==
 
==Примеры кода==
===KNN===
+
===Линейная регрессия===
SBT зависимость:
+
{{main|Линейная регрессия|l1=Линейная регрессия<sup>[на 28.01.19 не создан]</sup>}}
  libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2"
 
Пример классификации датасета и вычисления F1 меры<ref>[https://en.wikipedia.org/wiki/F1_score F1 мера]</ref> используя smile.classification.knn<ref>[https://haifengl.github.io/smile/classification.html#knn Smile, KNN]</ref>:
 
  import smile.classification._
 
  import smile.data._
 
  import smile.plot._
 
  import smile.read
 
  import smile.validation.FMeasure
 
  
  val toy: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2)))
 
  val x: Array[Array[Double]] = toy.x()
 
  val y: Array[Int] = toy.y().map(_.toInt)
 
  val KNN: KNN[Array[Double]] = knn(x, y, 3)
 
  val predictions: Array[Int] = x.map(KNN.predict)
 
  val f1Score = new FMeasure().measure(predictions, y)
 
  plot(x, y, KNN)
 
===Линейная регрессия===
 
 
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(","))
Строка 48: Строка 32:
 
   println(trainingSummary.rootMeanSquaredError)
 
   println(trainingSummary.rootMeanSquaredError)
 
   println(trainingSummary.r2)
 
   println(trainingSummary.r2)
 +
 
===Вариации регрессии===
 
===Вариации регрессии===
 +
{{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===
 +
{{main|Нейронные сети, перцептрон}}
 +
 +
Sbt зависимость:
 +
  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>:
 +
  '''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)
 +
 +
===Рекуррентные нейронные сети===
 +
{{main|Рекуррентные нейронные сети}}
 +
 +
Пример кода, с использованием библиотеки DeepLearning.scala
 +
    <span style="color:#3D9970>// Задание слоёв</span>
 +
    '''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)
 +
    }
 +
 +
    <span style="color:#3D9970>// Определение структуры</span>
 +
    '''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)
 +
                  }
 +
                }
 +
              }
 +
            }
 +
        }
 +
      }
 +
    }
 +
 +
    <span style="color:#3D9970>// Определение одного шага обучения</span>
 +
    '''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)
 +
      }
 +
    }
 +
 +
    <span style="color:#3D9970>// Обучение сети</span>
 +
    '''def '''unsafePerformFuture[A](f: Future[A]): A = Await.result(f.toScalaFuture, Duration.Inf)
 +
    '''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>
 +
 +
===Обработка естественного языка===
 +
Основная статья: [[Обработка естественного языка#Пример кода на языке Scala | Обработка естественного языка: Пример кода на языке Scala]].
 +
 +
===Метрический классификатор и метод ближайших соседей===
 +
Основная статья: [[Метрический классификатор и метод ближайших соседей#Пример на языке Scala | Метрический классификатор и метод ближайших соседей: Пример на языке Scala]].
 +
 +
===Метод опорных векторов===
 +
Основная статья: [[Метод опорных векторов (SVM)]]<sup>[на 28.01.19 не создан]</sup>.
 +
 +
SBT зависимость:
 +
  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>:
 +
  '''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 | Дерево решений и случайный лес: Пример на языке Scala]].
 +
 +
===Байесовская классификация===
 +
Основная статья: [[Байесовская классификация]].
 +
 +
SBT зависимость:
 +
  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>:
 +
  <span style="color:#3D9970>// Создание модели</span>
 +
  '''val '''bayes = '''new '''BayesClassifier[String, String]()
 +
  <span style="color:#3D9970>// Задание соотвествия категория - слово</span>
 +
  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)
 +
  <span style="color:#3D9970>// Тестовые примеры</span>
 +
  '''val '''unknownText1 = "I use git".split(" ")
 +
  '''val '''unknownText2 = "Today's weather is snow".split(" ")
 +
  '''val '''unknownText3 = "I will vote '''for '''that party".split(" ")
 +
  <span style="color:#3D9970>// Классификация</span>
 +
  println(bayes.classify(unknownText1).map(_.category).getOrElse("")) <span style="color:#3D9970>// technology</span>
 +
  println(bayes.classify(unknownText2).map(_.category).getOrElse("")) <span style="color:#3D9970>// weather</span>
 +
  println(bayes.classify(unknownText3).map(_.category).getOrElse("")) <span style="color:#3D9970>// government</span>
 +
 +
===EM-алгоритм===
 +
Основная статья: [[EM-алгоритм]]<sup>[на 28.01.19 не создан]</sup>.
 +
 +
SBT зависимость:
 +
  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>:
 +
  '''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 | Бустинг, AdaBoost: Пример на языке Scala]].
 +
 +
===Уменьшение размерности===
 +
Основная статья: [[Уменьшение размерности#Пример на языке Scala | Уменьшение размерности: Пример на языке Scala]].
  
 
== Примечания ==
 
== Примечания ==
 
<references/>
 
<references/>
 +
[[Категория: Машинное обучение]] [[Категория: Примеры кода]]

Текущая версия на 19:30, 4 сентября 2022

Популярные библиотеки

  • 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.

Примечания