Я пытался воспроизвести пример, показанный в libsvm «Практическое руководство по классификации опорных векторов» на странице 10. Данные «train.2», которые я использовал, можно скачать здесь " http://www.csie.ntu.edu.tw/~cjlin/papers/guide/data/ а> ".
Чтобы проанализировать данные и проверить точность классификации, я написал следующий код:
library(e1071)
rm(list=ls(all=T))
root <- "C:/Users/administrator/Documents/RProjects/libsvm"
bioDataFile <- sprintf("%s/data/train.2", root)
bioData <- read.delim(bioDataFile, header=F, sep=" ", stringsAsFactors=F)
bioData <- bioData[, c(-2,-3,-ncol(bioData))]
bioData <- lapply(1:nrow(bioData), function(n){
reformData <- bioData[n,-1,drop=F]
reformData <- sapply(1:ncol(reformData), function(m){
as.numeric(unlist(strsplit(reformData[,m], ":"))[2])
})
data.frame(Type=factor(bioData[n,1]), t(reformData))
})
bioData <- do.call("rbind", bioData)
Затем я провел тест:
bioData.model <- svm(Type~., data=bioData, cross=5)
Однако я обнаружил, что: 1. Я не мог получить те же результаты, что показаны в руководстве; 2. Я обнаружил, что k-кратная точность перекрестной проверки (среднее значение (bioData.model $ accuracies) или bioData.model $ tot.accuracy) различается каждый раз, когда я запускаю команду.
Я провел тот же тест, используя svm-train.exe из пакета libsvm, он дал те же результаты, что и в руководстве, и независимо от того, сколько раз я запускал тест, он всегда дает мне тот же k-кратный точность перекрестной проверки.
Кто-нибудь может сказать мне, почему? Любая помощь приветствуется.