在pycharm中使用python对Libsvm的简单使用

今天简单学习了一下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(r
u’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进行编码转换,最后终于成功。

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值