基于libsvm库的python支持向量机(SVM)简明干货

最近项目在搞模式识别,通过支持向量机的方法来进行分类,网上看到了python代码,但是,只能做到二维分类。

维数上去之后,没有办法有效识别,这个svm的代码有序有时间的话,我会写好一份多维特征量判别的代码发上来。

话题开始,先简单说说支持向量机:

支持向量机SVM,是人工智能领域一类比较常用的有效分类方式,通过寻找全局最优支持向量,将平面或者超平面分割为两个部分,

这两个部分可以通过一个线性函数或者非线性函数f(x)来实现划分,这个f(x)的定义式:

f(x)=[W].T*x+b

后面的T代表矩阵的转置,这里的自变量x∈Rn,也就是我们说的n维向量,我们可以通过一个一维数组来表示,数组成员数就是n。

所谓的支持向量机训练操作就是在寻找一个W和b这样的常数矩阵,可以看做是在解W.和b的过程。

我们训练好这两个参数之后,再把我们想要测试的x值带到这里面去,就可以知道这个样本属于哪一类了。

结果

y=sgn(f(x))

习惯上用符号函数来表示,这种表示方法与支持向量机里面的建模函数有关,这里不详说。意思就是只需比较这个结果是否为0即可判别属于哪类。


台湾大学的林教授给我们提供好了一个SVM的库,这个库提供源代码,感兴趣的可以去下载下,下载地址百度、谷歌libsvm即可,这里讲用法。


讲libsvm文件夹下面windows文件夹中的libsvm.dll文件拷贝到windows\system32文件夹下,现在的这些编译版本网上说基本是64位的了,所以直接复制过去就行,

不过我下载的这个版本,在README文件中,说这个libsvm.dll文件还是32位的,如果说Python是32位的,查看python是否为32位的输入:

import sys

sys.version

即可

如果是32位的python可以把源代码编译下,vs编译就行。

如果嫌弃编译太麻烦,可以这样做:

把这个libsvm.dll文件放在当前目录的:

../windows/libsvm.dll这个路径就可以了,注意哦,上面可是两个dot,如果这个都不知道什么意思,看看libsvm的目录结构中windows文件夹在哪就知道了。

我们在libsvm\python文件夹下面新建一个文件:1.py

这里面为什么我们在python文件夹下建这个1.py文件,是因为这个文件夹下面有两个.py文件,这两个文件是我们这里的依赖文件,所以,这个必须得有,如果你想把这个脚本整体转移到其他目录中,不要忘记了,你需要把上面windows文件夹转移了,或者放在系统的windows\system32目录中,同时,别忘了这两个Py文件,当然,你也可以放在python安装目录中,不过,不太建议这样,总感觉这样做耦合关系有点儿大。

代码:


from svmutil import *
y, x = svm_read_problem('../heart_scale')
a=y[:60]
b=x[:60]
#print b
m = svm_train(a,b)
p_label1, p_acc, p_val = svm_predict(a,b, m)
a = y[61:121]
b = x[61:121]
p_label2, p_acc, p_val = svm_predict(a,b, m)
print(p_label1)
print(p_label2)
#svm_save_model("sss.txt",m)
if p_label1==p_label2:
    print("true")



这段代码有用的就三句:

y, x = svm_read_problem('../heart_scale')

读文件,y和x代表什么.print出来,然后对照../heart_scale文件就知道了。

m = svm_train(a,b)

训练函数,

p_label2, p_acc, p_val = svm_predict(a,b, m)

测试训练结果,主要显示精度,精度与c g 参数有关,可以通过svm_scale,tools/easy.py等来提高精度。方法网上太多,不多说了。

说一句关键的,训练好支持向量之后怎么用?

这里的svm_predict函数可以充当决策函数的作用,返回值p_label中的1和-1即代表了两类数据集。所以那里面的a参数只要保证维数与b相同即可。

上面的代码仔细看懂即可理解这个关系。

你可能感兴趣的:(人工智能杂谈)