1、Minsky與Papert指出:感知機因為是線性模型,所以不能表達復雜的函式,比如異或(XOR),驗證感知機為什么不能表示異或,
解:
下面是異或的運算結果:
異或: 如果兩個值相同則異或操作的結果是0,如果不相同則為1
由此我們可以看到,這也是一個二分類的問題,異或的運算如表所示
| XOR | a | b |
|---|---|---|
| a | 0 | 1 |
| b | 1 | 0 |
方法一:直觀作圖法
如果我們去a = 0, b = 1,將上表的結果畫在二維平面,如下圖,

我們可以看到,對于藍色的圓點和橙色的星星,無論我們怎么畫直線,都不可能將兩者分開,也就是我們不能畫出一條直線,是藍色的圓點位于直線的一側,是兩個橙色的星星位于直線的另外一側,因而,感知機無法表示異或(XOR),
方法二:直接計演算法
設正例的點是:(0, 0)和(1, 1),負例的點是:(1,0)和(0,1)
我們假設這兩類是可以線性分開的,設
f
=
w
1
x
1
+
w
2
x
2
+
b
f = w_{1}x_{1}+w_{2}x_{2}+b
f=w1?x1?+w2?x2?+b為對應的線性模型
由上面的假設可以知道點(0,0)和點(1,1)使
f
>
0
f>0
f>0成立;
而點(1,0)和(0,1)使
f
<
0
f<0
f<0成立,
將點(0,0)和點(1,1)代入我們得到:
{
0
+
0
+
b
>
0
w
1
+
w
2
+
b
>
0
(1)
\left\{ \begin{aligned} 0+0+b>0 \\ w_{1}+w_{2}+b>0 \\ \end{aligned} \right.\tag{1}
{0+0+b>0w1?+w2?+b>0?(1)
將點(1,0)和(0,1)代入我們得到
{
w
1
+
0
+
b
<
0
0
+
w
2
+
b
<
0
(2)
\left\{ \begin{aligned} w_{1}+0+b<0 \\ 0+w_{2}+b<0 \\ \end{aligned} \right.\tag{2}
{w1?+0+b<00+w2?+b<0?(2)
將等式(1)中的兩式相加,我們得到
w
1
+
w
2
+
2
b
>
0
(3)
w_{1}+w_{2}+2b>0\tag{3}
w1?+w2?+2b>0(3)
將等式(2)中的兩式相加我們得到
w
1
+
w
2
+
2
b
<
0
(4)
w_{1}+w_{2}+2b<0\tag{4}
w1?+w2?+2b<0(4)
聯合公式(3)和(4),得出矛盾,因此不能線性可分,
方法3:使用這一章課后題的第三題來做
我們知道連接點(0,0)和(1,1)的直線段和連接點(1,0)和(0,1)的直線段在(0.5,0.5)處相交,也就是兩個點集的凸殼是相交的,因而不可能線性可分,
2、模仿例題2.1,構建從訓練資料集求解感知機模型的例子,
解:
這里不再構造,而是使用python將兩種演算法針對書上的例題2.1,將其實作出來,
import numpy as np
import matplotlib.pyplot as plt
epoch = 10
def Original_Percetron(x, y, lr = 0.1):
'''
Parameters
----------
x : numpy array
訓練資料集.
y : numpy array
訓練集標簽.
lr : float
梯度下降演算法學習率
Returns
-------
回傳引數,并畫出分割超平面.
'''
#先獲取訓練集的維度
s = np.shape(x)
#初始化感知機模型引數
w = np.zeros(shape = (1, s[1]))
b = np.array(0.0)
#下面開始更新模型
for e in range(epoch):
for i in range(s[0]):
x_i = x[i: i + 1]
if y[i] * (np.matmul(w, x_i.T)[0, 0] + b) <= 0:
w = w + lr * y[i] * x_i
b = b + lr * y[i]
print('訓練%d個epoch后引數是:'%epoch, 'w 是:', w, 'b 是:', b)
#下面開始畫圖
num_positive = sum(np.array(y == 1, dtype = np.int64))
plt.scatter(x[:num_positive, 0], x[:num_positive, 1], marker = "*", s = 100)
plt.scatter(x[num_positive:, 0], x[num_positive:, 1], marker="o", s = 100)
x11 = min(x[:,0]) - 1
x12= max(x[:,0]) + 1
x21 = - (w[0, 0] / w[0, 1]) * x11 - b / w[0, 0]
x22 = - (w[0, 0] / w[0, 1]) * x12 - b / w[0, 0]
plt.plot([x11, x12], [x21, x22])
def Dual_Perceptron(x, y, lr = 0.1):
'''
Parameters
----------
x : numpy array
訓練資料集.
y : numpy array
訓練集標簽.
lr : float
梯度下降演算法學習率
Returns
-------
回傳引數,并畫出分割超平面.
'''
s = np.shape(x)
#下面先計算Gram矩陣
G = np.matmul(x, x.T)
alpha = np.zeros(shape = (s[0]))
for e in range(epoch):
for i in range(s[0]):
if y[i] * (sum(lr * alpha * y * G[:, i] + lr * alpha * y)) <= 0:
alpha[i] += 1
#下面開始畫圖
num_positive = sum(np.array(y == 1, dtype = np.int64))
plt.scatter(x[:num_positive, 0], x[:num_positive, 1], marker = "*", s = 100)
plt.scatter(x[num_positive:, 0], x[num_positive:, 1], marker="o", s = 100)
x11 = min(x[:,0]) - 1
x12= max(x[:,0]) + 1
w = np.zeros(shape = (s[1]))
b = 0.0
for i in range(s[0]):
w = w + alpha[i] * y[i] * x[i] * lr
b = b + alpha[i] * lr * y[i]
x21 = - (w[0] / w[1]) * x11 - b / w[0]
x22 = - (w[0] / w[1]) * x12 - b / w[0]
plt.plot([x11, x12], [x21, x22])
if __name__ == '__main__':
x = np.array([[3,3],
[4,3],
[1,1]])
y = np.array([1,1,-1])
Original_Percetron(x, y, lr = 0.1)
Dual_Perceptron(x, y, lr = 0.1)
原始的感知機的輸出:

對偶感知機的輸出:

3、證明一下定理:樣本集線性可分的充分必要條件是正實體點集所構成的凸殼與負實體點集構成的凸殼互不相交,
證明:
充分性:由凸殼不相交推導線性可分
因為正實體和負實體分別構成的凸殼是不相交的,因而,一定有一個超平面將兩個凸殼線性分開,再根據凸殼的定義可以看到,正實體點一定在正實體點集構成的凸殼里面,負實體點一定在負實體點集構成的凸殼內,因而既然可以將兩個凸殼分開,那么也可以將兩類點集分開,
其實這個充分性的證明還是比較顯然的,下面再提供一種數學方面的思路,
設
d
=
i
n
f
x
,
y
d
(
x
,
y
)
(1)
d = \underset{x,y}{inf}\quad d(x,y) \tag{1}
d=x,yinf?d(x,y)(1)
其中
x
,
y
x,y
x,y 分別是兩個凸殼中的點,
d
(
x
,
y
)
d(x,y)
d(x,y) 表示
x
,
y
x,y
x,y 兩點之間的距離,
因為凸殼是閉集,所以一定可以在兩個凸殼內找到兩點
x
,
y
x,y
x,y,使得
x
,
y
x,y
x,y 之間的距離就是這兩個凸殼之間的距離,然后,我們做
x
,
y
x,y
x,y 兩點的垂直平分線,該垂直平分線就是我們要找的分割平面,
必要性:已知線性可分,證明兩個凸殼不相交,
設集合
A
,
B
A,B
A,B分別是正實體和負實體對應的點集,標記
y
A
=
1
,
y
B
=
?
1
y_{A} = 1,y_{B} = -1
yA?=1,yB?=?1,因為
A
,
B
A,B
A,B線性可分,所有設
f
=
w
x
+
b
(2)
f = wx+b\tag{2}
f=wx+b(2)為分割超平面,
所以對于任何一點
x
i
A
∈
A
,
x
j
B
∈
B
x_{i}^{A}\in A,x_{j}^{B}\in B
xiA?∈A,xjB?∈B,我們都有
w
?
x
i
A
+
b
>
0
(3)
w*x_{i}^{A}+b>0\tag{3}
w?xiA?+b>0(3)
w
?
x
j
B
+
b
<
0
(4)
w*x_{j}^{B}+b<0\tag{4}
w?xjB?+b<0(4)
如果兩個凸殼相交,那么一定有集合
A
A
A中的點在
c
o
n
v
(
B
)
conv(B)
conv(B)內或者有集合
B
B
B內的點在凸殼
c
o
n
v
(
A
)
conv(A)
conv(A)內,或者有
c
o
n
v
(
A
)
conv(A)
conv(A)的內點在
c
o
n
v
(
B
)
conv(B)
conv(B)內,
不妨假設前者成立,也即是有集合
A
A
A中的點
x
i
A
x_{i}^{A}
xiA? 在
c
o
n
v
(
B
)
conv(B)
conv(B)內,如果只是
c
o
n
v
(
A
)
conv(A)
conv(A)的 內點
a
a
a 在
c
o
n
v
(
B
)
conv(B)
conv(B)內,因為
a
a
a 是集合
A
A
A中點的線性組合,證明也是類似的,所以我們下面只證明集合
A
A
A中的點
x
i
A
x_{i}^{A}
xiA? 在
c
o
n
v
(
B
)
conv(B)
conv(B)內,
也就是
x
i
A
∈
c
o
n
v
(
B
)
x_{i}^{A}\in conv(B)
xiA?∈conv(B),所以
A
A
A內的點
x
i
A
x_{i}^{A}
xiA?可以被
B
B
B內的點進行凸組合表示,不妨設為:
x
i
A
=
∑
j
=
1
N
λ
j
x
j
B
(5)
x_{i}^{A} = \sum_{j = 1}^{N}\lambda _{j}x_{j}^{B}\tag{5}
xiA?=j=1∑N?λj?xjB?(5)
但是根據公式(3)我們得
w
?
x
i
A
+
b
>
0
w*x_{i}^{A}+b>0
w?xiA?+b>0
但是
w
?
x
i
A
+
b
=
w
?
∑
j
=
1
N
λ
j
x
j
B
+
b
=
∑
j
=
1
N
λ
j
w
x
j
B
+
b
=
∑
j
=
1
N
λ
j
w
x
j
B
+
∑
j
=
1
N
λ
j
b
=
∑
j
=
1
N
λ
j
(
w
?
x
j
B
+
b
)
<
0
(6)
w*x_{i}^{A}+b = w*\sum_{j = 1}^{N}\lambda _{j}x_{j}^{B} + b \\=\sum_{j = 1}^{N}\lambda _{j}wx_{j}^{B}+b \\=\sum_{j = 1}^{N}\lambda _{j}wx_{j}^{B}+\sum_{j = 1}^{N}\lambda _{j}b \\=\sum_{j = 1}^{N}\lambda _{j}(w*x_{j}^{B}+b)<0\tag{6}
w?xiA?+b=w?j=1∑N?λj?xjB?+b=j=1∑N?λj?wxjB?+b=j=1∑N?λj?wxjB?+j=1∑N?λj?b=j=1∑N?λj?(w?xjB?+b)<0(6)
因而矛盾,所以
c
o
n
v
(
A
)
,
c
o
n
v
(
B
)
conv(A),conv(B)
conv(A),conv(B)一定不相交的,
綜上,得證!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/273727.html
標籤:python
