最近项目在搞模式识别,通过支持向量机的方法来进行分类,网上看到了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相同即可。
上面的代码仔细看懂即可理解这个关系。