首先,约束优化的话题很多,也有很多材料。即使是我们的子话题:凸优化,也是很庞大的。一个不错的起始点是 https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf。对于约束优化,你可以查看 http://www.mit.edu/~dimitrib/Constrained-Opt.pdf。
特别是在 Python 中,CVXOPT 包拥有多种凸优化方法,其中之一就是我们的平方规划问题(cvxopt.solvers.qp
)。
同样,也有 libsvm 的 Python 接口,或者 libsvm 包。我们选择不要用这些东西,因为 SVM 的最优化问题几乎就是 SVM 问题的全部了。
现在,为了使用 Python 来开始写 SVM,我们以这些导入来开始。
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
style.use('ggplot')
我们使用 Matplotlib 来绘图,NumPy 来处理数组。下面我们会拥有一些起始数据:
data_dict = {-1:np.array([[1,7],
[2,8],
[3,8],]),
1:np.array([[5,1],
[6,-1],
[7,3],])}
现在我们打算开始构建我们的 SVM 类。如果你不熟悉面向对象编程,不要害怕。我们这里的例子是个非常基本的 OOP 形式。只要知道 OOP 创建带有对象,类中带有属性、函数(实际上是方法),以及我们使用self
变量来代表对象本身。解释再多也没有意义,已经足以开始了。
class Support_Vector_Machine:
def __init__(self, visualization=True):
self.visualization = visualization
self.colors = {1:'r',-1:'b'}
if self.visualization:
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1,1,1)
类的__init__
方法是使用类创建对象时,执行的方法。其它方法只在调用时执行。对于每个方法,我们传入self
作为第一个参数,主要是一种约定。下面,我们添加可视化参数。我们想看看 SVM,所以将其设为True
。下面米可以看见一些变量,例如self.color
和self.visualization
。这样做能够让我们在类的其它方法中,引用self.color
,最后,如果我们开启了可视化,我们打算绘制我们的图像。
下面,让我们继续并体感家更多方法:fit
和predict
。
class Support_Vector_Machine:
def __init__(self, visualization=True):
self.visualization = visualization
self.colors = {1:'r',-1:'b'}
if self.visualization:
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1,1,1)
# train
def fit(self, data):
pass
def predict(self,features):
# sign( x.w+b )
classification = np.sign(np.dot(np.array(features),self.w)+self.b)
return classification
fit
方法会用于训练我们的 SVM。这就是最优化的步骤。一旦我们完成了训练,predict
方法会预测新特征集的值,一旦我们知道了w
和b
,它就是sign(x·w+b)
。
目前为止的代码。
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
style.use('ggplot')
class Support_Vector_Machine:
def __init__(self, visualization=True):
self.visualization = visualization
self.colors = {1:'r',-1:'b'}
if self.visualization:
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1,1,1)
# train
def fit(self, data):
pass
def predict(self,features):
# sign( x.w+b )
classification = np.sign(np.dot(np.array(features),self.w)+self.b)
return classification
data_dict = {-1:np.array([[1,7],
[2,8],
[3,8],]),
1:np.array([[5,1],
[6,-1],
[7,3],])}