《集体智慧编程》关于婚介数据集的SVM分类

转自:http://muilpin.blog.163.com/blog/static/165382936201131875249123/

 
作者写这本书的年代已经很久远了,于是里面使用到的LIBSVM接口与现在也非常不一样:

1.书本上提高的官方下载svm已经更新至3.x版本,不适合(研究了很久,发现接口很大不一样,建议阅读者不要使用最新版本,如果实在需要请参考本文第4点)
 
2.网上有人用libsvm2.89在Python2.6成功。(一定要libsvm2.89搭配python2.6,其他版本都不能成功,我就是浪费了大量时间在这里!)
两步:
1.将libsvm-2.89\windows\python目录下的svmc.pyd文件复制到C:\Python26\DLLs;
2.将libsvm-2.89\python目录下的svm.py放到C:\Python26\Lib目录里。
from svm import * 成功(本点非本人总结,但附上libsvm2.89的下载地址:http://ishare.iask.sina.com.cn/f/6344231.html)
 
from svm import *

prob  = svm_problem([1,-1] ,[[1,0,1] , [-1,0,-1]] )
param = svm_parameter(kernel_type = LINEAR , C = 10)
## training the model
m = svm_model(prob ,param)
#testing the model
m.predict( [1, 1 , 1] )
3.如果想要超级简单的了解关于SVM的知识,可以参考书籍提供下载svm官网中的guide文件,写的挺精辟的;
 
4.本人花了一个下午的时间使用了svm3.19版本,如果你实在坚持使用3.x版本,可以参考以下的方法:
(1)下载libsvm代码包,解压后将文件夹Window下的libsvm\window\libsvm.dll文件  复制到C:\WINDOWS\System32路径下;
(2)将代码包里面的文件夹Python中的svmutil.py文件复制到你的工作目录(如果想用svm.py,同理操作,以下以svmutil.py举例,区别请看python文件夹下的README!)
  即把svmutil.py和svm.py两个文件拉到eclipse工程目录里
(3)与书上不同的地方在于:svm_parameter()函数的使用方法更新了,方法如下说明:
用法:param = svm_parameter('Training Opition')
实例:param = svm_parameter('-s 3 -c 5 -h 0')
其中里面的参数如下详细说明:
options:
-s svm_type : set type of SVM (default 0)
0 -- C-SVC
1 -- nu-SVC
2 -- one-class SVM
3 -- epsilon-SVR
4 -- nu-SVR
-t kernel_type : set type of kernel function (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
3 -- sigmoid: tanh(gamma*u'*v + coef0)
4 -- precomputed kernel (kernel values in training_set_file)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)
-v n: n-fold cross validation mode
-q : quiet mode (no outputs)
 
(4)svm_model已经成为一个类,不能直接调用,但可以通过以下两种方法实现对数据集的建模:
    >>> model = svm_train(prob, param)
    >>> model = svm_load_model('model_file_name') #从保存的model中获取模型
 
from svm import *
from svmutil import * #构造svm训练数据和svm参数(包括核函数和交叉验证)
data = svm_problem([1,-1] ,[[1,0,1] , [-1,0,-1]] ) #元组第一个列表表示分类种类,第二个列表表示数据
# param = svm_parameter(kernel_type = 'LINEAR' ,C = 10) #使用线性核函数,交叉验证用10 #对svm模型训练
'''
参数-t表示kernel函数,-c表示交叉验证用多少
-t kernel_type : set type of kernel function (default 2)
0 -- linear: u'*v
1 -- polynomial: (gamma*u'*v + coef0)^degree
2 -- radial basis function: exp(-gamma*|u-v|^2)
'''
param = svm_parameter('-c 10 -h 0') #默认选择RBF核函数
model = svm_train(data, param) #测试
svm_predict([1],[[1,1,1]],model) #predict有三个参数,第一个参数是你预测的类型,第二个是你输入要预测的数据,最后一个参数就是训练模型 结果是:
optimization finished, #iter = 1
nu = 0.107467
obj = -1.074672, rho = 0.000000
nSV = 2, nBSV = 0
Total nSV = 2
Accuracy = 100% (1/1) (classification)


 
(5)另外有一定需要特别注意的是,书本上的这种写法已经不合适了:
>>> newrow=[28.0,-1,-1,26.0,-1,1,2,0.8] # Man doesn't want children, woman does
>>> m.predict(scalef(newrow))
可以更新为:
>>>newrow=[(28.0,-1,-1,26.0,-1,1,2,0.8)]   #注意里面多了一个元组符号'()'
>>>svm_predict([0]*len(newrow),newrow,m)   #注意m代表svm_train出来的模型,第一个参数的解释如下:
a list/tuple of l true labels (type must be int/double). It is used for calculating the accuracy. Use [0]*len(x) if true labels are unavailable.  即第一个参数表示你对newrow的预测值。
 
 
5.如果你下载了svm3.x版本,就需要详细看下载包里面的README文件,里面有提到各种函数的用法,但解释感觉不全面;
 
 
6.另外书中第9章还有一些错误如下:
def scaledata(rows):
low=[999999999.0]*len(rows[0].data)
high=[-999999999.0]*len(rows[0].data)
# Find the lowest and highest values
for row in rows:
d=row.data
for i in range(len(d)):
if d[i]<low[i]: low[i]=d[i]
if d[i]>high[i]: high[i]=d[i]
# Create a function that scales data
def scaleinput(d):
    return [(d.data[i]-low[i])/(high[i]-low[i])for i in range(len(low))] #可能出错(1)(2)
# Scale all the data
newrows=[matchrow(scaleinput(row.data)+[row.match])for row in rows] 
# Return the new data and the function
return newrows,scaleinput
可能出错(1):如果使用作者前面计算位置距离的函数milesdistance():
def milesdistance(a1,a2):
return 0
分母则会为0出错,我的做法如下:1.产生[0,1]随机数;2.分母另外加上0.000000001;但使用Yahoo来获取距离是可以的!
出错的地方(2):d.data[i]出错,应该更改为d[i]
 
还有附录B中计算点积的公式有误:
def veclength(a):
    return sum([a[i] for i in range(len(a))])**.5
一个多维向量的模应该为a[i]**2而非a[i];

(转)python 搭建libsvm方法。python版本和libsvm版本匹配很重要!的更多相关文章

  1. python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html

    前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...

  2. python扩展实现方法--python与c混和编程

    前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...

  3. Python搭建简易HTTP服务(3.x版本和2.x版本的)

    废话不多说,我们工作时经常会用到需要HTTP服务,如果不想搞那些复杂的Apache.IIS服务器等,这时我们就可以用python帮我们搭建一个简单的服务器.操作如下: 1.下载并安装一个python: ...

  4. Python List extend()方法

    Python List extend()方法  Python 列表 描述 extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表). 语法 extend()方法语法 ...

  5. Python os.getcwd() 方法

    Python os.getcwd() 方法  Python OS 文件/目录方法 概述 os.getcwd() 方法用于返回当前工作目录. 语法 getcwd()方法语法格式如下: os.getcwd ...

  6. windows、ubuntu下eclipse搭建java、Python环境问题总结

    前两篇博文分别讲述了如何在windows.ubuntu下用eclipse搭建java.python环境,下面就针对本人遇到的问题做一个总结. 一.windows下关于java环境变量JAVA_HOME ...

  7. XAMPP、PHPstorm和PHPcharm和Windows环境下Python搭建+暴力破解

    XAMPP的安装和使用 一.什么是XAMPP? XAMPP是最流行的PHP开发环境. XAMPP是完全免费且易于安装的Apache发行版,其中包含Apache.MariaDB.PHP和Perl. 类似 ...

  8. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...

  9. LibSVM for Python 使用

    经历手写SVM的惨烈教训(还是太年轻)之后,我决定使用工具箱/第三方库 Python libsvm的GitHub仓库 LibSVM是开源的SVM实现,支持C, C++, Java,Python , R ...

随机推荐

  1. 青岛Uber优步司机奖励政策(12月28日到1月3日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 相机-imu外参校准总结

    1. 研究背景及相关工作 1)研究背景 单目视觉惯性slam是一种旨在跟踪移动平台的增量运动并使用来自单个车载摄像头和imu传感器的测量结果同时构建周围环境地图的技术.视觉相机和惯性测量单元(imu) ...

  3. R语言使用过程中出现的问题--attach()函数的使用

    使用attach(file)时,一定要配合使用detach(file),否则再此运行程序时极易出现问题,The following objects are masked ... 此外工作空间中不能有与 ...

  4. lesson 17 The longest suspension bridge in the world

    lesson 17 The longest suspension bridge in the world agreeable adj. 令人愉快的:适合的 = pleasant be located ...

  5. Unity编辑器 - 编辑器控制特效播放

    编辑器控制特效播放 Unity的动画编辑器不能预览粒子系统的播放,为了方便预览特效,设想制作一个预览特效的工具,通常一个特效有三种组件: - Animation - Animator - Partic ...

  6. Java学习 · 初识 IO流

    IO流   1. 原理与概念 a)     流 i.           流动,流向 ii.           从一端移动到另一端 源头到目的地 iii.           抽象.动态概念,是一连 ...

  7. 【20180807模拟测试】T2 box

    [问题描述] 有个桌子长 R 宽 C,被分为 R*C 个小方格.其中,一些方格上有箱子,一些方格上有按 钮,一些方格上有障碍物,一些方格上是空地.现在有个任务,需要把所有箱子推到这些按 钮上面.箱子有 ...

  8. C++ 学习笔记之——字符串和字符串流

    1. 字符数组 字符数组,也就是存放字符类型数据的数组,只不过字符数组的结尾必须是 '\0'.C++ 已经提供了一些字符串处理函数,这些函数被封装在头文件 和 <string.h> 中. ...

  9. array.some() 方法兼容ie8

    在第 5 版时,some 被添加进 ECMA-262 标准:这样导致某些实现环境可能不支持它.你可以把下面的代码插入到脚本的开头来解决此问题,从而允许在那些没有原生支持它的实现环境中使用它.该算法是  ...

  10. java日期格式处理

    继承关系:java.lang.Object->java.text.Format->java.text.DateForm->java.text.SimpleDateFormat 日期代 ...