(一)统计学习方法 | 感知机


1 感知机

1.1 简介与定义

感知机是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间中将实例划分为正负两类的分离超平面,属于判别模型。感知机是支持向量机和神经网络的基础

感知机 假设输入空间(特征空间)是 X ⊆ R n \mathcal {X}\subseteq {\bold 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 ) = s i g n ( w ⋅ x + b ) (1) f(x)={\rm sign}(w\cdot x+b)\tag{1} f(x)=sign(wx+b)(1)

称为感知机。

1.2 学习策略

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定模型参数 w , b w,b w,b,需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化。首先写出输入空间 R n {\bold R}^n Rn中的任一点 x 0 x_0 x0到超平面 S S S的距离: 1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x 0 + b ∣ \frac{1}{||w||}|w\cdot x_0+b| w1wx0+b

这里, ∣ ∣ w ∣ ∣ ||w|| w w w w L 2 L_2 L2范数。即 ∣ ∣ w ∣ ∣ = ∑ i = 1 k ∣ w i ∣ 2 ||w||=\sqrt{\sum_{i=1}^k|w_i|^2} w=i=1kwi2

其次,对于误分类点来说,满足: − y i ( w ⋅ x i + b ) > 0 -y_i(w\cdot x_i+b)>0 yi(wxi+b)>0

误分类点 x i x_i xi到超平面 S S S的距离是: − 1 ∣ ∣ w ∣ ∣ y i ( w ⋅ x i + b ) -\frac{1}{||w||}y_i(w\cdot x_i+b) w1yi(wxi+b)

这样,假设超平面 S S S的误分类点集合为 M M M,那么所有误分类点到超平面 S S S的总距离为: − 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w ⋅ x i + b ) -\frac{1}{||w||}\sum_{x_i\in M} y_i(w\cdot x_i+b) w1xiMyi(wxi+b)

如果不考虑前面常数项,上式即得到感知机学习的损失函数。即感知机学习算法是对以下最优化问题的算法。给定一个训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)}

其中, x i ∈ X = R n x_i\in\mathcal {X}={\bold 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,...,N i=1,2,...,N,求参数 w , b w,b w,b,使其为以下损失函数极小化问题的解: min ⁡ w , b L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) (2) \min_{w,b}L(w,b)=-\sum_{x_i\in M}y_i(w\cdot x_i+b)\tag{2} w,bminL(w,b)=xiMyi(wxi+b)(2)

1.3 感知机学习算法的原始形式

输入 训练数据集 T = { ( x 1 , y 2 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_2),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y2),(x2,y2),...,(xN,yN)},其中 x i ∈ X = R n x_i\in\mathcal {X}={\bold 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,...,N i=1,2,...,N;学习率 η ( 0 < η ≤ 1 ) \eta(0<\eta\leq1) η(0<η1)

输出 w , b w,b w,b;感知机模型 f ( x ) = s i g n ( w ⋅ x + b ) f(x)={\rm 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)\leq0 yi(wxi+b)0(误分类数据), w ← w + η y i x i w\leftarrow w+\eta y_ix_i ww+ηyixi

b ← b + η y i b\leftarrow b+\eta y_i bb+ηyi

(4)转至(2),直至训练集中没有误分类点。

例题 设正实例点是 x 1 = ( 3 , 3 ) T x_1=(3,3)^{\rm T} x1=(3,3)T x 2 = ( 4 , 3 ) T x_2=(4,3)^{\rm T} x2=(4,3)T,负实例点是 x 3 = ( 1 , 1 ) T x_3=(1,1)^{\rm T} x3=(1,1)T,使用感知机算法的原始形式求感知机模型 f ( x ) = s i g n ( w ⋅ x + b ) f(x)={\rm sign}(w\cdot x+b) f(x)=sign(wx+b)


(1)定义初值 w 0 = 0 , b 0 = 0 w_0=0,b_0=0 w0=0,b0=0

(2)对于点 x 1 = ( 3 , 3 ) T x_1=(3,3)^{\rm T} x1=(3,3)T,满足上式(3)中的条件则未被正确分类,更新 w , b w,b w,b w 1 = w 0 + y 1 x 1 = ( 3 , 3 ) T ,   b 1 = b 0 + y 1 = 1 w_1=w_0+y_1x_1=(3,3)^{\rm T},\ b_1=b_0+y_1=1 w1=w0+y1x1=(3,3)T, b1=b0+y1=1

得到线性模型 w 1 ⋅ x + b 1 = 3 x ( 1 ) + 3 x ( 2 ) + 1 w_1\cdot x+b_1=3x^{(1)}+3x^{(2)}+1 w1x+b1=3x(1)+3x(2)+1

(3)对于 x 1 , x 2 x_1,x_2 x1,x2,不满足上式(3)则被正确分类,不更新参数。对于点 x 3 = ( 1 , 1 ) T x_3=(1,1)^{\rm T} x3=(1,1)T未被正确分类,更新 w , b w,b w,b w 2 = w 1 + y 3 x 3 = ( 2 , 2 ) T ,   b 2 = b 1 + y 3 = 0 w_2=w_1+y_3x_3=(2,2)^{\rm T},\ b_2=b_1+y_3=0 w2=w1+y3x3=(2,2)T, b2=b1+y3=0

得到线性模型 w 2 ⋅ x + b 2 = 2 x ( 1 ) + 2 x ( 2 ) w_2\cdot x+b_2=2x^{(1)}+2x^{(2)} w2x+b2=2x(1)+2x(2)

如此继续下去,直到 w 7 = ( 1 , 1 ) T , b 7 = − 3 w_7=(1,1)^{\rm T}, b_7=-3 w7=(1,1)T,b7=3

w 7 ⋅ x + b 7 = x ( 1 ) + x ( 2 ) − 3 w_7\cdot x+b_7=x^{(1)}+x^{(2)}-3 w7x+b7=x(1)+x(2)3

此时对于所有的数据点均分类正确,此时的损失函数达到极小。此时的分离超平面为 x ( 1 ) + x ( 2 ) − 3 = 0 x^{(1)}+x^{(2)}-3=0 x(1)+x(2)3=0

感知机模型为 f ( x ) = s i g n ( x ( 1 ) + x ( 2 ) − 3 ) f(x)={\rm sign}(x^{(1)}+x^{(2)}-3) f(x)=sign(x(1)+x(2)3)

1.4 感知机学习算法的收敛性

感知机学习算法的收敛性即对于线性可分的数据集,感知机学习算法的原始形式经过有限次迭代可以得到一个将训练数据集完全正确划分的分离超平面及感知机模型。为了便于叙述和推导,将偏置 b b b并入权重向量 w w w,记作 w ^ = ( w T , b ) T \hat{w}=(w^{\rm T}, b)^{\rm T} w^=(wT,b)T。同时也将输入向量扩充为相同维度,即 x ^ = ( x T , 1 ) T \hat{x}=(x^{\rm T}, 1)^{\rm T} x^=(xT,1)T。这样, x ^ ∈ R n + 1 \hat{x}\in {\bold R}^{n+1} x^Rn+1 w ^ ∈ R n + 1 \hat{w}\in{\bold R}^{n+1} w^Rn+1;同时也满足, w ^ ⋅ x ^ = w ⋅ x + b \hat{w}\cdot \hat{x}=w\cdot x+b w^x^=wx+b

Novikoff定理 设训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)}是线性可分的,其中, x i ∈ X = R n x_i\in\mathcal {X}={\bold 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,...,N i=1,2,...,N,则

(1)存在满足条件的超平面 ∣ ∣ w ^ o p t ∣ ∣ = 1 ||\hat{w}_{\rm opt}||=1 w^opt=1的超平面 w ^ o p t ⋅ x ^ = w o p t ⋅ x + b o p t = 0 \hat{w}_{\rm opt}\cdot \hat {x}=w_{\rm opt}\cdot x+b_{\rm opt}=0 w^optx^=woptx+bopt=0将训练数据集完全分开;且存在 γ > 0 \gamma>0 γ>0,对所有 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 ) ≥ γ (3) y_i(\hat{w}_{\rm opt}\cdot \hat{x}_i)=y_i(w_{\rm opt}\cdot x_i+b_{\rm opt})\geq\gamma\tag{3} yi(w^optx^i)=yi(woptxi+bopt)γ(3)

(2)令 R = max ⁡ 1 ≤ i ≤ N ∣ ∣ x ^ i ∣ ∣ R=\max\limits_{1\leq i\leq N}||\hat{x}_i|| R=1iNmaxx^i,则感知机算法在训练数据集上的误分类次数 k k k满足不等式 k ≤ ( R r ) 2 (4) k\leq \left(\frac{R}{r}\right)^2\tag{4} k(rR)2(4)

证明

(1)由于训练数据集是线性可分的,所以存在超平面可将训练数据集完全正确分开,取此超平面为 w ^ o p t ⋅ x ^ i = w o p t ⋅ x + b o p t = 0 \hat{w}_{\rm opt}\cdot \hat{x}_i=w_{\rm opt}\cdot x+b_{\rm opt}=0 w^optx^i=woptx+bopt=0,使 ∣ ∣ w ^ o p t ∣ ∣ = 1 ||\hat{w}_{\rm opt}||=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}_{\rm opt}\cdot \hat{x}_i)=y_i(w_{\rm opt}\cdot x_i+b_{\rm opt})>0 yi(w^optx^i)=yi(woptxi+bopt)>0

所以存在 γ = min ⁡ i { y i ( w o p t ⋅ x i + b o p t ) } \gamma=\min_i\{y_i(w_{\rm opt}\cdot x_i+b_{\rm opt})\} γ=imin{yi(woptxi+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}_{\rm opt}\cdot \hat{x}_i)=y_i(w_{\rm opt}\cdot x_i+b_{\rm opt})\geq\gamma yi(w^optx^i)=yi(woptxi+bopt)γ

(2)感知机算法从 w ^ 0 = 0 \hat{w}_0=0 w^0=0开始,如果实例被误分类,则更新权重。令 w ^ k − 1 \hat{w}_{k-1} w^k1是第 k k k个误分类实例之前的扩充权重向量,即 w ^ k − 1 = ( w k − 1 T , b k − 1 ) T \hat{w}_{k-1}=(w_{k-1}^{\rm T},b_{k-1})^{\rm T} w^k1=(wk1T,bk1)T

则第 k k k个误分类实例的条件是 y i ( w ^ k − 1 ⋅ x ^ i ) = y i ( w k − 1 ⋅ x i + b k − 1 ) ≤ 0 (5) y_i(\hat{w}_{k-1}\cdot \hat{x}_i)=y_i(w_{k-1}\cdot x_i+b_{k-1})\leq 0\tag{5} yi(w^k1x^i)=yi(wk1xi+bk1)0(5)

( x i , y i ) (x_i,y_i) (xi,yi)是被 w ^ k − 1 = ( w k − 1 T , b k − 1 ) T \hat{w}_{k-1}=(w_{k-1}^{\rm T},b_{k-1})^{\rm T} w^k1=(wk1T,bk1)T误分类的数据,则 w w w b b b的更新是 w k ← w k − 1 + η y i x i w_k\leftarrow w_{k-1}+\eta y_ix_i wkwk1+ηyixi

b k ← b k − 1 + η y i b_k\leftarrow b_{k-1}+\eta y_i bkbk1+ηyi

w ^ k = w ^ k − 1 + η y i x ^ i (6) \hat{w}_k=\hat{w}_{k-1}+\eta y_i\hat{x}_i\tag{6} w^k=w^k1+ηyix^i(6)

先证明以下两个式子 w ^ k ⋅ w ^ o p t ≥ k η γ \hat{w}_k\cdot \hat{w}_{\rm opt}\geq k\eta\gamma w^kw^optkηγ

上式推导过程如下,根据式(6)和式(3) 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 + η γ \begin{aligned} \hat{w}_k\cdot \hat{w}_{\rm opt}&=\hat{w}_{k-1}\cdot \hat{w}_{\rm opt}+\eta y_i\hat{w}_{\rm opt}\cdot \hat{x}_i \\ &\geq \hat{w}_{k-1}\cdot \hat{w}_{\rm opt}+\eta\gamma \end{aligned} w^kw^opt=w^k1w^opt+ηyiw^optx^iw^k1w^opt+ηγ

然后将上式递推得到 w ^ k ⋅ w ^ o p t ≥ w ^ k − 1 ⋅ w ^ o p t + η γ ≥ w ^ k − 2 ⋅ w ^ o p t + 2 η γ ≥ . . . ≥ k n γ \hat{w}_k\cdot \hat{w}_{\rm opt}\geq \hat{w}_{k-1}\cdot \hat{w}_{\rm opt}+\eta\gamma\geq \hat{w}_{k-2}\cdot \hat{w}_{\rm opt}+2\eta\gamma\geq...\geq kn\gamma w^kw^optw^k1w^opt+ηγw^k2w^opt+2ηγ...knγ

证毕。再证明以下式子 ∣ ∣ w ^ k ∣ ∣ 2 ≤ k η 2 R 2 ||\hat{w}_k||^2\leq k\eta^2R^2 w^k2kη2R2

由上面等式,根据式(6)和式(5) ∣ ∣ 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 − 1 ∣ ∣ 2 + η 2 R 2 ≤ ∣ ∣ w ^ k − 2 ∣ ∣ 2 + 2 η 2 R 2 ≤ . . . ≤ k η 2 R 2 \begin{aligned} ||\hat{w}_k||^2&=||\hat{w}_{k-1}||^2+2\eta y_i\hat{w}_{k-1}\cdot \hat{x}_i+\eta^2||\hat{x}_i||^2 \\ &\leq ||\hat{w}_{k-1}||^2+\eta^2||\hat{x}_i||^2 \\ &\leq ||\hat{w}_{k-1}||^2+\eta^2R^2 \\ & \leq ||\hat{w}_{k-2}||^2+2\eta^2R^2\leq ... \\ &\leq k\eta^2R^2 \end{aligned} w^k2=w^k12+2ηyiw^k1x^i+η2x^i2w^k12+η2x^i2w^k12+η2R2w^k22+2η2R2...kη2R2

即得到 k η γ ≤ w ^ k ⋅ w ^ o p t ≤ ∣ ∣ w ^ k ∣ ∣    ∣ ∣ w ^ o p t ∣ ∣ ≤ k η R k\eta\gamma\leq\hat{w}_k\cdot \hat{w}_{\rm opt}\leq||\hat{w}_k||\ \ ||\hat{w}_{\rm opt}||\leq\sqrt{k}\eta R kηγw^kw^optw^k  w^optk ηR

k 2 γ 2 ≤ k R 2 k^2\gamma^2\leq kR^2 k2γ2kR2

于是 k ≤ ( R γ ) 2 k\leq\left(\frac{R}{\gamma}\right)^2 k(γR)2

通过上面两式得到,误分类次数 k k k是有上界的,经过有限次搜索就可以找到将训练数据集完全正确分开的分离超平面。

1.5 感知机学习算法的对偶形式

对偶形式的基本想法是,将 w w w b b b表示为实例 x i x_i xi和标记 y i y_i yi的线性组合的形式,通过求解其系数而求得 w w w b b b。不失一般性,在感知机算法的原始形式中将初始值均设置为0,对误分类点 ( x i , y i ) (x_i,y_i) (xi,yi)通过 w ← w + η y i x i w\leftarrow w+\eta y_ix_i ww+ηyixi

b ← b + η y i b\leftarrow b+\eta y_i bb+ηyi

逐步修改 w w w b b b,则 w w w b b b关于 ( x i , y i ) (x_i,y_i) (xi,yi)的增量分别是 α i y i x i \alpha_iy_ix_i αiyixi α i y i \alpha_iy_i αiyi α i = η i η \alpha_i=\eta_i\eta αi=ηiη。这样,由学习的过程可以得到,最后学习到的 w w w b b b可以分别表示为 w = ∑ i = 1 N α i y i x i w=\sum_{i=1}^N\alpha_iy_ix_i w=i=1Nαiyixi

b = ∑ i = 1 N α i y i b=\sum_{i=1}^N\alpha_iy_i b=i=1Nαiyi

这里, α i ≥ 0 , i = 1 , 2 , . . . , N \alpha_i\geq0,i=1,2,...,N αi0,i=1,2,...,N。当 η = 1 \eta=1 η=1时,表示第 i i i个实例点由于误分而进行更新的次数。实例点更新次数越多,意味着它距离分离超平面更近,也就越难正确分类。

输入 训练数据集 T = { ( x 1 , y 2 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_2),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y2),(x2,y2),...,(xN,yN)},其中 x i ∈ X = R n x_i\in\mathcal {X}={\bold 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,...,N i=1,2,...,N;学习率 η ( 0 < η ≤ 1 ) \eta(0<\eta\leq1) η(0<η1)

输出 α , b \alpha,b α,b;感知机模型 f ( x ) = s i g n ( ∑ j = 1 N α j y j x j ⋅ x + b ) f(x)={\rm sign}(\sum_{j=1}^N\alpha_jy_jx_j\cdot x+b) f(x)=sign(j=1Nαjyjxjx+b),其中 α = ( α 1 , α 2 , . . . , α N ) T \alpha=(\alpha_1,\alpha_2,...,\alpha_N)^{\rm T} α=(α1,α2,...,αN)T

(1) α ← 0 , b ← 0 \alpha\leftarrow0,b\leftarrow0 α0,b0

(2)在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)

(3)如果 y i ( ∑ j = 1 N α j y j x j ⋅ x + b ) ≤ 0 y_i(\sum_{j=1}^N\alpha_jy_jx_j\cdot x+b)\leq0 yi(j=1Nαjyjxjx+b)0 α i ← α i + η \alpha_i\leftarrow\alpha_i+\eta αiαi+η

b ← b + η y i b\leftarrow b+\eta y_i bb+ηyi

(4)转至(2),直至训练集中没有误分类点。

对偶形式中训练实例仅以内积的形式出现。为了方便计算过程,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是 G r a m {\rm Gram} Gram矩阵 G = [ x i ⋅ y i ] N × N G=[x_i\cdot y_i]_{N×N} G=[xiyi]N×N

对于上述例题,使用感知机学习算法的对偶形式。


(1)取 α i = 0 , i = 1 , 2 , 3 , b = 0 , η = 1 \alpha_i=0,i=1,2,3,b=0,\eta=1 αi=0,i=1,2,3,b=0,η=1

(2)计算 G r a m {\rm Gram} Gram矩阵 G = [ 18 21 6 21 25 7 6 7 2 ] G=\left[ \begin{matrix} 18 & 21 & 6\\ 21 & 25 & 7\\ 6 & 7 & 2 \end{matrix} \right] G=1821621257672

(3)误分条件 y i ( ∑ j = 1 N α j y j x j ⋅ x + b ) ≤ 0 y_i\left(\sum_{j=1}^N\alpha_jy_jx_j\cdot x+b\right)\leq0 yi(j=1Nαjyjxjx+b)0

参数更新
α i ← α i + 1 , b ← b + y i \alpha_i\leftarrow\alpha_i+1, b\leftarrow b+y_i αiαi+1,bb+yi

(4)迭代;

(5)结果 w = 2 x 1 + 0 x 2 − 5 x 3 = ( 1 , 1 ) T w=2x_1+0x_2-5x_3=(1,1)^{\rm T} w=2x1+0x25x3=(1,1)T

b = − 3 b=-3 b=3

分离超平面 x ( 1 ) + x ( 2 ) − 3 = 0 x^{(1)}+x^{(2)}-3=0 x(1)+x(2)3=0

感知机模型 f ( x ) = s i g n ( x ( 1 ) + x ( 2 ) − 3 ) f(x)={\rm sign}(x^{(1)}+x^{(2)}-3) f(x)=sign(x(1)+x(2)3)


2. Python实现感知机学习算法

以mnist数据为例实现感知机学习算法的原始形式。首先将下载的数据集解压并转化成csv格式:

def convert(images, labels, out, n):
    # 图像文件
    img = open(images, "rb")
    # 标注文件
    bel = open(labels, "rb")
    # 输出文件
    out = open(out, "w")
    # 指定读入字节数
    img.read(16)
    bel.read(8)
    # 创建列表存放结果
    images = []
    # 读取内容
    for i in range(n):
        # ord函数返回对应字符的ASCII码
        image = [ord(bel.read(1))]
        for j in range(28 * 28):
            image.append(ord(img.read(1)))
        images.append(image)
    # 写入输出文件
    for image in images:
        out.write(",".join(str(pix) for pix in image) + "\n")
    # 关闭文件
    img.close()
    bel.close()
    out.close()

可以使用以下函数查看csv文件内容:

# 读取csv文件,在train.csv中一共包含60000行,28*28+1列
def read_csv(file):
    with open(file) as f:
        reader = csv.reader(f)
        for row in reader:
            # index ['x','x',...,'x']
            # ......
            print(reader.line_num, row)
    f.close()

感知机算法,首先将数据集转化成算法输入格式:

def load_data(file):
    # 定义空列表
    dataArr = []
    labelArr = []
    # 打开并处理文件
    with open(file, "r") as f:
        lines = f.readlines()
        for line in lines:
            # 针对csv文件格式,使用','分割数据
            curLine = line.strip().split(',')
            # 感知机算法是一个二分类算法,定义0-4为-1、5-9为+1
            # csv文件第一列存放着具体类别
            if int(curLine[0]) < 5:
                labelArr.append(-1)
            else:
                labelArr.append(1)
            # 处理具体数据,除以255归一化
            dataArr.append([int(num) / 255 for num in curLine[1:]])
        # 返回
        return dataArr, labelArr

定义感知机的主体函数:

def perceptron(dataArr, labelArr, iteration=50):
    # 转换训练数据格式为矩阵
    # dataMat形状为(rows,cols)
    dataMat = np.mat(dataArr)
    # labelMat形状为(1,rows)
    labelMat = np.mat(labelArr).T
    # 获取矩阵大小
    rows, cols = np.shape(dataMat)
    # 初始化参数
    # w形状为(1,cols),b的运算使用广播机制,η
    w = np.zeros((1, np.shape(dataMat)[1]))
    b = 0
    h = 0.001
    # 迭代训练
    for it in range(iteration):
        for i in range(rows):
            # 获取当前训练数据和标签
            x = dataMat[i]
            y = labelMat[i]
            # 如果是误分类样本,则计算损失和更新参数
            if y * (w * x.T + b) <= 0:
                w = w + h * y * x
                b = b + h * y
        # 打印迭代进度及Loss
        print("Iteration: [{}] / [{}]".format(it, iteration))
    # 返回w和b
    return w, b

基于训练集得到的 w w w b b b在测试集上的表现:

def test(dataArr, labelArr, w_value, b_value):
    # 转换训练数据格式为矩阵
    # dataMat形状为(rows,cols)
    dataMat = np.mat(dataArr)
    # labelMat形状为(1,rows)
    labelMat = np.mat(labelArr).T
    # 获取矩阵大小
    rows, cols = np.shape(dataMat)
    # 统计错误样本数
    errorCnt = 0
    # 遍历测试样本
    for i in range(rows):
        # 获取当前数据和标签
        x = dataMat[i]
        y = labelMat[i]
        # 获得计算结果
        result = y * (w_value * x.T + b_value)
        if 0 >= result:
            errorCnt += 1
    # 计算正确率
    acc = 1 - (errorCnt / rows)
    # 返回准确率
    return acc

3. 感知机学习算法的总结

感知机是一种二分类模型,同时它包含了后面大多数优化算法的雏形,如支持向量机、深度神经网络等:定义损失函数,利用梯度下降法等优化方法对损失函数极小化以求得最终的模型参数。感知机最早在1957年由Rosenblatt提出。Novikoff,Minsky与Papert等人对感知机进行了一系列理论研究。感知机的扩展学习方法包括口袋算法、表决感知机、带边缘感知机等。


参考

  1. 统计学习方法/李航著。—2版。—北京:清华大学出版社,2019(2019.6重印).
  2. https://blog.youkuaiyun.com/qq_40513088/article/details/106760205(minist数据集转化).
  3. https://github.com/Dod-o/Statistical-Learning-Method_Code(感知机算法代码).


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值