美文网首页
2020-05-28

2020-05-28

作者: 数据小黑升值记 | 来源:发表于2020-05-28 21:44 被阅读0次

    首先,约束优化的话题很多,也有很多材料。即使是我们的子话题:凸优化,也是很庞大的。一个不错的起始点是 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.colorself.visualization。这样做能够让我们在类的其它方法中,引用self.color,最后,如果我们开启了可视化,我们打算绘制我们的图像。

    下面,让我们继续并体感家更多方法:fitpredict

    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方法会预测新特征集的值,一旦我们知道了wb,它就是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],])}
    

    相关文章

      网友评论

          本文标题:2020-05-28

          本文链接:https://www.haomeiwen.com/subject/ymuzahtx.html