我想在我的程序中使用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,數字只是爲了描述,實際數字超過了這些數字,這意味着我應該將每個文檔分別放在我的列車陣列中?如果你可以請示例給我 –
是的每個文檔都是一個單獨的元素。網上有**千萬個**例子,要求爲這樣的事情編寫代碼表明完全沒有參與。使用SVM與文檔以及任何其他類型的數據沒有區別。使用矢量化,可將每個文檔轉換爲**矢量**。完成後,**任何** SVM示例都可以使用。 – lejlot