利用CVXOPT模块实现SVM

1. CVXOPT模块安装

由于anaconda中并没有包含cvxopt模块,因此需要自行安装,步骤如下:
- 首先,查看安装的numpy版本,我用的是1.13.3(命令为 np.__version__
- 然后,删除Numpy (命令为 pip uninstall numpy)
- 接下来下载合适python和操作系统的cvxopt版本,我用的是cvxopt-1.1.9-cp36-cp36m-win_amd64.whl cvxopt下载地址
- 执行pip install cvxopt-xxx-xxx.whl
- 接着,下载前述的nunpy版本,进行安装,我用的是numpy‑1.13.3+mkl‑cp36‑cp36m‑win_amd64.whl cvxopt下载地址
- 执行安装 pip install numpy-xxx-xxx.whl

2.代码

  • 代码如下,目前仅包含了 简单的分类训练过程,没有包含测试数据
  • 机器学习实战源码数据下载地址为:https://www.manning.com/books/machine-learning-in-action
  • 数据在第六章的根目录下。
# CVXOPT踩坑指南
#    优化中传递的matrix必须是cvxopt内的matrix
#    matrix()  转换对应的类型为numpy.array,numpy.matrix可能也行(没有尝试)

# python 3

import numpy as np
from cvxopt import solvers
from cvxopt import matrix as mx
import matplotlib
import matplotlib.pyplot as plt

def loadDataSet(fileName):
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = line.strip().split('\t')
        dataMat.append([float(lineArr[0]), float(lineArr[1])])
        labelMat.append(float(lineArr[2]))
    return dataMat,labelMat

# 数据为《机器学习实战》第六章的数据testSet.txt
data,label = loadDataSet('testSet.txt')
dataLen = len(data[0])

# 生成cvxopt里面对应的参数矩阵/向量
p1 = np.zeros((1, dataLen+1))
p2 = np.zeros((dataLen,1))
p3 = np.eye(dataLen)
ptmp = np.hstack((p2,p3))
p = np.vstack((p1,ptmp))
p = mx(p)

q = mx(np.zeros((dataLen+1,1)))

m = len(label)
dataT = np.array(data)
a = []
for i in range(m):
    tmp = [1]+data[i]
    for j in range(dataLen+1):
        tmp[j] = -1*label[i]*tmp[j]
    a.append(tmp)
G = mx(np.array(a))

h = mx(np.zeros((m,1))-1)

# 求解凸二次规划问题
sol = solvers.qp(p,q,G,h)

# 打印信息
print(sol['status'])
print(sol['x'])

# 绘制数据散点图
datanp = np.array(data)
labelnp = np.array(label)
data1 = datanp[labelnp==1]
data2 = datanp[labelnp==-1]

f1 = plt.figure(1)
plt.scatter(data1[:,0],data1[:,1], marker = 'x', color = 'm', label='1', s = 30)
plt.scatter(data2[:,0],data2[:,1], marker = 'o', color = 'r', label='-1', s = 15)

# 打印分割平面
b = sol['x'][0]
w1 = sol['x'][1]
w2 = sol['x'][2]

xmin = min(datanp[:,0])
xmax = max(datanp[:,0])
x2_1 = -1.0*(b+w1*xmin)/w2
x2_2 = -1.0*(b+w1*xmax)/w2

plt.plot([xmin,xmax],[x2_1,x2_2])
plt.show()
  • 运行结果如图所示:

  • 前述构造凸二次优化的参数矩阵如下图所示,参考《机器学习技法》课程。注意,cvxopt模块采用的时小于等于形式,因此不等式两边需要同时乘以-1。

  • 关于矩阵的维度,可以参考cvxpot.solvers.qp()的说明

你可能感兴趣的:(机器学习)