Я хочу использовать 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,
спасибо @lejlot, номера только для описания, реальные числа больше, чем эти числа, а это значит, что я должен поместить каждый документ отдельно в мой массив поезда? если бы вы могли показать мне пример –
Да, каждый документ является отдельным элементом. Есть ** milions ** примеры онлайн, прося код для такой вещи, показывает полное отсутствие участия. Нет никакой разницы между использованием SVM с документами и любыми другими типами данных. Используя векторию, вы переводите каждый из ваших документов на ** векторы **. После этого ** любой пример SVM будет работать. – lejlot