2014-01-22 6 views
-1

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

Я хочу знать, как мы должны обучать данные для SVM.

Что я делаю:

Думает, что у нас есть 5 документа (цифры просто пример), 3 из них в первой категории и других (2 из них) находятся на второй категории, я слить категории друг к другу (это означает, что 3 док, которые находятся в первой категории будут объединены в одном документе), после того, что я сделал массив поезд так:

double[][] train = new double[cat1.getDocument().getAttributes().size() + cat2.getDocument().getAttributes().size()][]; 

и я заполнит массив так:

int i = 0; 
    Iterator<String> iteraitor = cat1.getDocument().getAttributes().keySet().iterator(); 
    Iterator<String> iteraitor2 = cat2.getDocument().getAttributes().keySet().iterator(); 
    while (i < train.length) { 
     if (i < cat2.getDocument().getAttributes().size()) { 
      while (iteraitor2.hasNext()) { 
       String key = (String) iteraitor2.next(); 
       Long value = cat2.getDocument().getAttributes().get(key); 
       double[] vals = { 0, value }; 
       train[i] = vals; 
       i++; 
       System.out.println(vals[0] + "," + vals[1]); 
      } 
     } else { 
      while (iteraitor.hasNext()) { 
       String key = (String) iteraitor.next(); 
       Long value = cat1.getDocument().getAttributes().get(key); 
       double[] vals = { 1, value }; 
       train[i] = vals; 
       i++; 
       System.out.println(vals[0] + "," + vals[1]); 
      } 
      i++; 
     } 

поэтому я буду продолжать, как это, чтобы получить модель:

svm_problem prob = new svm_problem(); 
    int dataCount = train.length; 
    prob.y = new double[dataCount]; 
    prob.l = dataCount; 
    prob.x = new svm_node[dataCount][]; 

    for (int k = 0; k < dataCount; k++) { 
     double[] features = train[k]; 
     prob.x[k] = new svm_node[features.length - 1]; 
     for (int j = 1; j < features.length; j++) { 
      svm_node node = new svm_node(); 
      node.index = j; 
      node.value = features[j]; 
      prob.x[k][j - 1] = node; 
     } 
     prob.y[k] = features[0]; 
    } 
    svm_parameter param = new svm_parameter(); 
    param.probability = 1; 
    param.gamma = 0.5; 
    param.nu = 0.5; 
    param.C = 1; 
    param.svm_type = svm_parameter.C_SVC; 
    param.kernel_type = svm_parameter.LINEAR; 
    param.cache_size = 20000; 
    param.eps = 0.001; 
    svm_model model = svm.svm_train(prob, param); 

этот путь правильный? если нет, пожалуйста, помогите мне сделать это правдой.


этих два ответ верен: answer one, answer two,

ответ

2

Даже без проверки коды можно найти концептуальные ошибки:

думает, что у нас есть 5 документа, 3 из них находятся на первая категория и другие (2 из них) относятся ко второй категории, я объединяю категории друг с другом (это означает, что 3 документа, которые находятся в первой категории, будут объединены в один документ), после чего я сделал массив поезда, подобный этому

Итак:

  • обучение по 5 документов не будет давать какие-либо разумные эффекты, с любой моделью обучения машины ... это статистические модели, нет никаких разумных статистических данных в 5 точках R^n, где n ~ 10000
  • Вы не сливать что угодно. Такой подход может работать для Naive Bayes, которые на самом деле не рассматривают документы как «целые», а скорее как вероятностные зависимости между функциями и классами. В SVM каждый документ должен быть отдельно точка в пространстве R^n, где n может быть числом различных слов (для мешка слов/набора слов).
+0

спасибо @lejlot, номера только для описания, реальные числа больше, чем эти числа, а это значит, что я должен поместить каждый документ отдельно в мой массив поезда? если бы вы могли показать мне пример –

+0

Да, каждый документ является отдельным элементом. Есть ** milions ** примеры онлайн, прося код для такой вещи, показывает полное отсутствие участия. Нет никакой разницы между использованием SVM с документами и любыми другими типами данных. Используя векторию, вы переводите каждый из ваших документов на ** векторы **. После этого ** любой пример SVM будет работать. – lejlot

2

Проблема может быть, что вы не завершать каждый набор функций в учебном примере с индексом -1, который вы должны в соответствии с прочитанной мной ...

Т.е. если у вас есть один пример с двумя функциями, я думаю, вы должны:

Index[0]: 0 
Value[0]: 22 
Index[1]: 1 
Value[1]: 53 
Index[2]: -1 

Удачи!

+0

Прекращение действия «-1» не требуется афайну (если вы посмотрите на примерные наборы данных онлайн) ... – rzo

2

Использование SVM для классификации текста является общей задачей. Вы можете проверить работы Иоакима [1] в отношении классификации текста SVM.

В основном вы должны:

  1. разметить документы
  2. Удалить игнорируемые слова
  3. Применить вытекающий Технику
  4. Применить метод выбора функции (см [2])
  5. Transform ваших документов с помощью функции достигнутый в 4.) (простой был бы двоичным (0: функция отсутствует, присутствует 1: функция присутствует) или другие меры, такие как TFC)
  6. Тренируйте свой SVM и будьте счастливы :)

[1] T. Joachims: Категоризация текста с помощью векторных машин поддержки: изучение многих релевантных функций; Springer: Heidelberg, Germany, 1998, doi: 10.1007/BFb0026683.

[2] Y. Yang, J. O. Pedersen: сравнительное исследование по выбору функций в категоризации текста. Международная конференция по машинному обучению, 1997, 412-420.

Смежные вопросы