今天简单学习了一下svm,使用了libsvm的开源框架在这里作此记录。
认识理解libsvm
首先对svm进行学习,对svm的原理和公式有一个简单的认识。
第一个学习的是线性支持向量机学习算法,我们输入的训练数据集为T={(x1,y1),(x2,y2),…(xn,yn)},其中,然后我们选择一个惩罚参数c>0,构造并求解凸二次规划问题,得到最优解,再选择最优解中的一个分量a,使其0<a<c,最后计算得出分离超平面和分类决策函数。
第二学习的是非线性支持向量机学习算法,同样输入训练数据集为T={(x1,y1),(x2,y2),…(xn,yn)},其中,然后我们选取适当的核函数K(x,z)和惩罚参数c>0,构造并求解凸二次规划问题,得到最优解,再选择最优解中的一个分量a,使其0<a<c,最后计算得出分离超平面和分类决策函数。
对svm有了一定的了解后,就去学习了libsvm的相关知识,libsvm是一个操作简单、易于使用、快速有效的通用SVM 软件包,可以解决分类问题、回归问题以及分布估计等问题,提供了线性、多项式、径向基和S形函数四种常用的核函数供选择,可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权、多类问题的概率估计等,这里将介绍我在代码中用到的几个函数的意思。
svm_read_problem():
此函数是libsvm.commonutil包中的,它的作用是从文件中读取我们的数据集,参数可传入String filename数据集的文件位置,返回的分别是标签y和数据x。
svm_train():
实现对训练数据集的训练,获得SVM模型。参数可传入svm_read_problem()方法传入训练数据集得到的标签y和数据x,还有一个可选参数为options(操作参数),该方法返回一个训练模型 model。
svm_predict():
根据训练获得的模型,对数据集合进行预测。参数可传入svm_read_problem()方法传入测试数据集得到的标签yt和数据xt,以及训练好了的模型model。
Libsvm操作参数说明(这里只包含代码中用到的):
-s svm类型:SVM设置类型(默认0)
0 – C-SVC
1 --v-SVC
2 – 一类SVM
3 – e -SVR
4 – v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性:u’v
1 – 多项式:(ru’v + coef0)^degree
2 – RBF函数:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(ru’v + coef0)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k)
下载libsvm
因为我们用pycharm工具对代码进行编写,因此我们可以直接在pycharm中下载libsvm的库。
了解libsvm数据格式并进行修改
FormatDataLibsvm.xls下载链接
因为libsvm数据的格式为lable 1:value 2:value…,显然我们的数据集格式不正确,于是我们下载FormatDataLibsvm.xls,打开启用宏之后,再将我们的两个数据集导入,选择分割符号或固定宽度,下一步选择数据对应的分隔符号,下一步,完成,最后再点击开发工具->宏->FormatDatatoLibsvm->运行,另存为train.txt和test.txt。
此时生成的两个txt文件是GBK编码,我们要通过notepad对其进行编码修改,修改为UTF-8才能被读取。
使用libsvm对数据进行分类
第一步,读取训练数据集
第二步,读取测试数据集
第三步,通过训练数据集进行构建模型
第四步,通过模型对测试数据集进行预测
from libsvm.commonutil import *
from libsvm.svm import *
from libsvm.svmutil import *
if __name__ == '__main__':
y, x = svm_read_problem("train.txt")
yt, xt = svm_read_problem('test.txt')
model = svm_train(y, x,'-s 0 -t 2 -c 0.2 -g 2.8')
# model = svm_train(y, x)
#94.35328185328186
#94.11196911196912
p_label, p_acc, p_val = svm_predict(yt[0:], xt[0:], model)
print(p_label)
print(p_acc)
print(p_val)
输出结果:
迭代次数:1003 测试准确率:94.3533%
输出含义解释:
iter:迭代次数
nu:SVM对应类型的参数
obj:SVM文件转换为的二次规划求解得到的最小值
nSV:支持向量个数 nBSV:边界上的支持向量个数
Total nSV:支持向量总个数
Accuracy:测试准确率
总结一下
在此次实验中,我通过学习了解了svm的原理和公式,并对其的开源框架libsvm进行了使用。在学习使用libsvm中,遇到了许多问题,首先对于安装libsvm,下载了其whl文件,准备用pip intsall进行安装,但始终无法安装成功,查百度也没有办法,最后只有在pycharm里面安装libsvm,成功。然后在变换libsvm的数据格式时,通过exel的宏方法进行转换,起初无法导入文件,在第二次从快速选择中导入才得以使用成功,另存为txt文件。接下来准备进行用python读取txt文件时,报错GBK,发现我们需要将GBK编码转换为UTF-8编码才能被读取,于是用nodepad进行编码转换,最后终于成功。