第二章-感知机

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

因为异或逻辑线性不可分,证明如下:

训练集中包含4个点,其中正实例点为 x 1 = ( 1 , 0 ) T x_1=(1,0)^\mathrm{T} x1=(1,0)T x 2 = ( 0 , 1 ) T x_2=(0,1)^\mathrm{T} x2=(0,1)T,负实例点为 x 3 = ( 1 , 1 ) T x_3=(1,1)^\mathrm{T} x3=(1,1)T x 4 = ( 0 , 0 ) T x_4=(0,0)^\mathrm{T} x4=(0,0)T。假设存在感知机模型 f ( x ) = sign ⁡ ( w ⋅ x + b ) f(x)=\operatorname{sign}(w \cdot x+b) f(x)=sign(wx+b)可以将两类点准确分类,其中 w = ( u , v ) T w=(u,v)^\mathrm{T} w=(u,v)T,将 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4代入得:
( 1 ) 1 ∗ u + 0 ∗ v + b > 0 ( 2 ) 0 ∗ u + 1 ∗ v + b > 0 ( 3 ) − ( 1 ∗ u + 1 ∗ v + b ) > 0 ( 4 ) − ( 0 ∗ u + 0 ∗ v + b ) > 0 (1)1*u + 0*v + b > 0 \\ (2)0*u + 1*v + b > 0 \\ (3)-(1*u + 1*v + b) > 0 \\ (4)-(0*u + 0*v + b) > 0 (1)1u+0v+b>0(2)0u+1v+b>0(3)(1u+1v+b)>0(4)(0u+0v+b)>0
( 1 ) + ( 2 ) + ( 4 ) (1)+(2)+(4) (1)+(2)+(4) u + v + b > 0 u+v+b > 0 u+v+b>0,与 ( 3 ) (3) (3)矛盾, 所以不存在符合条件的感知机模型。

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

算法的原始形式求感知机模型 f ( x ) = sign ⁡ ( w ⋅ x + b ) f(x)=\operatorname{sign}(w \cdot x+b) f(x)=sign(wx+b)。利用 w ← w + η y i x i w \leftarrow w+\eta y_{i} x_{i} ww+ηyixi b ← b + η y i b \leftarrow b+\eta y_{i} bb+ηyi
进行迭代,其中取学习率 η = 1 \eta = 1 η=1

import numpy as np

def loadData():
    X = np.mat([[3,3], [4,3], [1,1]]) #训练集X
    Y = np.array([1,1,-1]) #对应的训练集标签

    return X, Y

# 迭代
def train1(X, Y, iter=15):
    w = np.array([0 for i in range(X.shape[1])]) #设置w初值
    b = 0 #设置b初值
    eta = 1 #设置学习率

    for i in range(15):
        print("第%d次迭代, w="%i, w, "b=%d"%b)
        flag = True #记录是否有数据误判
        for j  in range(len(Y)):
            x = X[j]
            y = Y[j]
            #若有误判的数据
            if  y * (w*x.T + b) <= 0:
                w = w + eta*y*x #更新w
                b = b + eta*y #更新 b
                flag = False
                break

        if flag:
            break
    return w, b

# 对偶
def train2(X, Y, iter=15):
    N = X.shape[0]
    #设置初值
    alpha = np.array([0 for i in range(N)])
    b = 0
    eta = 1
    #计算Gram矩阵
    G = [[0] * N for i in range(N)]
    for i in range(N):
        for j in range(N):
            G[i][j] = np.asarray(X[i]*X[j].T)[0][0]
    G = np.mat(G)
    print("G = ",G)
    #迭代
    for k in range(iter):
        print("第%d次迭代, alpha="%k, alpha, "b=%d"%b)
        flag = True
        for i  in range(N):
            xi = X[i]
            yi = Y[i]
            #若有误判的数据
            sum = np.sum(alpha*Y*np.asarray(G[i])) + b
            if  Y[i] * sum <= 0:
                alpha[i] = alpha[i] + eta
                b = b + eta*Y[i]
                flag = False
                break
        if flag:
            break
    return alpha, b

X, Y = loadData()
w, b = train(X, Y)
print("最终结果:w=", w, "b=%d"%b)

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

证明:

必要性: 假设样本集 T T T线性可分,则存在一个超平面 w o p t w_{opt} wopt将数据集的正实例点和负实例点完全正确地划分到 的两侧。显然两侧的点分别构成的凸壳不相交;
充分性: 假设存在两个凸壳 A A A B B B相交,且存在超平面 w w w A A A B B B线性分割。令 A A A B B B的凸壳内部的点为 a a a,因为线性可分,则 A A A中不存在两点之间的连线与超平面 w w w相交,而凸壳 B B B中任意一点与 A A A中的点的连线均与超平面 w w w相交,则 B B B内部的点 a a a也与 A A A中任一点之间的连线不与 w w w相交,与 A A A中不存在两点之间的连线与超平面相交矛盾。故只有正负实例点所构成的两个凸壳不相交时样本集才线性可分。

参考文章
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值