Примеры кода на Scala — различия между версиями
(→Примеры кода) |
(→Примеры кода) |
||
Строка 16: | Строка 16: | ||
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(",")) | ||
Строка 40: | Строка 40: | ||
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) | ||
Строка 59: | Строка 59: | ||
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) | ||
Строка 86: | Строка 86: | ||
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(_. | + | '''val '''y: Array['''Int'''] = data.y().map(_.to'''Int''') |
− | 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) | ||
Строка 103: | Строка 103: | ||
Пример кода, с использованием билиотеки DeepLearning.scala | Пример кода, с использованием билиотеки DeepLearning.scala | ||
// Задание слоёв | // Задание слоёв | ||
− | 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): ( | + | '''def '''charRNN(x: INDArray, y: INDArray, hprev: INDArrayLayer): ('''Double'''Layer, 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) | ||
} | } | ||
// Определение структуры | // Определение структуры | ||
− | 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[ | + | '''def '''singleBatch(batch: WithHiddenLayer[Batch]): WithHiddenLayer['''Double'''Layer] = { |
− | batch match { | + | batch '''match '''{ |
− | case (batchseq, hprev) => batchseq.foldLeft(( | + | '''case '''(batchseq, hprev) => batchseq.foldLeft(('''Double'''Layer(0.0.forward), hprev)) { |
− | (bstate: WithHiddenLayer[ | + | (bstate: WithHiddenLayer['''Double'''Layer], 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) | ||
} | } | ||
Строка 140: | Строка 140: | ||
// Определение одного шага обучения | // Определение одного шага обучения | ||
− | 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 + | + | '''val '''nloss = prevloss.last * 0.999 + bloss'''val '''* 0.001 |
− | val loss_seq = prevloss :+ prevloss.last * 0.999 + | + | '''val '''loss_seq = prevloss :+ prevloss.last * 0.999 + bloss'''val '''* 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) | ||
} | } | ||
Строка 168: | Строка 168: | ||
// Обучение сети | // Обучение сети | ||
− | 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) |
===Долгая краткосрочная память=== | ===Долгая краткосрочная память=== | ||
Строка 187: | Строка 187: | ||
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(_. | + | '''val '''y: Array['''Int'''] = iris.y().map(_.to'''Int''') |
− | 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) | ||
===Дерево решений и случайный лес=== | ===Дерево решений и случайный лес=== | ||
Строка 209: | Строка 209: | ||
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>: | ||
− | + | // Создание модели | |
− | val bayes = new BayesClassifier[String, String]() | + | '''val '''bayes = '''new '''BayesClassifier[String, String]() |
// Задание соотвествия категория - слово | // Задание соотвествия категория - слово | ||
bayes.learn("technology", "github" :: "git" :: "tech" :: "technology" :: Nil) | bayes.learn("technology", "github" :: "git" :: "tech" :: "technology" :: Nil) | ||
Строка 216: | Строка 216: | ||
bayes.learn("government", "ballot" :: "winner" :: "party" :: "money" :: "candidate" :: Nil) | bayes.learn("government", "ballot" :: "winner" :: "party" :: "money" :: "candidate" :: Nil) | ||
// Тестовые примеры | // Тестовые примеры | ||
− | 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(" ") |
// Классификация | // Классификация | ||
println(bayes.classify(unknownText1).map(_.category).getOrElse("")) // technology | println(bayes.classify(unknownText1).map(_.category).getOrElse("")) // technology | ||
Строка 230: | Строка 230: | ||
libraryDependencies '''+=''' "com.github.haifengl" '''%%''' "smile-scala" '''%''' "1.5.2" | 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) | ||
Версия 11:10, 22 января 2019
Содержание
- 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]. Позволяет создавать динамические нейронные сети, давая возможность параллельных вычеслений.
Примеры кода
Линейная регрессия
Основная статья: Линейная регрессия[на 5.01.19 не создан]
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)
Вариации регрессии
Основная статья: Вариации регрессии[на 5.01.19 не создан]
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)
Логистическая регрессия
Основная статья: Логистическая регрессия[на 5.01.19 не создан]
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)
Рекуррентные нейронные сети
Основная статья: Рекуррентные нейронные сети[на 5.01.19 не создан]
Пример кода, с использованием билиотеки 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)
Долгая краткосрочная память
Освновная статья: Долгая краткосрочная память[на 15.01.19 не создан].
Пример реализации LSTM на основе DeepLearning4j[15] и ND4J[16]
Обработка естественного языка
Основная статья: Обработка естественного языка: Пример кода на языке Scala.
Метрический классификатор и метод ближайших соседей
Освновная статья: Метрический классификатор и метод ближайших соседей: Пример реализации на языке Scala.
Метод опорных векторов
Освновная статья: Метод опорных векторов[на 15.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.
Байесовская классификация
Освновная статья: Байесовская классификация[на 7.01.19 не создан].
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-алгоритм[на 7.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