Как использовать LibSVM в Java?

Я пытаюсь внедрить систему отслеживания внутреннего местоположения с помощью ключей bluetooth. Идея состоит в том, чтобы прогуляться с устройством Android и рассчитать свое местоположение в комнате на основе сильных сторон сигналов Bluetooth-донглов, размещенных по комнате. Для этого я решил использовать машинное обучение для приближения, насколько это возможно, RSSI как расстояния, например, метров. Мне сказал преподаватель в моем колледже, что LibSVM – это то, что я ищу, поэтому я читал кое-что. Я посмотрел на этот учебник и, похоже, не мог разглядеть данные, необходимые для обучения системы. Данные, которые у меня будут:

  • Местоположения каждого ключа (вместе с адресом mac), сохраненные в базе данных, координаты x и y
  • Индикатор силы принятого сигнала (RSSI) ключей, ближайших к моему устройству Android
  • Адреса mac будут использоваться для запроса базы данных для определенных ключей

Я понимаю, что данные должны быть в формате SVM, но я немного не уверен, что это должно быть с точки зрения входных данных и выходных данных. Пример ниже, взятый из урока, который я упомянул, показывает, что человек – класс, а женщина – класс. Так в моем случае у меня будет только один класс «ключ»? И должны ли все ключи значений отражать значения, которые я сохранил в моей базе данных?

Парень голос: низкая фигура: большой доход: хорошо

Женщина голос: высокая фигура: slim доход: плата за проезд

  1. Преобразуйте значения функции в числовое представление. Предположим, что лучшая зарплата составит 5 и худшая зарплата 1 (или нет зарплаты = 0), то же самое с другими перечислимыми переменными.
  2. У нас есть 2 класса, мужчины и женщины. Преобразовать классы в числовые значения: man = 1, woman = -1
  3. Сохраните его в формате данных libsvm:

[Класс / цель] 1: [firstFeatureValue] 2: [secondFeatureValue] и т. Д. Например: женщины с большой зарплатой, низким голосом и маленькой цифрой будут закодированы следующим образом: -1 1: 5 2: 1,5 3: 1.8

В общем случае формат входного файла SVM

[Этикетка] [индекс1]: [value1] [указатель2]: [value2] … [этикетка] [индекс1]: [value1] [указатель2]: [value2] …

Может ли кто-нибудь дать мне пример того, к чему я должен стремиться?

Это все совершенно новое для меня, поэтому любые полезные советы или подсказки, чтобы заставить меня идти, было бы здорово. заранее спасибо

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

Во-первых, чтобы определить ваше местоположение, выполняете ли вы отпечатки пальцев или трилатерацию сигнальной силы (которые люди ошибочно называют триангуляцией)? Trilateration – это процесс пересечения нескольких сфер, чтобы найти место в пространстве. С другой стороны, отпечаток пальца – это проблема классификации, которая решает сигналы в месте, где не вычислены фактические расстояния.

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

Фингерпринт – это просто проблема классификации. Подобно трилатерации, он делает предположение, что расположение ключей не меняется. Однако, в отличие от трилатерации, он вообще не использует дистанции.

Преимущество Trilateration состоит в том, что, считая, что оценки расстояния правильны (чего на самом деле трудно достичь), вы сможете разрешить свое местоположение в непрерывном (недискретном) диапазоне. Поскольку отпечаток пальца является проблемой классификации, он должен классифицировать один из фиксированных наборов дискретных местоположений; Например, если ваши радиостанции Bluetooth расположены по периметру комнаты, вы можете в конечном итоге дискретизировать интерьер комнаты в одном из 3×3 возможных мест.

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

MAC_1:-87, MAC_2:-40, MAC_3:-91, class=location_A MAC_1:-31, MAC_2:-90, MAC_3:-79, class=location_B 

Где для каждого места в комнате вы читаете RSSI со всех доступных Bluetooth-радиостанций, которые вы можете почувствовать. Вы должны взять не менее 10 показаний для каждого места. Для Wi-Fi значения RSSI являются целыми числами в единицах децибел в диапазоне от -100 до -1 (где, например, -20 дБ означает, что вы действительно близко к радио).

Теперь, когда вы пытаетесь выполнить классификацию, вы будете читать:

 MAC_1:-89, MAC_2:-71, MAC_3:-22, class=? 

Проблема состоит в том, чтобы классифицировать эти показания RSSI в одном из местоположений.

В моей предыдущей работе я использовал классификатор Naive Bayes, а не SVM, потому что Naive Bayes легко пропускает недостающие функции (позволяя вам дать небольшую массу вероятности отсутствующей функции). Кроме того, в Naive Bayes я использовал функцию Gaussian PDF для вычисления вероятности вероятности P (location | MAC_i = RSSI_i), поскольку все значения RSSI являются числами.

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

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

Одним из параметров libsvm является svm_type, так как проблема является проблемой регрессии, вы должны использовать опцию 3 – epsilon-SVR

Для типа ядра я бы предложил рассмотреть RBF (опция 2 – радиальная базовая функция)

Что касается ваших данных, это возможная договоренность:

 | dongle 1 | dongle 2 | dongle 3 | desired output | x | y | RSSI | x | y | RSSI | x | y | RSSI | --------------------------------------------------------------------------------- | 10.0 | 11.1 | 2.3 | 0.0 | 1.1 | 0.3 | 17.0 | 19.1 | 0.3 | 10.3 | 30.0 | 17.1 | 0.3 | 10.0 | 1.1 | 0.9 | 11.0 | 9.1 | 0.2 | 18.7 

Так что это переводится (привязки просто для ясности):

 [10.3] [1]:[10.0] [2]:[11.1] [3]:[2.3] [4]:[0.0] [5]:[1.1] [6]:[0.3] [7]:[17.0] [8]:[19.1] [9]:[0.3] [18.7] [1]:[30.0] [2]:[17.1] [3]:[0.3] [4]:[10.0] [5]:[1.1] [6]:[0.9] [7]:[11.0] [8]:[9.1] [9]:[0.2] 

Всегда желательно масштабировать данные между [-1, 1] или [0, 1]. Кроме того, вы можете найти некоторые примеры данных здесь: http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/regression.html

Надеюсь это поможет

Я не думаю, что вы можете использовать SVM для того, чтобы делать то, что вы говорите (рассчитать свое местоположение в комнате …). SVM – это алгоритм с двоичной классификацией под контролем. То есть, если вы дадите ему некоторые данные и некоторые положительные / отрицательные классы, он изучит классификатор, который может сказать вам, являются ли новые, ненаблюдаемые точки данных положительными или отрицательными. Следовательно, вы можете обучить СВМ, чтобы рассказать вам, находится ли человек на одной стороне комнаты по сравнению с другой (южная сторона / северная сторона), но не их фактическое местоположение.

Кажется, что то, что вы хотите сделать, вовсе не требует машинного обучения. См. Следующие сообщения:

EDIT: Учитывая ваши разъяснения, я бы рекомендовал использовать регрессию k-ближайших соседей . SVM определенно не подходит для того, что вы хотите сделать; Даже при использовании SVM для регрессии он работает только в одном измерении.

То, что вы хотите сделать, – взять как можно больше данных (data = RSSI, label = distance) и внедрить их в метрическое пространство, возможно, в размерном количестве доступных вам ключей. Затем, учитывая некоторые новые данные (сильные сигналы RSSI), найдите ближайших соседей в пространстве и вычислите какое-то среднее значение на расстояниях.

Intereting Posts
Android NDK: как очистить собственный код после перезапуска активности? Android listview с Glide – удвоенными растровыми изображениями после загрузки Как перезапустить службу после получения Killed приложениями, такими как «Advanced Task Killer»? Напишите дополнительный класс Parcelable для другого участка Зачем использовать TOTP / HOTP вместо использования math.random ()? Совместное использование пользовательского AccountAuthenticator между приложениями Используйте специальный символ (<,>) в дизайне макета в Android Интеграция входа в Google OpenID Как Google достигает анимированных сообщений в своем приложении G +? GCM не получает сообщение ниже Android 4 GetLayoutInflater внутри пользовательского simpleCursorAdapter Android – удаление активности из вкуса Как обращаться с автономной базой данных firebase, когда приложение Android отключено? Фрагмент: неизвестное имя анимационного объекта objectanimator Получение представления, которое получает все события касания