- 签证留学 |
- 笔译 |
- 口译
- 求职 |
- 日/韩语 |
- 德语
下一个函数testDigits()并不是全新的函数,它和testRbf()的代码几乎一样,唯一的大区别就是它调用了loadImages()函数来获得类别标签和数据。另一个细小的不同是现在这里的函数元组kTup是输入参数,而在testRbf()中默认的就是使用rbf核函数。如果对于函数testDigits()不增加任何输入参数的话,那么kTup的默认值就是('rbf', 10)。
输入程序清单1中的代码之后,将之保存为svmMLiA.py并输入如下命令:
我尝试了不同的σ值,并尝试了线性核函数,总结得到的结果如表1所示。
表1 不同σ值的手写数字识别性能
表1给出的结果表明,当径向基核函数中的参数σ取10左右时,就可以得到最小的测试错误率。该参数值比前面例子中的取值大得多,而前面的测试错误率在1.3左右。为什么差距如此之大?原因就在于数据的不同。在手写识别的数据中,有1024个特征,而这些特征的值有可能高达1.0。而所有数据从-1到1变化,但是只有2个特征。如何才能知道该怎么设置呢?说老实话,在写这个例子时我也不知道。我只是对不同的设置进行了多次尝试。C的设置也会影响到分类的结果。当然,存在另外的SVM形式,它们把C同时考虑到了优化过程中,例如v-SVM。有关v-SVM的一个较好的讨论可以参考Sergios Theodoridis和Konstantinos Koutroumbas撰写的Pattern Recognition。
你可能注意到了一个有趣的现象,即最小的训练错误率并不对应于最小的支持向量数目。另一个值得注意的就是,线性核函数的效果并不是特别的糟糕。可以以牺牲线性核函数的错误率来换取分类速度的提高。尽管这一点在实际中是可以接受的,但是还得取决于具体的应用。
责任编辑:admin