• 统计学习方法第二章习题


    第2章 感知机

    习题2.1

      Minsky 与 Papert 指出:感知机因为是线性模型,所以不能表示复杂的函数,如异或 (XOR)。验证感知机为什么不能表示异或。

    解答:

    解答思路:

    1. 列出异或函数(XOR)的输入和输出;
    2. 使用图例法证明异或问题是线性不可分的;
    3. 使用反证法证明感知机无法表示异或。

    解题步骤:

    第1步:异或函数(XOR)的输入和输出

      对于异或函数(XOR),全部的输入与对应的输出如下:

    x 1 x_1 x1
    x 2 x_2 x2
    y = x 1 ⊕ x 2 y=x_1\oplus x_2 y=x1x2
    00-1
    011
    101
    11-1

    第2步:使用图例法证明异或问题是线性不可分的

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    # 使用Dataframe表示异或的输入与输出数据
    x1 = [0, 0, 1, 1]
    x2 = [0, 1, 0, 1]
    y = [-1, 1, 1, -1]
    x1 = np.array(x1)
    x2 = np.array(x2)
    y = np.array(y)
    data = np.c_[x1, x2, y]
    data = pd.DataFrame(data, index=None, columns=['x1', 'x2', 'y'])
    data.head()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    x1x2y
    000-1
    1011
    2101
    311-1
    # 获取正类别(y=1)的数据
    positive = data.loc[data['y'] == 1]
    # 获取负类别(y=-1)的数据
    negative = data.loc[data['y'] == -1]
    
    # 绘制数据图
    # 绘制坐标轴
    plt.xlim(-0.5, 1.5)
    plt.ylim(-0.5, 1.5)
    plt.xticks([-0.5, 0, 1, 1.5])
    plt.yticks([-0.5, 0, 1, 1.5])
    # 添加坐标轴文字
    plt.xlabel("x1")
    plt.ylabel("x2")
    # 绘制正、负样本点
    plt.plot(positive['x1'], positive['x2'], "ro")
    plt.plot(negative['x1'], negative['x2'], "bx")
    # 添加图示
    plt.legend(['Positive', 'Negative'])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

      从上图可以看出,无法使用一条直线将两类样本分开,所以异或问题是线性不可分的

    from sklearn.linear_model import Perceptron
    import numpy as np
    
    # 构造异或问题的训练数据集
    X_train = np.array([[1, 1], [1, 0], [0, 1], [0, 0]])
    y = np.array([-1, 1, 1, -1])
    
    # 使用sklearn的Perceptron类构建感知机模型
    perceptron_model = Perceptron()
    # 进行模型训练
    perceptron_model.fit(X_train, y)
    
    # 打印模型参数
    print("感知机模型的参数:w=", perceptron_model.coef_[
          0], "b=", perceptron_model.intercept_[0])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    感知机模型的参数:w= [0. 0.] b= 0.0
    
    • 1

      上述使用sklearn的Perceptron类构建感知机模型,从模型的参数上观察,感知机模型无法表示异或。

    第3步:使用反证法证明感知机无法表示异或

      根据书中第35页感知机模型的定义:

    定义2.1(感知机) 假设输入空间(特征空间)是 X ⊆ R n \mathcal{X} \subseteq R^n XRn,输出空间是 y = { + 1 , − 1 } \mathcal{y}=\{+1,-1\} y={+1,1}。输入 x ∈ X x \in \mathcal{X} xX表示实例的特征向量,对应于输入空间(特征空间)的点;输出 y ∈ Y y \in \mathcal{Y} yY表示实例的类别。由输入空间到输出空间的如下函数:
    f ( x ) = sign ( w ⋅ x + b ) f(x)=\text{sign}(w \cdot x + b) f(x)=sign(wx+b)
    称为感知机。其中, w w w b b b为感知机模型参数, w ∈ R n w \in R^n wRn叫做权值或权值向量, b ∈ R b \in R bR叫做偏置, w ⋅ x w \cdot x wx表示 w w w x x x的内积。sign是符号函数,即
    sign ( x ) = { + 1 , x ⩾ 0 − 1 , x < 0 \text{sign}(x)=\left \{ +1,x01,x<0\right. sign(x)={+1,x01,x<0

      假设感知机模型可以表示异或问题,即满足异或函数(XOR)输入与输出的情况(见第1步)。假设 x x x向量只有两个维度 x 1 x_1 x1 x 2 x_2 x2

    1. 根据 x 1 = 0 , x 2 = 0 , f ( x ) = − 1 x_1=0, x_2=0, f(x)=-1 x1=0,x2=0,f(x)=1,则 w ⋅ x + b < 0 w \cdot x +b < 0 wx+b<0,可得 b < 0 b < 0 b<0
    2. 根据 x 1 = 0 , x 2 = 1 , f ( x ) = 1 x_1=0, x_2=1, f(x)=1 x1=0,x2=1,f(x)=1,则 w 2 + b > 0 w_2 + b > 0 w2+b>0,结合 b < 0 b < 0 b<0,可得 w 2 > − b > 0 w_2 > -b > 0 w2>b>0
    3. 根据 x 1 = 1 , x 2 = 0 , f ( x ) = 1 x_1=1, x_2=0, f(x)=1 x1=1,x2=0,f(x)=1,则 w 1 + b > 0 w_1 + b > 0 w1+b>0,结合 b < 0 b < 0 b<0,可得 w 1 > − b > 0 w_1 > -b > 0 w1>b>0
    4. 根据 x 1 = 1 , x 2 = 1 x_1=1, x_2=1 x1=1,x2=1,并结合 w 1 + b > 0 w_1 + b > 0 w1+b>0 w 2 > 0 w_2 > 0 w2>0,则 w 1 + w 2 + b > 0 w_1 + w_2 + b > 0 w1+w2+b>0,可得 f ( x ) = 1 f(x)=1 f(x)=1,与异或条件中的 f ( x ) = − 1 f(x)=-1 f(x)=1矛盾。

      所以假设不成立,原命题成立,即感知机模型不能表示异或。

    习题2.2

      模仿例题 2.1,构建从训练数据求解感知机模型的例子。

    解答:

    解答思路:
      按照书中第38~39页感知机学习算法2.1,编写代码并绘制分离超平面

    算法2.1(感知机学习算法的原始形式)
    输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\ldots,(x_N,y_N)\} T={(x1,y1),(x2,y2),,(xN,yN)},其中 x i ∈ X = R n x_i \in \mathcal{X} = R^n xiX=Rn y i ∈ Y = { − 1 , + 1 } y_i \in \mathcal{Y} = \{-1, +1\} yiY={1,+1} i = 1 , 2 , … , N i=1,2,\ldots,N i=1,2,,N;学习率 η ( 0 < η ⩽ 1 ) \eta (0 < \eta \leqslant 1) η(0<η1)
    输出: w , b w,b w,b;感知机模型 f ( x ) = sign ( w ⋅ x + b ) f(x)=\text{sign}(w \cdot x + b) f(x)=sign(wx+b)
    (1)选取初值 w 0 , b 0 w_0, b_0 w0,b0
    (2)在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)
    (3)如果 y i ( w ⋅ x i + b ) ⩽ 0 y_i(w \cdot x_i + b) \leqslant 0 yi(wxi+b)0
    w ← w + η y i x i b ← b + η y i ww+ηyixibb+ηyi ww+ηyixibb+ηyi
    (4)转至(2),直至训练集中没有误分类点。

    解题步骤:

    import numpy as np
    from matplotlib import pyplot as plt
    %matplotlib tk
    
    
    class Perceptron:
        def __init__(self, X, Y, lr=0.001, plot=True):
            """
            初始化感知机
            :param X: 特征向量
            :param Y: 类别
            :param lr: 学习率
            :param plot: 是否绘制图形
            """
            self.X = X
            self.Y = Y
            self.lr = lr
            self.plot = plot
            if plot:
                self.__model_plot = self._ModelPlot(self.X, self.Y)
                self.__model_plot.open_in()
    
        def fit(self):
            # (1)初始化weight, b
            weight = np.zeros(self.X.shape[1])
            b = 0
            # 训练次数
            train_counts = 0
            # 分类错误标识
            mistake_flag = True
            while mistake_flag:
                # 开始前,将mistake_flag设置为False,用于判断本次循环是否有分类错误
                mistake_flag = False
                # (2)从训练集中选取x,y
                for index in range(self.X.shape[0]):
                    if self.plot:
                        self.__model_plot.plot(weight, b, train_counts)
                    # 损失函数
                    loss = self.Y[index] * (weight @ self.X[index] + b)
                    # (3)如果损失函数小于0,则该点是误分类点
                    if loss <= 0:
                        # 更新weight, b
                        weight += self.lr * self.Y[index] * self.X[index]
                        b += self.lr * self.Y[index]
                        # 训练次数加1
                        train_counts += 1
                        print("Epoch {}, weight = {}, b = {}, formula: {}".format(
                            train_counts, weight, b, self.__model_plot.formula(weight, b)))
                        # 本次循环有误分类点(即分类错误),置为True
                        mistake_flag = True
                        break
            if self.plot:
                self.__model_plot.close()
            # (4)直至训练集中没有误分类点
            return weight, b
    
        class _ModelPlot:
            def __init__(self, X, Y):
                self.X = X
                self.Y = Y
    
            @staticmethod
            def open_in():
                # 打开交互模式,用于展示动态交互图
                plt.ion()
    
            @staticmethod
            def close():
                # 关闭交互模式,并显示最终的图形
                plt.ioff()
                plt.show()
    
            def plot(self, weight, b, epoch):
                plt.cla()
                # x轴表示x1
                plt.xlim(0, np.max(self.X.T[0]) + 1)
                # y轴表示x2
                plt.ylim(0, np.max(self.X.T[1]) + 1)
                # 画出散点图,并添加图示
                scatter = plt.scatter(self.X.T[0], self.X.T[1], c=self.Y)
                plt.legend(*scatter.legend_elements())
                if True in list(weight == 0):
                    plt.plot(0, 0)
                else:
                    x1 = -b / weight[0]
                    x2 = -b / weight[1]
                    # 画出分离超平面
                    plt.plot([x1, 0], [0, x2])
                    # 绘制公式
                    text = self.formula(weight, b)
                    plt.text(0.3, x2 - 0.1, text)
                plt.title('Epoch %d' % epoch)
                plt.pause(0.01)
    
            @staticmethod
            def formula(weight, b):
                text = 'x1 ' if weight[0] == 1 else '%d*x1 ' % weight[0]
                text += '+ x2 ' if weight[1] == 1 else (
                    '+ %d*x2 ' % weight[1] if weight[1] > 0 else '- %d*x2 ' % -weight[1])
                text += '= 0' if b == 0 else ('+ %d = 0' %
                                              b if b > 0 else '- %d = 0' % -b)
                return text
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    X = np.array([[3, 3], [4, 3], [1, 1]])
    Y = np.array([1, 1, -1])
    model = Perceptron(X, Y, lr=1)
    weight, b = model.fit()
    
    • 1
    • 2
    • 3
    • 4
    Epoch 1, weight = [3. 3.], b = 1, formula: 3*x1 + 3*x2 + 1 = 0
    Epoch 2, weight = [2. 2.], b = 0, formula: 2*x1 + 2*x2 = 0
    Epoch 3, weight = [1. 1.], b = -1, formula: x1 + x2 - 1 = 0
    Epoch 4, weight = [0. 0.], b = -2, formula: 0*x1 - 0*x2 - 2 = 0
    Epoch 5, weight = [3. 3.], b = -1, formula: 3*x1 + 3*x2 - 1 = 0
    Epoch 6, weight = [2. 2.], b = -2, formula: 2*x1 + 2*x2 - 2 = 0
    Epoch 7, weight = [1. 1.], b = -3, formula: x1 + x2 - 3 = 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    习题2.3

      证明以下定理:样本集线性可分的充分必要条件是正实例点所构成的凸壳与负实例点所构成的凸壳互不相交。

    解答:

    解答思路:

    1. 写出凸壳和线性可分的定义
    2. 证明必要性:线性可分 ⇒ \Rightarrow 凸壳不相交
    3. 证明充分性:凸壳不相交 ⇒ \Rightarrow 线性可分

    第1步:凸壳与线性可分的定义

    1. 根据书中第47页脚注1的凸壳定义如下:

    设集合 S ⊂ R n S \subset R^n SRn,是由 R n R^n Rn中的 k k k个点所组成的集合,即 S = { x 1 , x 2 , ⋯   , x k } S=\{x_1,x_2,\cdots, x_k\} S={x1,x2,,xk}。定义 S S S的凸壳 conv ( S ) \text{conv}(S) conv(S)为:
    conv ( S ) = { x = ∑ i = 1 k λ i x i ∣ ∑ i = 1 k λ i = 1 , λ i ⩾ 0 , i = 1 , 2 , ⋯   , k } \text{conv}(S) = \left\{ x = \sum_{i=1}^k \lambda_i x_i \Big| \sum_{i=1}^k \lambda_i=1,\lambda_i \geqslant 0, i=1,2,\cdots, k \right\} conv(S)={x=i=1kλixi i=1kλi=1,λi0,i=1,2,,k}

    1. 根据书中第36页的线性可分定义如下:

    给定一个数据集
    T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯   , ( x n , y n ) } T=\{(x_1,y_1), (x_2,y_2), \cdots, (x_n,y_n)\} T={(x1,y1),(x2,y2),,(xn,yn)}

    其中 x i ∈ X = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , ⋯   , n x_i \in \mathcal{X}=R_n, y_i \in \mathcal{Y} = \{+1, -1\}, i=1,2,\cdots, n xiX=Rn,yiY={+1,1},i=1,2,,n,如果存在某个超平面 S S S
    w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0
    能够将数据集的正实例点和负实例点完全正确划分到超平面的两侧,即对所有 y i = + 1 y_i=+1 yi=+1的实例 i i i,有 w ⋅ x i + b > 0 w \cdot x_i + b > 0 wxi+b>0,对 y i = − 1 y_i = -1 yi=1的实例 i i i,有 w ⋅ x i + b < 0 w \cdot x_i + b < 0 wxi+b<0,则称数据集 T T T为线性可分数据集,否则称数据集 T T T线性不可分。

    第2步:证明必要性:线性可分 ⇒ \Rightarrow 凸壳不相交

    证明思路(反证法):

    1. 假设原命题不成立:样本集线性可分,正实例点所构成的凸壳与负实例点所构成的凸壳相交
    2. 条件推理
    3. 发现矛盾,得出原命题成立

    证明步骤:

    1. 假设原命题不成立:
      设数据集 T T T中的正例点集为 S + S_+ S+ S + S_+ S+的凸壳为 conv ( S + ) \text{conv}(S_+) conv(S+),负实例点集为 S − S_- S S − S_- S的凸壳为 conv ( S − ) \text{conv}(S_-) conv(S)
      假设样本集线性可分,正实例点所构成的凸壳与负实例点所构成的凸壳相交,即存在某个元素 s s s,同时满足 s ∈ conv ( S + ) s \in \text{conv}(S_+) sconv(S+) s ∈ conv ( S − ) s \in \text{conv}(S_-) sconv(S)

    2. 条件推理:
      若数据集 T T T是线性可分的,根据线性可分的定义,则存在一个超平面能够将 S + S_+ S+ S − S_- S完全分离:
      w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0
      对于所有的正例点 x i x_i xi,有
      w ⋅ x i + b = ε i > 0 , i = 1 , 2 , ⋯   , ∣ S + ∣ w \cdot x_i + b = \varepsilon_i > 0, \quad i = 1,2,\cdots,|S_+| wxi+b=εi>0,i=1,2,,S+
      根据凸壳的定义,对于 conv ( S + ) \text{conv}(S_+) conv(S+)中的元素 s + s_+ s+,有
      w ⋅ s + + b = w ⋅ ( ∑ i = 1 ∣ S + ∣ λ i x i ) + b = ( ∑ i = 1 ∣ S + ∣ λ i ( ε i − b ) ) + b = ∑ i = 1 ∣ S + ∣ λ i ε i − ( b ∑ i = 1 ∣ S + ∣ λ i ) + b ( ∵ ∑ i = 1 ∣ S + ∣ λ i = 1 ) = ∑ i = 1 ∣ S + ∣ λ i ε i ws++b=w(|S+|i=1λixi)+b=(|S+|i=1λi(εib))+b=|S+|i=1λiεi(b|S+|i=1λi)+b(|S+|i=1λi=1)=|S+|i=1λiεi ws++b=w(i=1S+λixi)+b=(i=1S+λi(εib))+b=i=1S+λiεi(bi=1S+λi)+b(i=1S+λi=1)=i=1S+λiεi
      因此 w ⋅ s + + b = ∑ i = 1 ∣ S + ∣ λ i ε i > 0 \displaystyle w \cdot s_+ + b = \sum_{i=1}^{|S_+|} \lambda_i \varepsilon_i > 0 ws++b=i=1S+λiεi>0
      同理对于 S − S_- S中的元素 s − s_- s,有 w ⋅ s − + b = ∑ i = 1 ∣ S − ∣ λ i ε i < 0 \displaystyle w \cdot s_- + b = \sum_{i=1}^{|S_-|} \lambda_i \varepsilon_i < 0 ws+b=i=1Sλiεi<0

    3. 找出矛盾,得出原命题成立:
      根据条件推理,当 s ∈ conv ( S + ) s \in \text{conv}(S_+) sconv(S+) w ⋅ s + b = ∑ i = 1 ∣ S + ∣ λ i ε i > 0 \displaystyle w \cdot s + b = \sum_{i=1}^{|S_+|} \lambda_i \varepsilon_i > 0 ws+b=i=1S+λiεi>0,当 s ∈ conv ( S − ) s \in \text{conv}(S_-) sconv(S) w ⋅ s + b = ∑ i = 1 ∣ S − ∣ λ i ε i < 0 \displaystyle w \cdot s + b = \sum_{i=1}^{|S_-|} \lambda_i \varepsilon_i < 0 ws+b=i=1Sλiεi<0,既 s s s不可能同时满足若 s ∈ conv ( S + ) \displaystyle s \in \text{conv}(S_+) sconv(S+) s ∈ conv ( S − ) s \in \text{conv}(S_-) sconv(S),这与假设命题矛盾。

    因此,原命题成立,当样本线性可分时, conv ( S + ) \text{conv}(S_+) conv(S+) conv ( S − ) \text{conv}(S_-) conv(S)必不相交。必要性得证。

    第3步:证明充分性:凸壳不相交 ⇒ \Rightarrow 线性可分

    证明思路:

    1. 根据凸壳不相交,找到一个超平面
    2. 证明这个超平面可将两个互不相交的凸壳分隔开(反证法)
    3. 上述超平面可以将凸壳分隔开,则样本集满足线性可分

    证明步骤:

    1. 根据凸壳不相交,找到一个超平面:
      设数据集 T T T中的正例点集为 S + S_+ S+ S + S_+ S+的凸壳为 conv ( S + ) \text{conv}(S_+) conv(S+),负实例点集为 S − S_- S S − S_- S的凸壳为 conv ( S − ) \text{conv}(S_-) conv(S),且 conv ( S + ) \text{conv}(S_+) conv(S+) conv ( S − ) \text{conv}(S_-) conv(S)不相交。
      定义两个点 x 1 , x 2 x_1,x_2 x1,x2的距离为
      dist ( x 1 , x 2 ) = ∥ x 1 − x 2 ∥ 2 \text{dist}(x_1,x_2) = \|x_1 - x_2\|_2 dist(x1,x2)=x1x22
      定义 conv ( S + ) \text{conv}(S_+) conv(S+) conv ( S − ) \text{conv}(S_-) conv(S)的距离是,分别处于两个凸壳集合中的点的距离最小值:
      dist ( conv ( S + ) , conv ( S − ) ) = min ⁡ ∥ s + − s − ∥ 2 s + ∈ conv ( S + ) , s − ∈ conv ( S − ) \text{dist}(\text{conv}(S_+),\text{conv}(S_-)) = \min \|s_+ - s_-\|_2 \quad s_+ \in \text{conv}(S_+), s_- \in \text{conv}(S_-) dist(conv(S+),conv(S))=mins+s2s+conv(S+),sconv(S)
      记最小值点分别为 x + , x − x_+, x_- x+,x,即:
      dist ( conv ( S + ) , conv ( S − ) ) = dist ( x + , x − ) x + ∈ conv ( S + ) , x − ∈ conv ( S − ) \text{dist}(\text{conv}(S_+),\text{conv}(S_-)) = \text{dist}(x_+, x_-) \quad x_+ \in \text{conv}(S_+), x_- \in \text{conv}(S_-) dist(conv(S+),conv(S))=dist(x+,x)x+conv(S+),xconv(S)
      定义以 ( x + , x − ) (x_+, x_-) (x+,x)为法线,且过两点中点的超平面为 f ( x ∣ w , b ) = 0 f(x|w,b)=0 f(xw,b)=0,则参数为:
      f ( x ∣ w , b ) = ( x + − x − ) T ( x − x + + x − 2 ) { w = ( x + − x − ) T b = − 1 2 ( ∥ x + ∥ 2 2 − ∥ x − ∥ 2 2 ) \displaystyle f(x|w,b)=(x_+-x_-)^T(x - \frac{x_+ + x_-}{2})\\ \left \{ w=(x+x)Tb=12(x+22x22)\right . f(xw,b)=(x+x)T(x2x++x){w=(x+x)Tb=21(x+22x22)

    2. 证明这个超平面可将两个互不相交的凸壳分隔开(反证法)
      若某个超平面可将两个互不相交的凸壳分隔开,则 f ( x ) ≥ 0 , x ∈ conv ( S + ) f(x)≥0, x\in \text{conv}(S_+) f(x)0,xconv(S+) f ( x ) ≤ 0 , x ∈ conv ( S − ) f(x)≤0, x\in \text{conv}(S_-) f(x)0,xconv(S)
      f ( x ) = ( x + − x − ) T ( x − x + + x − 2 ) = ( x + − x − ) T ( x + x + − x + − x + + x − 2 ) = ( x + − x − ) T ( x − x + + x + − x − 2 ) = ( x + − x − ) T ( x − x + ) + ∥ x + − x − ∥ 2 2 2 f(x)=(x+x)T(xx++x2)=(x+x)T(x+x+x+x++x2)=(x+x)T(xx++x+x2)=(x+x)T(xx+)+x+x222 f(x)=(x+x)T(x2x++x)=(x+x)T(x+x+x+2x++x)=(x+x)T(xx++2x+x)=(x+x)T(xx+)+2x+x22
      假设原命题不成立:当 x ∈ conv ( S + ) x\in \text{conv}(S_+) xconv(S+)时,假设 f ( x ) < 0 f(x)<0 f(x)<0,则有:
      ( x + − x − ) T ( x − x + ) < 0 (x_+-x_-)^T(x - x_+) < 0 (x+x)T(xx+)<0
      设点 u = x + + t ( x − x + ) , t ∈ [ 0 , 1 ] u=x_++t(x-x_+), t\in [0,1] u=x++t(xx+),t[0,1],即 u u u x + x_+ x+ x x x的线段上。根据凸壳定义, u ∈ conv ( S + ) u \in \text{conv}(S_+) uconv(S+)。则 u u u x − x_- x距离的平方为:
      g ( t ) = ∥ u − x − ∥ 2 2 = ∥ x + + t ( x − x + ) − x − ∥ 2 2 g(t)=ux22=x++t(xx+)x22
      求解 u u u x − x_- x距离的最小值,对上式求导:
      g ′ ( t ) = 2 ( x + + t ( x − x + ) − x − ) ( x − x + ) = 2 ( x + − x − ) T ( x − x + ) + t ∥ x − x + ∥ 2 2 g(t)=2(x++t(xx+)x)(xx+)=2(x+x)T(xx+)+txx+22
      根据假设,在 t = 0 t=0 t=0时,得 g ′ ( t ) < 0 g'(t)<0 g(t)<0。在当 t t t足够接近于0时(导函数在0处的极限值为负,则存在邻域函数递减),即 g ( t ) < g ( 0 ) g(t)g(t)<g(0)
      ∴ \therefore 存在一点 u u u,使得它到 x − x_- x的距离,比定义的凸壳距离 dist ( x + , x − ) \text{dist}(x_+,x_-) dist(x+,x)还小。产生矛盾。
      故原命题成立,即 f ( x ) ≥ 0 , x ∈ conv ( S + ) f(x)≥0, x\in \text{conv}(S_+) f(x)0,xconv(S+)。同理,可证 f ( x ) ≤ 0 , x ∈ conv ( S − ) f(x)≤0, x\in \text{conv}(S_-) f(x)0,xconv(S)。则可以找到一个超平面将两个互不相交的凸壳分隔开。

    3. 上述超平面可以将凸壳分隔开,则样本集满足线性可分
        根据凸壳定义,数据集 T T T中正例点 s + ∈ conv ( S + ) s_+ \in \text{conv}(S_+) s+conv(S+),负例点 s − ∈ conv ( S − ) s_- \in \text{conv}(S_-) sconv(S)。上述超平面可以将正例点集 S + S_+ S+和负例点集 S − S_- S两个凸壳分隔开,则可以使样本集线性可分。充分性得证。

  • 相关阅读:
    温故而知新——vue常用语法(二)组件
    【不定期更新】什么是Linux内核
    11、Service访问Pod、Service IP原理、DNS访问Service、外部访问service
    Composer交互文档如何在PPT当中使用
    前端面试八股(持续更新)
    shell 脚本部署 helm
    uniapp+uview2.0+vuex实现自定义tabbar组件
    vue cube-ui 搜索栏子组件封装
    Android studio进入手机调试状态
    ue5 小知识点 ue的world type,pie editor game
  • 原文地址:https://blog.csdn.net/huang1024rui/article/details/127711308