感知机是二分类的线性分类模型,分为原始形式和对偶形式。是神经网络和支持向量机的基础。
定义 2.1(感知机) 假设输入空间(特征空间)是 χ ⊆ R n \,\chi\subseteq R^n\, χ⊆Rn,输出空间是 Y = { + 1 , − 1 } \,Y=\{+1,-1\}\, Y={+1,−1}。输入 x ∈ χ \,x\in \chi\, x∈χ,表示实例的特征向量,对应于输入空间(特征空间)的点,输出 y ∈ Y \,y\in Y\, y∈Y表示实例的类别。由输入空间到输出空间的如下函数称为感知机:
f ( x ) = s i g n ( w ⋅ x + b ) 其 中 , w 和 b 是 感 知 机 模 型 的 参 数 . w ∈ R n 叫 做 权 值 , b 叫 做 偏 置 . w ⋅ x 表 示 w 和 x 的 内 积 . s i g n 是 符 号 函 数 , 即 : s i g n ( x ) = { + 1 x ≥ 0 − 1 x < 0 f(x)=sign(w·x+b)\\ 其中,w和b是感知机模型的参数. w\in R^n 叫做权值,b叫做偏置.\\ w·x表示w和x的内积. sign是符号函数,即:\\ sign(x)=\begin{cases} +1 & x\geq0 \\ -1 & x<0 \end{cases} f(x)=sign(w⋅x+b)其中,w和b是感知机模型的参数.w∈Rn叫做权值,b叫做偏置.w⋅x表示w和x的内积.sign是符号函数,即:sign(x)={+1−1x≥0x<0
几何解释:
线性方程
存在的问题:为什么加负号?
w ⋅ x + b = 0 w·x+b=0 w⋅x+b=0
对应于特征空间 R n \, R^n\, Rn中的一个超平面S。其中 w , \, w, w,是超平面的法向量, b \, b\, b是超平面的截距,该超平面将特征空间划分为两部分。因此超平面S成为分离超平面。
对 − b ∣ ∣ w ∣ ∣ -\frac{b}{\mid\mid w\mid\mid} −∣∣w∣∣b的理解:
三维平面下,点到面的距离公式:
其次:
平 面 Π : A x + B y + C z + D = 0 , 法 向 量 为 n ⃗ = ( A , B , C ) 平 面 外 一 点 M 1 ( x 1 , y 1 , z 1 ) 平 面 上 取 一 点 M 0 则 点 M 1 到 Π 的 距 离 : d = ∣ ∣ M 0 M 1 ⃗ ∣ ∣ cos α 其 中 α 是 n ⃗ 与 M 0 M 1 ⃗ 的 夹 角 M 0 M 1 ⃗ ⋅ n ⃗ = ∣ ∣ M 0 M 1 ⃗ ∣ ∣ ⋅ ∣ ∣ n ⃗ ∣ ∣ cos α 因 此 : cos α = M 0 M 1 ⃗ ⋅ n ⃗ ∣ ∣ M 0 M 1 ⃗ ∣ ∣ ⋅ ∣ ∣ n ⃗ ∣ ∣ 故 : d = M 0 M 1 ⃗ ⋅ n ⃗ ∣ ∣ n ⃗ ∣ ∣ 而 : M 0 M 1 ⃗ ⋅ n ⃗ = ∣ A ( x 1 − x 0 ) + B ( y 1 − y 0 ) + C ( z 1 − z 0 ) ∣ 点 M 0 在 平 面 上 , 所 以 M 0 M 1 ⃗ ⋅ n ⃗ = ∣ A x 1 + B y 1 + C z 1 + D ∣ 所 以 : d = ∣ A x 1 + B y 1 + C z 1 + D ∣ ∣ ∣ n ⃗ ∣ ∣ 平面\Pi :Ax+By+Cz+D=0,法向量为\vec{n}=(A,B,C)\\ 平面外一点M_1(x_1,y_1,z_1)\\ 平面上取一点M_0\\ 则点M_1到\Pi 的距离:d=\mid\mid\vec{M_0M_1}\mid\mid\cos \alpha\\ 其中\alpha是\vec{n}与\vec{M_0M_1}的夹角\\ \vec{M_0M_1}·\vec{n}=\mid\mid\vec{M_0M_1}\mid\mid·\mid\mid\vec{n}\mid\mid\cos \alpha\\ 因此:\cos \alpha=\frac{\vec{M_0M_1}·\vec{n}}{\mid\mid\vec{M_0M_1}\mid\mid·\mid\mid\vec{n}\mid\mid}\\ 故:d=\frac{\vec{M_0M_1}·\vec{n}}{\mid\mid\vec{n}\mid\mid}\\ 而:\vec{M_0M_1}·\vec{n}=\mid A(x_1-x_0)+B(y_1-y_0)+C(z_1-z_0)\mid\\ 点M_0在平面上,所以\vec{M_0M_1}·\vec{n}=\mid Ax_1+By_1+Cz_1+D\mid\\ 所以:d=\frac{\mid Ax_1+By_1+Cz_1+D\mid}{\mid\mid\vec{n}\mid\mid}\\ 平面Π:Ax+By+Cz+D=0,法向量为n=(A,B,C)平面外一点M1(x1,y1,z1)平面上取一点M0则点M1到Π的距离:d=∣∣M0M1∣∣cosα其中α是n与M0M1的夹角M0M1⋅n=∣∣M0M1∣∣⋅∣∣n∣∣cosα因此:cosα=∣∣M0M1∣∣⋅∣∣n∣∣M0M1⋅n故:d=∣∣n∣∣M0M1⋅n而:M0M1⋅n=∣A(x1−x0)+B(y1−y0)+C(z1−z0)∣点M0在平面上,所以M0M1⋅n=∣Ax1+By1+Cz1+D∣所以:d=∣∣n∣∣∣Ax1+By1+Cz1+D∣y = w ⋅ x + b 法 向 量 n ⃗ = w D = b 原 点 : x 1 = 0 , y 1 = 0 , z 1 = 0 y=w·x+b\\ 法向量\vec{n}=w\\ D=b 原点:x_1=0,y_1=0,z_1=0 y=w⋅x+b法向量n=wD=b原点:x1=0,y1=0,z1=0
引申到n维,到原点距离:
d = w x + b ∣ ∣ w ∣ ∣ = ∣ b ∣ ∣ ∣ w ∣ ∣ d=\frac{wx+b}{\mid\mid w\mid\mid}=\frac{\mid b \mid}{\mid\mid w\mid\mid} d=∣∣w∣∣wx+b=∣∣w∣∣∣b∣
d = 1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x 0 + b ∣ d=\frac{1}{\mid\mid w \mid \mid}\mid w·x_0+b\mid d=∣∣w∣∣1∣w⋅x0+b∣
− y i ( w ⋅ x i + b ) > 0 -y_i(w·x_i+b)>0 −yi(w⋅xi+b)>0
− 1 ∣ ∣ w ∣ ∣ y i ( w ⋅ x i + b ) -\frac{1}{\mid\mid w\mid\mid}y_i(w·x_i+b) −∣∣w∣∣1yi(w⋅xi+b)
− 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x i + b ) -\frac{1}{\mid\mid w\mid\mid}\sum _{x_i \in M}y_i(w·x_i+b) −∣∣w∣∣1xi∈M∑yi(w⋅xi+b)
L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,b)=-\sum _{x_i \in M}y_i(w·x_i+b) L(w,b)=−xi∈M∑yi(w⋅xi+b)
min w , b L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) \min _{w,b}L(w,b)=-\sum _{x_i \in M}y_i (w·x_i+b) w,bminL(w,b)=−xi∈M∑yi(w⋅xi+b)
∇ w L ( w , b ) = − ∑ x i ∈ M y i x i ∇ b L ( w , b ) = − ∑ x i ∈ M y i \nabla_wL(w,b)=-\sum _{x_i \in M}y_ix_i\\ \nabla_bL(w,b)=-\sum _{x_i \in M}y_i ∇wL(w,b)=−xi∈M∑yixi∇bL(w,b)=−xi∈M∑yi
w ← w + η y i x i b ← b + η y i 其 中 , η 是 步 长 . w\leftarrow w+\eta y_ix_i\\ b\leftarrow b+\eta y_i\\ 其中,\eta 是步长. w←w+ηyixib←b+ηyi其中,η是步长.
"""
正实例点:(3,3),(4,3)
负实例点:(1,1)
"""
import numpy as np
x = np.array([[3, 3], [4, 3], [1, 1]])
y = [1, 1, -1]
eta = 1
w = [0, 0]
b = 0
def is_correct(_x, _y, _w, _b):
"""
判断是否有分类错误的点
:param _x: 点集坐标
:param _y: 真实分类结果
:param _w: 权重
:param _b: 偏置
:return: 是否有错,错误的点的坐标,错误点的序号
"""
flag = -1
_wrong = False
a = 0
for _i in range(0, len(_y)):
if _y[_i] * (np.dot(_x[_i], _w) + _b) <= 0:
flag = _i
_wrong = True
a = _i
break
return _wrong, x[flag], a + 1
def update(_w, _b, _point, _yi):
"""
更新参数
:param _w: 待更新权重
:param _b: 待更新偏置
:param _point: 分类错误点坐标
:param _yi: 分类错误点的真实对应结果
:return: 更新后的w,b
"""
_w = _w + eta * _yi * _point
_b = _b + eta * _yi
return _w, _b
if __name__ == '__main__':
while True:
wrong, point, i = is_correct(x, y, w, b)
if not wrong:
print('over')
break
print('find the ', i, 'point error: ', point)
w, b = update(w, b, point, y[(i - 1)])
print('update w, b: ', w, b)
print('result: ', w, b)
find the 1 point error: [3 3]
update w, b: [3 3] 1
find the 3 point error: [1 1]
update w, b: [2 2] 0
find the 3 point error: [1 1]
update w, b: [1 1] -1
find the 3 point error: [1 1]
update w, b: [0 0] -2
find the 1 point error: [3 3]
update w, b: [3 3] -1
find the 3 point error: [1 1]
update w, b: [2 2] -2
find the 3 point error: [1 1]
update w, b: [1 1] -3
over
result: [1 1] -3
为方便推导,将偏置 b b b并入权重 w w w,即: w ^ = ( w T , b T ) T \hat{w}=(w^T,b^T)^T w^=(wT,bT)T,同时将输入向量加以扩充,加进常数1,记作: x ^ = ( x T , 1 ) T \hat{x}=(x^T,1)^T x^=(xT,1)T.显然(点乘), w ^ ⋅ x ^ = w ⋅ x + b \hat{w}·\hat{x}=w·x+b w^⋅x^=w⋅x+b
(1) 由于数据集线性可分,所以存在超平面将数据集完全正确分开,取此超平面为 w ^ o p t ⋅ x ^ = w o p t ⋅ x + b o p t = 0 \hat{w}_{opt}·\hat{x}=w_{opt}·x+b_{opt}=0 w^opt⋅x^=wopt⋅x+bopt=0,使得(单位化) ∣ ∣ w ^ o p t ∣ ∣ = 1 \mid\mid\hat{w}_{opt}\mid\mid =1 ∣∣w^opt∣∣=1。
对于有限的 i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N,均有(意思是分类正确):
y i ( w ^ o p t ⋅ x ^ i ) = y i ( w o p t ⋅ x i + b o p t ) > 0 y_i(\hat{w}_{opt}·\hat{x}_i)=y_i(w_{opt}·x_i+b_{opt})>0 yi(w^opt⋅x^i)=yi(wopt⋅xi+bopt)>0
所以存在(离直线最近的点):
γ = min i { y i ( w o p t ⋅ x i + b o p t } \gamma=\min _i \{y_i(w_{opt}·x_i+b_{opt}\} γ=imin{yi(wopt⋅xi+bopt}
使得:
y i ( w ^ o p t ⋅ x ^ i ) = y i ( w o p t ⋅ x i + b o p t ) ≥ γ y_i(\hat{w}_{opt}·\hat{x}_i)=y_i(w_{opt}·x_i+b_{opt})\geq\gamma yi(w^opt⋅x^i)=yi(wopt⋅xi+bopt)≥γ
(2) 感知机算法从 w ^ 0 = 0 \hat{w}_0=0 w^0=0开始,如果被误分类,就更新权重。令 w ^ k − 1 \hat{w}_{k-1} w^k−1是第 k k k个误分类实例之前的扩充权重向量,即:
w ^ k − 1 = ( w k − 1 T , b k − 1 ) T \hat{w}_{k-1}=(w_{k-1}^T,b_{k-1})^T\\ w^k−1=(wk−1T,bk−1)T
第k个误分类实例的条件是:
y i ( w ^ o p t ⋅ x ^ i ) = y i ( w o p t ⋅ x i + b o p t ) ≤ 0 y_i(\hat{w}_{opt}·\hat{x}_i)=y_i(w_{opt}·x_i+b_{opt})\leq 0\\ yi(w^opt⋅x^i)=yi(wopt⋅xi+bopt)≤0
若 ( x i , y i ) (x_i,y_i) (xi,yi)是误分类点,则 w w w和 b b b的更新是:
w k ← w k − 1 + η y i x i b k ← b k − 1 + η y i w_k\leftarrow w_{k-1}+\eta y_ix_i\\ b_k\leftarrow b_{k-1}+\eta y_i\\ wk←wk−1+ηyixibk←bk−1+ηyi
即:
w ^ k = w ^ k − 1 + η y i x ^ i \hat{w}_k=\hat{w}_{k-1}+\eta y_i\hat{x}_i w^k=w^k−1+ηyix^i
- 不等式1: w ^ k ⋅ w ^ o p t ≥ k η γ \,\,\hat{w}_k·\hat{w}_{opt}\geq k\eta\gamma w^k⋅w^opt≥kηγ
w ^ k ⋅ w ^ o p t = w ^ k − 1 ⋅ w ^ o p t + η y i w ^ o p t ⋅ x ^ i ≥ w ^ k − 1 ⋅ w ^ o p t + η γ \hat{w}_k·\hat{w}_{opt}=\hat{w}_{k-1}·\hat{w}_{opt}+\eta y_i\hat{w}_{opt}·\hat{x}_i \geq \hat{w}_{k-1}·\hat{w}_{opt}+\eta\gamma\\ w^k⋅w^opt=w^k−1⋅w^opt+ηyiw^opt⋅x^i≥w^k−1⋅w^opt+ηγ
递推得:
w ^ k ⋅ w ^ o p t ≥ w ^ k − 1 ⋅ w ^ o p t + η γ ≥ w ^ k − 2 ⋅ w ^ o p t + 2 η γ ≥ . . . ≥ k η γ \hat{w}_k·\hat{w}_{opt}\geq \hat{w}_{k-1}·\hat{w}_{opt}+\eta\gamma \geq \hat{w}_{k-2}·\hat{w}_{opt}+2\eta\gamma \geq ...\geq k\eta\gamma w^k⋅w^opt≥w^k−1⋅w^opt+ηγ≥w^k−2⋅w^opt+2ηγ≥...≥kηγ- 不等式2: 令 R = max ( 1 ≤ i ≤ N ) ∣ ∣ x ^ i ∣ ∣ , ∣ ∣ w ^ k ∣ ∣ 2 ≤ k η 2 R 2 \,\,令R=\max _{(1\leq i\leq N)} \mid\mid \hat{x}_i\mid\mid,\mid\mid\hat{w}_k\mid\mid^2 \leq k\eta^2R^2 令R=max(1≤i≤N)∣∣x^i∣∣,∣∣w^k∣∣2≤kη2R2
∣ ∣ w ^ k ∣ ∣ 2 = ∣ ∣ w ^ k − 1 ∣ ∣ 2 + 2 η y i w ^ k − 1 ⋅ x ^ i + η 2 ∣ ∣ x ^ i ∣ ∣ 2 ≤ ∣ ∣ w ^ k − 1 ∣ ∣ 2 + η 2 ∣ ∣ x ^ i ∣ ∣ 2 ≤ ∣ ∣ w ^ k − 2 ∣ ∣ 2 + 2 η 2 ∣ ∣ x ^ i ∣ ∣ 2 ≤ . . . ≤ k η 2 R 2 \mid\mid\hat{w}_k\mid\mid^2=\mid\mid\hat{w}_{k-1}\mid\mid^2+2\eta y_i\hat{w}_{k-1}·\hat{x}_i+\eta^2\mid\mid \hat{x}_i\mid\mid^2\\ \leq \mid\mid\hat{w}_{k-1}\mid\mid^2+\eta^2\mid\mid \hat{x}_i\mid\mid^2\\ \leq \mid\mid\hat{w}_{k-2}\mid\mid^2+2\eta^2\mid\mid \hat{x}_i\mid\mid^2\\ \leq ... \leq k\eta^2 R^2 ∣∣w^k∣∣2=∣∣w^k−1∣∣2+2ηyiw^k−1⋅x^i+η2∣∣x^i∣∣2≤∣∣w^k−1∣∣2+η2∣∣x^i∣∣2≤∣∣w^k−2∣∣2+2η2∣∣x^i∣∣2≤...≤kη2R2
结合两个不等式:
k η γ ≤ w ^ k ⋅ w ^ o p t ≤ ∣ ∣ w ^ k ∣ ∣ ∣ ∣ w ^ o p t ∣ ∣ ⏞ 柯 西 不 等 式 ≤ k η R k\eta\gamma\leq \overbrace{\hat{w}_k·\hat{w}_{opt}\leq \mid\mid\hat{w}_k\mid\mid \mid\mid\hat{w}_{opt}\mid\mid }^{柯西不等式}\leq \sqrt{k}\eta R kηγ≤w^k⋅w^opt≤∣∣w^k∣∣∣∣w^opt∣∣ 柯西不等式≤kηR
∣ ∣ w ^ o p t ∣ ∣ = 1 \mid\mid\hat{w}_{opt}\mid\mid=1 ∣∣w^opt∣∣=1是为了:
w = ∑ i = 1 N n i η y i x i b = ∑ i = 1 N n i η y i w=\sum _{i=1}^N n_i\eta y_ix_i\\ b=\sum _{i=1}^N n_i\eta y_i\\ w=i=1∑Nniηyixib=i=1∑Nniηyi
y i ( w ⋅ x i + b ) ≤ 0 y_i(w·x_i+b)\leq 0 yi(w⋅xi+b)≤0
y i ( ∑ j = 1 N n j η y j x j ⋅ x i + b ) ≤ 0 y_i(\sum _{j=1}^N n_j\eta y_jx_j·x_i+b)\leq 0 yi(j=1∑Nnjηyjxj⋅xi+b)≤0
"""
正实例点:(3,3),(4,3)
负实例点:(1,1)
"""
import numpy as np
x = np.array([[3, 3], [4, 3], [1, 1]])
n = len(x)
y = [1, 1, -1]
eta = 1
w = [0, 0]
b = 0
alpha = np.zeros(n, dtype=np.int)
def is_correct(_point, _label, _row, _g):
"""
判断是否分类正确
:param _point: 判断点
:param _label: 该点真实标签
:param _row: 该点序号
:param _g: Gram矩阵
:return: 对偶形式计算结果
"""
global b
_wrong = False
temp = 0
for _j in range(n):
temp += eta * alpha[_j] * _label[_j] * _g[_j][_row]
temp += b
temp *= _label[_row]
return temp
def update(_i, _y):
"""
更新参数
:param _i: 序号
:param _y: 真实标签
:return: None
"""
global b, alpha
alpha[_i] += eta
b += eta * _y[_i]
def main():
ok = False
G = np.zeros((n, n), dtype=np.int) # 对称阵
for i in range(0, 3):
for j in range(0, 3):
G[i][j] = x[i][0] * x[j][0] + x[i][1] * x[j][1]
while not ok:
for i in range(n):
if is_correct(x[i], y, i, G) <= 0:
update(i, y)
print(alpha, b)
break
elif i == n - 1:
ok = True
print(alpha, b)
if __name__ == '__main__':
main()
[1 0 0] 1
[1 0 1] 0
[1 0 2] -1
[1 0 3] -2
[2 0 3] -1
[2 0 4] -2
[2 0 5] -3
[2 0 5] -3