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

Материал из Викиконспекты
Перейти к: навигация, поиск
 
(не показано 8 промежуточных версий 2 участников)
Строка 1: Строка 1:
 
[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]
 
[[File:Java.jpeg|auto|thumb|Java: https://www.oracle.com/java/]]
 
==Популярные библиотеки==
 
==Популярные библиотеки==
* <code>Weka</code><ref>[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]</ref> {{---}} популярная библиотека, написанная на языке <code>Java</code> и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др.
+
* <code>Weka</code><ref>[https://www.cs.waikato.ac.nz/~ml/weka/ Weka]</ref> {{---}} популярная библиотека, написанная на языке <code>Java</code> и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др. Основные возможности <code>Weka</code> можно сгруппировать в 3 категории: инструменты пре-процессинга данных, алгоритмы машинного обучения и инструменты оценки модели. Инструменты пре-процессинга в <code>Weka</code> называются фильтрами, <code>Weka</code> содержит фильтры для дискретиации, нормализации, уменьшения размерности, трансформации и комбинирования признаков. <code>Weka Machine Learning Toolkit</code> содержит алгоритмы классификации, регрессии, кластеризации. Реализованы следующие алгоритмы обучения: деревья решений, метод опорных векторов, <code>MLP</code>, логистическая регрессия, Байесовские сети, и др., мета-алгоритмы включают в себя: бэггинг, [[Бустинг, AdaBoost|бустинг]], стекинг, алгоритмы выбора признаков: [[Метод главных компонент (PCA)| PCA]]<sup>[на 28.01.19 не создан]</sup>, фильтрующие методы, основанные на information gain, коэффициенте корреляции Пирсона и <code>OneR</code> классификаторе.
 
* <code>Smile</code><ref>[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]</ref> {{---}} <code>Java</code> фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. <code>Smile</code> покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.
 
* <code>Smile</code><ref>[https://haifengl.github.io/smile/ Smile, Statistical Machine Intelligence and Learning Engine]</ref> {{---}} <code>Java</code> фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. <code>Smile</code> покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.
 
* <code>deeplearning4j</code><ref>[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning & linear algebra for Java/Scala with GPUs + Spark]</ref> {{---}} <code>Java</code> библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.
 
* <code>deeplearning4j</code><ref>[https://github.com/deeplearning4j/deeplearning4j deeplearning4j, deep learning & linear algebra for Java/Scala with GPUs + Spark]</ref> {{---}} <code>Java</code> библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.
 +
==Основные особенности использования Java для задач машинного обучения==
 +
В отличие от <code>Python</code>, <code>Java</code> не обладает столь обширной экосистемой, ориентированной на решение задач машинного обучения и анализа данных. Большинство имеющихся инструментов являются узко специализированными (по сравнению, например, с <code>scikit-learn</code><ref>[https://scikit-learn.org/stable/ Библиотека scikit-learn]</ref>) и хуже документированы. Ввиду более низкой популярности языка в сфере <code>ML</code> большинство онлайн курсов и обучающих материалов ориентированы на <code>Python</code>. Однако, несмотря на вышеперечисленные факторы, <code>Java</code> остается
 +
популярной альтернативой, особенно при необходимости интеграции с существующими <code>JVM</code> проектами. Также к достоинствам <code>Java</code> можно отнести статическую типизацию (и как следствие уменьшенную вероятность ошибок времени исполнения) и заметно более развитую поддержку в IDE.
 
==Примеры кода==
 
==Примеры кода==
 
Для работы с приведенными ниже примерами необходим <code>JDK</code> версии не ниже 10 и система сборки <code>Maven</code>.<br>
 
Для работы с приведенными ниже примерами необходим <code>JDK</code> версии не ниже 10 и система сборки <code>Maven</code>.<br>
Строка 13: Строка 16:
 
{{main|Вариации регрессии}}
 
{{main|Вариации регрессии}}
 
====Линейная регрессия====
 
====Линейная регрессия====
{{main|Линейная регрессия}}
+
{{main|Линейная регрессия#Пример на языке Java}}
Пример линейной регресии с применением <code>weka.classifiers.functions.LinearRegression</code><ref>[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/LinearRegression.html/ Weka, Linear Regression]</ref>
 
  
  <dependency>
 
    <groupId>nz.ac.waikato.cms.weka</groupId>
 
    <artifactId>weka-stable</artifactId>
 
    <version>3.8.0</version>
 
  </dependency>
 
 
  '''import''' weka.classifiers.functions.LinearRegression;
 
  '''import''' weka.core.Instance;
 
  '''import''' weka.core.Instances;
 
 
  <font color="green">//Load Data set</font>
 
  '''var''' data = new Instances(new BufferedReader(new FileReader("dataset/house.arff")));
 
  data.setClassIndex(data.numAttributes() - 1);
 
  <font color="green">//Build model</font>
 
  '''var''' model = new LinearRegression();
 
  '''try''' { model.buildClassifier(data); }
 
  '''catch''' (Exception e) { e.printStackTrace(); }
 
  <font color="green">//output model</font>
 
  System.out.printf("model parameters: %s%n", model);
 
  <font color="green">// Now Predicting the cost</font>
 
  '''var''' myHouse = data.lastInstance();
 
  '''var''' price  = model.classifyInstance(myHouse);
 
  System.out.printf("predicted price = %s%n", price)
 
 
====Логистическая регрессиия====
 
====Логистическая регрессиия====
{{main|Логистическая регрессия}}
+
{{main|Логистическая регрессия#Пример на языке Java}}
Пример линейной регрессии с применением <code>smile.classification.LogisticRegression</code><ref>[https://haifengl.github.io/smile/api/java/smile/classification/LogisticRegression/ Smile, Logistic Regression]</ref>
 
 
 
  <dependency>
 
    <groupId>com.github.haifengl</groupId>
 
    <artifactId>smile-core</artifactId>
 
    <version>1.5.2</version>
 
  </dependency>
 
 
 
  '''import''' smile.data.AttributeDataset;
 
  '''import''' smile.data.NominalAttribute;
 
  '''import''' smile.classification.LogisticRegression;
 
  '''import''' smile.data.parser.ArffParser;
 
 
 
  '''var''' arffParser = new ArffParser();
 
  arffParser.setResponseIndex(4);
 
  '''var''' iris  = arffParser.parse(smile.data.parser.IOUtils.getTestDataFile("weka/iris.arff"));
 
  '''var''' logClf = new LogisticRegression(iris.x(), iris.labels());
 
  logClf.predict(testX);
 
 
====Гребневая регрессия (ридж-регрессия)====
 
====Гребневая регрессия (ридж-регрессия)====
{{Main|Вариации регрессии#Гребневая регрессия (ридж-регрессия)}}
+
{{Main|Вариации регрессии#Пример на языке Java}}
 
 
Пример гребневой регрессии с применением <code>smile.regression.RidgeRegression</code><ref>[https://haifengl.github.io/smile/api/java/smile/regression/RidgeRegression.html/ Smile, Ridge Regression]</ref>
 
 
 
  <dependency>
 
    <groupId>com.github.haifengl</groupId>
 
    <artifactId>smile-core</artifactId>
 
    <version>1.5.2</version>
 
  </dependency>
 
 
 
  '''import''' smile.data.NominalAttribute;
 
  '''import''' smile.data.parser.DelimitedTextParser;
 
  '''import''' smile.regression.RidgeRegression;
 
 
 
  '''var''' parser = new DelimitedTextParser();
 
  parser.setDelimiter(", ");
 
  parser.setResponseIndex(new NominalAttribute("class"), 0);
 
  '''var''' dataset  = parser.parse("dataset.csv");
 
  '''var''' lambda  = 0.0057d;
 
  '''var''' ridgeClf = new RidgeRegression(dataset.x(), dataset.y(), lambda);
 
  ridgeClf.predict(testX);
 
 
====Лассо-регрессия====
 
====Лассо-регрессия====
{{Main|Вариации регрессии#Лассо-регрессия}}
+
{{Main|Вариации регрессии#Пример на языке Java_2}}
 
 
Пример Лассо-регрессии с применением <code>smile.regression.LASSO</code><ref>[https://haifengl.github.io/smile/api/java/smile/regression/LASSO.html/ Smile, LASSO regression]</ref>
 
 
 
  <dependency>
 
    <groupId>com.github.haifengl</groupId>
 
    <artifactId>smile-core</artifactId>
 
    <version>1.5.2</version>
 
  </dependency>
 
 
 
  '''import''' smile.data.NominalAttribute;
 
  '''import''' smile.data.parser.DelimitedTextParser;
 
  '''import''' smile.regression.LASSO;
 
 
 
  '''var''' parser = new DelimitedTextParser();
 
  parser.setDelimiter(", ");
 
  parser.setResponseIndex(new NominalAttribute("class"), 0);
 
  '''var''' dataset = parser.parse("dataset.csv");
 
  '''var''' lasso  = new LASSO(dataset.x(), dataset.y(), 10);
 
  lasso.predict(testX);
 
  
 
===Метрический классификатор и метод ближайших соседей===
 
===Метрический классификатор и метод ближайших соседей===
Строка 107: Строка 29:
  
 
===Классификация при помощи MLP===
 
===Классификация при помощи MLP===
{{main|Нейронные сети, перцептрон}}
+
{{main|Нейронные сети, перцептрон#Пример на языке Java}}
Пример классификации с применением <code>weka.classifiers.functions.MultilayerPerceptron</code><ref>[http://weka.sourceforge.net/doc.dev/weka/classifiers/functions/MultilayerPerceptron.html/ Weka, MLP]</ref>
 
 
 
  <dependency>
 
    <groupId>nz.ac.waikato.cms.weka</groupId>
 
    <artifactId>weka-stable</artifactId>
 
    <version>3.8.0</version>
 
  </dependency>
 
 
 
  '''import''' weka.classifiers.functions.MultilayerPerceptron;
 
  '''import''' weka.core.converters.CSVLoader;
 
  '''import''' java.io.File;
 
 
 
  <font color="green">// read train & test datasets and build MLP classifier</font>
 
  '''var''' trainds = new DataSource("etc/train.csv");
 
  '''var''' train  = trainds.getDataSet();
 
  train.setClassIndex(train.numAttributes() - 1);
 
  '''var''' testds = new DataSource("etc/test.csv");
 
  '''var''' test  = testds.getDataSet();
 
  test.setClassIndex(test.numAttributes() - 1);
 
  '''var''' mlp = new MultilayerPerceptron();
 
  mlp.buildClassifier(train);
 
  <font color="green">// Test the model</font>
 
  '''var''' eTest = new Evaluation(train);
 
  eTest.evaluateModel(mlp, test);
 
  <font color="green">// Print the result à la Weka explorer:</font>
 
  '''var''' strSummary = eTest.toSummaryString();
 
  System.out.println(strSummary);
 
 
 
 
===Рекуррентные нейронные сети===
 
===Рекуррентные нейронные сети===
{{Main|Рекуррентные нейронные сети}}
+
{{Main|Рекуррентные нейронные сети#Пример на языке Java}}
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/basic/BasicRNNExample.java Пример] простой рекуррентной нейронной сети, способной генерировать заданную строку по первому символу, с применением библиотеки <code>deeplearning4j</code>.
 
 
===Долгая краткосрочная память===
 
===Долгая краткосрочная память===
{{Main|Долгая краткосрочная память}}
+
{{Main|Долгая краткосрочная память#Пример на языке Java}}
[https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/recurrent/character/LSTMCharModellingExample.java Пример] реализации рекуррентной нейронной сети, использующей механизм LSTM и натренированной на текстах Шекспира, с применением библиотеки <code>deeplearning4j</code>.
 
 
===Метод опорных векторов===
 
===Метод опорных векторов===
{{main|Метод опорных векторов (SVM)}}
+
{{main|Метод опорных векторов (SVM)#Пример на языке Java}}
Пример классификации с применением <code>smile.classification.SVM</code><ref>[https://haifengl.github.io/smile/api/java/smile/classification/SVM.html/ Smile, SVM]</ref>
 
 
 
  <dependency>
 
    <groupId>com.github.haifengl</groupId>
 
    <artifactId>smile-core</artifactId>
 
    <version>1.5.2</version>
 
  </dependency>
 
 
 
  '''import''' smile.classification.SVM;
 
  '''import''' smile.data.NominalAttribute;
 
  '''import''' smile.data.parser.DelimitedTextParser;
 
  '''import''' smile.math.kernel.GaussianKernel;
 
  '''import''' java.util.Arrays;
 
 
 
  <font color="green">// read train & test dataset</font>
 
  '''var''' parser = new DelimitedTextParser();
 
  parser.setResponseIndex(new NominalAttribute("class"), 0);
 
  '''var''' train  = parser.parse("USPS Train", this.getClass().getResourceAsStream("/smile/data/usps/zip.train"));
 
  '''var''' test    = parser.parse("USPS Test", this.getClass().getResourceAsStream("/smile/data/usps/zip.test"));
 
  '''var''' classes = Arrays.stream(test.labels()).max().orElse(0) + 1;
 
  <font color="green">// build SVM classifier</font>
 
  '''var''' svm    = new SVM<>(new GaussianKernel(8.0), 5.0, classes, SVM.Multiclass.ONE_VS_ONE);
 
  svm.learn(train.x(), train.labels());
 
  svm.finish();
 
  <font color="green">// calculate test error rate</font>
 
  '''var''' error = 0;
 
  for (int i = 0; i < test.x().length; i++) {
 
  if (svm.predict(test.x()[i]) != test.labels()[i]) {
 
    error++;
 
    }
 
  }
 
  System.out.format("USPS error rate = %.2f%%\n", 100.0 * error / test.x().length);
 
 
 
 
===Деревья решений, случайный лес===
 
===Деревья решений, случайный лес===
 
{{Main|Дерево решений и случайный лес#Пример на языке Java}}
 
{{Main|Дерево решений и случайный лес#Пример на языке Java}}

Текущая версия на 12:27, 9 апреля 2019

Популярные библиотеки[править]

  • Weka[1] — популярная библиотека, написанная на языке Java и содержащая в себе множество алгоритмов машинного обучения для задач анализа данных. Предоставляет инструменты для решения задач классификации, кластеризации данных, регрессионного анализа и др. Основные возможности Weka можно сгруппировать в 3 категории: инструменты пре-процессинга данных, алгоритмы машинного обучения и инструменты оценки модели. Инструменты пре-процессинга в Weka называются фильтрами, Weka содержит фильтры для дискретиации, нормализации, уменьшения размерности, трансформации и комбинирования признаков. Weka Machine Learning Toolkit содержит алгоритмы классификации, регрессии, кластеризации. Реализованы следующие алгоритмы обучения: деревья решений, метод опорных векторов, MLP, логистическая регрессия, Байесовские сети, и др., мета-алгоритмы включают в себя: бэггинг, бустинг, стекинг, алгоритмы выбора признаков: PCA[на 28.01.19 не создан], фильтрующие методы, основанные на information gain, коэффициенте корреляции Пирсона и OneR классификаторе.
  • Smile[2]Java фреймворк для машинного обучения, анализа естественного языка, линейной алгебры и визуализации данных. Smile покрывает все основные аспекты машинного обучения и предоставляет высокопроизводительные алгоритмы и структуры данных.
  • deeplearning4j[3]Java библиотека для глубокого обучения, создания рекуррентых (в том числе распределенных) нейронных сетей.

Основные особенности использования Java для задач машинного обучения[править]

В отличие от Python, Java не обладает столь обширной экосистемой, ориентированной на решение задач машинного обучения и анализа данных. Большинство имеющихся инструментов являются узко специализированными (по сравнению, например, с scikit-learn[4]) и хуже документированы. Ввиду более низкой популярности языка в сфере ML большинство онлайн курсов и обучающих материалов ориентированы на Python. Однако, несмотря на вышеперечисленные факторы, Java остается популярной альтернативой, особенно при необходимости интеграции с существующими JVM проектами. Также к достоинствам Java можно отнести статическую типизацию (и как следствие уменьшенную вероятность ошибок времени исполнения) и заметно более развитую поддержку в IDE.

Примеры кода[править]

Для работы с приведенными ниже примерами необходим JDK версии не ниже 10 и система сборки Maven.
Каждый пример структурирован следующим образом:

  1. Maven зависимость на необходимые библиотеки
  2. Список необходимых import директив
  3. Код примера с комментариями

Вариации регрессии[править]

Основная статья: Вариации регрессии

Линейная регрессия[править]

Логистическая регрессиия[править]

Гребневая регрессия (ридж-регрессия)[править]

Лассо-регрессия[править]

Метрический классификатор и метод ближайших соседей[править]

Классификация при помощи MLP[править]

Рекуррентные нейронные сети[править]

Долгая краткосрочная память[править]

Метод опорных векторов[править]

Деревья решений, случайный лес[править]

Бустинг, Ada-boost[править]

EM-алгоритм[править]

Основная статья: EM-алгоритм

Пример кластеризации с применением weka.clusterers.EM[5]

 <dependency>
   <groupId>nz.ac.waikato.cms.weka</groupId>
   <artifactId>weka-stable</artifactId>
   <version>3.8.0</version>
 </dependency>
 import weka.clusterers.ClusterEvaluation;
 import weka.clusterers.EM;
 import weka.core.Instances;
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.util.Random;
 //load data
 var data = new Instances(new BufferedReader(new FileReader("data/bank-data.arff")));
 // new instance of clusterer
 var model = new EM();
 // build the clusterer
 model.buildClusterer(data);
 System.out.println(model);
 var logLikelihood = ClusterEvaluation.crossValidateModel(model, data, 10, new Random(1));

Уменьшение размерности[править]

Байесовская классификация[править]

См. также[править]

Примечания[править]