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(w⋅x+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)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
)
+
(
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(w⋅x+b)。利用
w
←
w
+
η
y
i
x
i
w \leftarrow w+\eta y_{i} x_{i}
w←w+ηyixi,
b
←
b
+
η
y
i
b \leftarrow b+\eta y_{i}
b←b+η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中不存在两点之间的连线与超平面相交矛盾。故只有正负实例点所构成的两个凸壳不相交时样本集才线性可分。