Подтвердить что ты не робот

Поддержка векторной машины для Java?

Я хотел бы написать "умный монитор" на Java, который отправляет предупреждение в любое время, когда обнаруживает возникающие проблемы с производительностью. Приложение My Java записывает данные в структурированный формат в файл журнала:

<datetime> | <java-method> | <seconds-to-execute>

Итак, например, если у меня был метод Widget#doSomething(String), который выполнял 812ms для выполнения, он записывался бы как:

2013-03-24 11:39:21 | Widget#doSomething(String) | 812

По мере того, как производительность начинает ухудшаться (например, во время основной коллекции, во время пиковых нагрузок или если система просто замедляется до обхода), время выполнения метода начинает замедляться; поэтому в самом правом столбце начинают появляться огромные числа (иногда 20-40 секунд для выполнения одного метода).

В колледже - для упражнений по обучению машинам - я написал то, что мой профессор назвал линейным дихотомизатором, который взял простые тестовые данные (рост, вес и пол человека) и "научил", как классифицировать человека как мужчину или женщину исходя из их высоты/веса. Затем, когда у него были все данные по обучению, мы подали ему новые данные, чтобы узнать, насколько точно он может определить пол.

Я думаю, что многомерная версия линейного дихотомизатора называется векторной машиной поддержки (SVM). Если я ошибаюсь, пожалуйста, уточните, и я изменю заголовок моего вопроса на что-то более подходящее. Независимо, мне нужно это приложение, чтобы сделать следующее:

  • Запуск в "тестовом режиме", когда я передаю его структурированный файл журнала из моего основного приложения Java (тот, который я хочу отслеживать), и он берет каждую запись в журнале (как показано выше) и использует ее для тестовых данных
    • В качестве входных/тестовых данных важны только столбцы java-method и seconds-to-execute; Меня не волнует datetime
  • Запуск в "режиме монитора", где он активно считывает новые данные журнала из файла журнала и использует аналогичные методы "машинного обучения", чтобы определить, наступает ли ухудшение производительности.

Важно отметить, что столбец seconds-to-execute не является единственным важным фактором здесь, поскольку я видел ужасные тайминги для определенных методов в периоды огромной производительности и действительно отличные тайминги для других методов в моменты, когда сервер казался как будто он собирался умереть и толкнуть маргаритки. Поэтому очевидно, что определенные методы "взвешены" /важнее производительности, чем другие.

Мой вопрос

  • Googling для "линейного дихотомизера" или "машины поддержки векторов" превращает некоторые действительно страшные, высокоученые, ультра-мозговые белые бумаги, которые я просто не имею, чтобы потреблять психическую энергию (или время) - если они действительно мои варианты; поэтому я прошу, чтобы было введение мирян в этот материал или отличный сайт/статья/учебник по созданию такой системы в Java?
  • Есть ли твердые/стабильные библиотеки Java с открытым исходным кодом? Я смог найти jlibsvm и svmlearn, но первый из них выглядит чистым бета-состояние, и последнее, похоже, поддерживает только двоичные решения (например, мой старый линейный дихотомизатор). Я знаю там Mahout, но это сидит на вершине Hadoop, и я не думаю, что у меня достаточно данных, чтобы гарантировать время и умственную энергию в настройку моего собственного кластера Hadoop.

Спасибо заранее!

4b9b3361

Ответ 1

"Умный монитор", который вы описываете, - это точно классификация временных рядов.

Существует много алгоритмов классификации. Все они в основном берут матрицу, где строки представляют собой наблюдения, а столбцы - это "функции", которые каким-то образом описывают наблюдение, и вектор метки строк длины, который оценивается либо 0, либо 1. В вашей проблеме наблюдение может быть небольшим образцом, и ваш вектор метки будет оценен 1 для периодов времени, в которых возникают проблемы с производительностью, и 0 в противном случае.

В этом определении подразумевается необходимость пересэмпирования ваших данных (с использованием режима/медианного/среднего значения, если необходимо), так что каждое наблюдение определяется равномерно, например, секунды или минуты или часы.

Генерирующие функции - важная часть. Вероятно, я начинал с двух функций: необработанных значений и (один раз) отличающихся значений между наблюдениями x_i и x_i-1. Мы определим их для отставания 2. Технически это 4 функции. Каждая функция не может смотреть в будущее. Каждая функция должна представлять одно и то же для каждого наблюдения.

Например, рассмотрим временные ряды длины 10:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Если мы хотим создать набор функций, используя запаздывание в два интервала в прошлом, то первые два элемента временных рядов считаются сгоревшим образцом. Мы не можем использовать связанные с ними наблюдения для обучения алгоритму.

необработанные значения из 8 строк по 2 столбца будут

[[ 1.,  0.]
 [ 2.,  1.],
 [ 3.,  2.],
 [ 4.,  3.],
 [ 5.,  4.],
 [ 6.,  5.],
 [ 7.,  6.],
 [ 8.,  7.]]

отличающиеся значения

[[ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.]])

Они получают столбец столбцов. Есть много дополнительных возможностей, которые вы могли бы изучить. Подвижной показатель будет моим следующим выбором.

Если вы хотите в будущем предсказать, то ваши данные обучения должны отставать от вашего вектора ярлыков.

Если производительность не является удовлетворительной, попробуйте добавить дополнительные функции, выбирая среднее значение для большего окна или добавив еще больше в будущем. Умный трюк для улучшения производительности алгоритмов временных рядов заключается в том, чтобы включить значение предсказания для предыдущего временного интервала.

Установите свой классификатор на раннюю часть данных, затем соблюдайте его точность над более поздней частью данных. Существует множество показателей для классификаторов, которые вы можете использовать. Если вы решите использовать классификатор, который выводит вероятности вместо жесткого 1/0, ваши варианты даже расширяются. (Как и использование вашего классификатора.)

Прецизионность и отзыв - это интуитивные показатели производительности классификаторов.

Поезд на первой (ранней) половине ваших данных и теста во второй половине (позже).

Что касается алгоритмов, я бы посмотрел на логистическую регрессию. Я смотрю только в другом месте, если производительность не является удовлетворительной, и вы исчерпали варианты извлечения функций.

Mallet представляется хорошей библиотекой для этой задачи. См. этот бит документов.

Недавно я обнаружил JSAT, который выглядит многообещающим.

Существуют более конкретные подходы к классификации временных рядов, которые явно учитывают последовательный характер наблюдений и меток. Это универсальная адаптация классификации к временным рядам.

Ответ 2

Если вы заинтересованы в использовании машин векторной поддержки, там есть руководство, которое очень ориентировано на новичков, и вы можете найти полезное (http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf)

Это руководство относится к тем же парням libsvm, которые являются очень зрелой библиотекой для поддерживающих векторных машин (http://www.csie.ntu.edu.tw/~cjlin/libsvm/), и у них есть привязка для Java (http://www.csie.ntu.edu.tw/~cjlin/libsvm/#java)

Ответ 3

Weka - популярный пакет для машинного обучения/интеллектуального анализа данных на Java. Эта книга http://guidetodatamining.com/ может быть полезна. На самом деле это не касается SVM, но, безусловно, имеет хорошие алгоритмы классификации, и это, конечно, вовсе не эзотерика.

Ответ 4

Возможно Apache Spark MLlib поможет вам:

Линейный СВМ является стандартным методом для крупномасштабной классификации задания. Это линейный метод, как описано выше в уравнении (1), с функция потерь в формулировке, заданной потерей шарнира:

л (ш, х, у):. = Тах {0,1-ywTx}

По умолчанию линейные SVM обучаются с регуляцией L2. Мы также поддержка альтернативной L1-регуляризации. В этом случае проблема становится линейной программой.

В линейном алгоритме SVM выводится модель SVM. Учитывая новые данные точка, обозначаемая x, модель делает прогнозы, основанные на значении WTX. По умолчанию, если wTx≥0, результат будет положительным, и отрицательный в противном случае.