R e1071交叉验证的准确性是不一样的

时间:2015-04-27 15:39:45

标签: r libsvm cross-validation

&lt; p&gt;我试图重现libsvm&#34;支持向量分类的实用指南&#34;第10页。数据&#34; train.2&#34;我使用的可以在这里下载&#34;&lt; a href =&#34; http://www.csie.ntu.edu.tw/~cjlin/papers/guide/data/"的rel =&#34; nofollow的&#34;&GT; HTTP://www.csie.ntu.edu.tw/~cjlin/papers/guide/data/< / A&GT;&#34;&LT; / p为H. &lt; p&gt;为了解析数据并测试分类准确性,我编写了以下代码:&lt; / p&gt; &LT;预&GT;&LT;代码&GT;库(e1071) RM(列表= LS(所有= T)) root&lt; - &#34; C:/ Users / administrator / Documents / RProjects / libsvm&#34; bioDataFile&lt; - sprintf(&#34;%s / data / train.2&#34;,root) bioData&lt; - read.delim(bioDataFile,header = F,sep =&#34;&#34;,stringsAsFactors = F) bioData&lt; - bioData [,c(-2,-3,-ncol(bioData))] bioData&lt; - lapply(1:nrow(bioData),function(n){ reformData&lt; - bioData [n,-1,drop = F] reformData&lt; - sapply(1:ncol(reformData),function(m){ as.numeric(unlist(strsplit(reformData [,m],&#34;:&#34;))[2]) }) data.frame(Type = factor(bioData [n,1]),t(reformData)) }) bioData&lt; - do.call(&#34; rbind&#34;,bioData) &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;然后我执行了测试:&lt; / p&gt; &lt; pre&gt;&lt; code&gt; bioData.model&lt; - svm(Type~。,data = bioData,cross = 5) &LT; /代码&GT;&LT; /预&GT; &lt; p&gt;但是,我发现: 1.我无法获得与手册中显示的相同的结果; 2.我发现每次运行命令时,k折交叉验证的准确度(平均值(bioData.model $ accuracies)或bioData.model $ tot.accuracy)都不同。&lt; / p&gt; &lt; p&gt;我使用libsvm包中提供的svm-train.exe进行了相同的测试,它确实产生了与手册中显示的相同的结果,无论我运行多少次测试,它总是给我相同的k倍交叉验证准确度。&lt; / p&gt; &lt; p&gt;有人可以告诉我为什么吗?任何帮助将不胜感激。&lt; / p&gt;

1 个答案:

答案 0 :(得分:0)

如果您查看documentation,您会发现您使用的功能依赖于“随机数”。术语“随机”在计算机科学中有些含糊不清。实际上,有一种算法可以创建所谓的“伪随机”数字。该算法(基本术语)接受一个参数(它应该从哪里开始)并且每次(random seed)产生相同的序列。顺便说一下,这就是所有现代加密系统所依据的事实,即在给定相同的随机种子的情况下,序列总是相同的。

在R中设置随机种子:

set.seed(3)

其中3可以替换为您要设置的任何数字。现在,一旦设置了它,每次生成一个随机数时,将采用伪随机序列中的下一个数字。因此,如果您设置种子,请尝试几次,然后运行您的代码,它不会产生与设置随机种子后立即运行代码相同的结果。

希望这有帮助!