今天和师兄交流了一番,终于对SVM有了初步的理解,虽然觉得自己还是很小白,但是有收获、有进步就好。
SVM处理流程(待修正):
1. 收集数据,相关性分析(p卡方检验),特征选择(主成份分析PCA)。PCA提取特征向量,用这些来分类,SVM是分类器,输入的就是特征向量。
2. 归一化数据。就是根据实际要求,将数据的取值范围转化为统一的区间如[a,b],a,b为整数。
3. 利用抽样技术将数据集分为训练集和测试集。抽样技术有分层抽样,简单抽样(等概率抽样)。一般训练集>测试集,就是要保证足够的训练样例。
4. 将数据转化为软件(接口)所支持的格式。就libsvm(c++,java)来说,我们可以使用FormatDataLibsvm.xls将数据转化为libsvm所要求的格式。
5. 选择核函数,可以优先考虑rbf。核函数是把低维数据映射到高维空间,让线性不可分的问题变成线性可分。
6. (训练)对训练集利用交叉验证法选择最好的参数C和r(西格玛) (rbf核函数中的参数gama)。
可以通过网格法寻找出最优的参数,注意一次交叉验证得到一个参数对所对应的模型精度,网格法(训练的一个过程)目的就是找到使得模型精度达到对高的参数对(这里的参数对可能不止两个,有可能也有其他的),可以使用一些启发式的搜索来降低复杂度,虽然这个方法笨了点,但是它能得到很稳定的搜索结果。需要提到的这里在对训练集进行分割的时候涉及到抽样,一个较好的方法就是分层抽样。从这步可以看出其实 Cross-Validation是一种评估算法的方法。
a. 训练的目的得到参数和支持向量(存储在xml文件中),得到参数就能得到支持向量,带进算式计算SVM分类的准确度,以准确度最高的一组参数作为最终的结果,没有绝对线性可分的,都有一个误差,参数就是把那个误差降到最低。
b. 这里的准确性是指将训练集的每个样本的向量与支持向量做运算,将运算结果与标记值比较,判断是否属于这个类,统计这个类的正确的样本数,最高的那一组参数准确性最高。
c. 最终训练得到分类器。SVM只能分两类,所以这里的分类器是两个类组成一个分类器,如果有K类,就有k(k-1)/2个分类器。
7. 用6中得到的参数对在整个训练集合上进行训练,从而得出模型(即分类器)。
8. 利用测试集测试模型,得到精度。这个精度可以认为是模型最终的精度。当然有人会担心3步中抽样会有一定的误差,导致8得到的精度不一定是最好的,因此可以重复3-8得到多个模型的精度,然后选择最好的一个精度最为模型的精度(或者求所有精度的均值做为模型精度)。(需要多次选择训练集和测试集,然后每一次得到一个精度的模型,选择最好的一个精度作为模型,也就是我们项目里面要多次训练的原因)
9. 识别分类。两个类超平面的形成,意味着目标函数的形成,然后代入待识别样本,识别时对应的组代入对应的参数,得出结果进行投票,判定属于那个类。