感知器模型分析及实现

  • 1. 感知器模型
  • 2. 几何意义
  • 3. 感知器模型的训练
  • 4. 批处理训练过程
    • 4.1 训练数据的规范化
    • 4.2 批处理感知器算法
  • 实现代码

\qquad 感知器 (perceptron) \text{(perceptron)} (perceptron) 本质上是一个线性模型,可以实现“线性分类”。

1. 感知器模型

\qquad 假设输入样本 x = [ x 1 , x 2 , ⋯ , x m ] T ∈ R m \boldsymbol x=[x_1,x_2,\cdots,x_m]^T\in R^m x=[x1​,x2​,⋯,xm​]T∈Rm,感知器实现线性分类的效果主要取决于权值 w = [ w 1 , w 2 , ⋯ , w m ] T \boldsymbol w=[w_1,w_2,\cdots,w_m]^T w=[w1​,w2​,⋯,wm​]T 和偏置 b b b 的大小。

\qquad 感知器包含一个线性组合器 (linear combiner) \text{(linear\ combiner)} (linear combiner)和激活过程 (activation) \text{(activation)} (activation),其结构如图 1 1 1 所示:
\qquad

图1 From Fig 1.1 《Neural Networks and Learning Machines》

\qquad 显然,由图 1 1 1 可以得到:

( 1 ) \qquad(1) (1) 线性组合器的输出: v = w T x + b v=\boldsymbol w^T\boldsymbol x+b v=wTx+b

( 2 ) \qquad(2) (2) 感知器的输出是对线性组合器的输出进行激活的结果: y = φ ( v ) y=\varphi(v) y=φ(v)

\qquad 常用的激活函数 (activation function) \text{(activation\ function)} (activation function) 可以是符号函数 sgn ( ⋅ ) \text{sgn}(\cdot) sgn(⋅),本文采用的是:

y = φ ( v ) = { 1 , w T x + b > 0 0 , w T x + b ≤ 0 \qquad\qquad y=\varphi(v)=\left\{\begin{matrix}1&,\quad\boldsymbol w^T\boldsymbol x+b>0\\ \\0&,\quad\boldsymbol w^T\boldsymbol x+b\le0\end{matrix}\right. y=φ(v)=⎩ ⎨ ⎧​10​,wTx+b>0,wTx+b≤0​

实际上就是一个神经元模型

\qquad 一般地,为了更好地表示线性模型,将感知器模型描述为图 2 2 2 中的表示:
\qquad

图2 From Fig 1.3 《Neural Networks and Learning Machines》

\qquad 如图 2 2 2 所示,将感知器模型中的偏置 b b b 也看作是一个权值 w 0 w_0 w0​,那么:

w ^ = [ b , w T ] T = [ w 0 , w 1 , w 2 , ⋯ , w m ] T \qquad\qquad\hat{\boldsymbol w}=[b,\boldsymbol w^T]^T=[w_0,w_1,w_2,\cdots,w_m]^T w^=[b,wT]T=[w0​,w1​,w2​,⋯,wm​]T, w 0 = b w_0=b w0​=b

\qquad 为了便于用向量表示线性模型,将训练样本 x = [ x 1 , x 2 , ⋯ , x m ] T \boldsymbol x=[x_1,x_2,\cdots,x_m]^T x=[x1​,x2​,⋯,xm​]T 进行扩展:

x ^ = [ 1 , x T ] T = [ 1 , x 1 , x 2 , ⋯ , x m ] T \qquad\qquad\hat{\boldsymbol x}=[1,\boldsymbol x^T]^T=[1,x_1,x_2,\cdots,x_m]^T x^=[1,xT]T=[1,x1​,x2​,⋯,xm​]T, x 0 = 1 x_0=1 x0​=1

\qquad 因此,图 2 2 2 中的感知器模型可以表示为:

( 1 ) \qquad(1) (1) 线性组合器的输出

v = w T x + b = w ^ T x ^ \qquad\qquad v=\boldsymbol w^T\boldsymbol x+b=\hat{\boldsymbol w}^T\hat{\boldsymbol x} v=wTx+b=w^Tx^

( 2 ) \qquad(2) (2) 感知器的输出

y = φ ( v ) = { 1 , w ^ T x ^ > 0 0 , w ^ T x ^ ≤ 0 \qquad\qquad y=\varphi(v)=\left\{\begin{matrix}1&,\quad\hat{\boldsymbol w}^T\hat{\boldsymbol x}>0\\ \\0&,\quad\hat{\boldsymbol w}^T\hat{\boldsymbol x}\le0\end{matrix}\right. y=φ(v)=⎩ ⎨ ⎧​10​,w^Tx^>0,w^Tx^≤0​

【注】为了方便表示,本文后续部分直接使用 x \boldsymbol x x 代替 x ^ \hat{\boldsymbol x} x^,用 w \boldsymbol w w 代替 w ^ \hat{\boldsymbol w} w^

\qquad

2. 几何意义

  • 线性可分的情况——图 3 ( a ) 3(a) 3(a)

\qquad 以输入样本 x = [ x 1 , x 2 ] T ∈ R 2 \boldsymbol x=[x_1,x_2]^T\in R^2 x=[x1​,x2​]T∈R2 为例,在图 3 ( a ) 3(a) 3(a) 中有 4 4 4 个训练样本: x 1 = [ 0 , 0 ] T , x 2 = [ 1 , 0 ] T , x 3 = [ 1 , 1 ] T , x 4 = [ 0 , 1 ] T \boldsymbol x_1=[0,0]^T,\boldsymbol x_2=[1,0]^T,\boldsymbol x_3=[1,1]^T,\boldsymbol x_4=[0,1]^T x1​=[0,0]T,x2​=[1,0]T,x3​=[1,1]T,x4​=[0,1]T,其中 x 1 ∈ ℓ 1 \boldsymbol x_1\in\ell_1 x1​∈ℓ1​,其余样本属于 ℓ 2 \ell_2 ℓ2​。

\qquad 感知器的参数 w = [ b , w 1 , w 2 ] T \boldsymbol w=[b,w_1,w_2]^T w=[b,w1​,w2​]T 实际上是在 R 2 R^2 R2 中确定了一条直线,如图 3 ( a ) 3(a) 3(a) 所示,能够将正例和负例进行区分的直线并不只有一种选择。
\qquad

图3 感知器模型的几何意义(线性可分、线性不可分)

  • 线性不可分的情况——图 3 ( b ) , ( c ) 3(b),(c) 3(b),(c) “异或”问题

\qquad 异或问题无法使用 1 1 1 条直线(分类面)来实现,或者在图 3 ( b ) 3(b) 3(b) 中使用 2 2 2 条直线来区分,或者使用图 3 ( c ) 3(c) 3(c) 中的不规则分类面。

\qquad 图 3 ( b ) 3(b) 3(b) 中使用 2 2 2 条直线实现对数据集的分类,实际上就是采用多层感知器 (multilayer  perceptron,MLP) \text{(multilayer \ perceptron,MLP)} (multilayer  perceptron,MLP) 的结构来实现。

\qquad

3. 感知器模型的训练

\qquad 感知器的训练过程,就是为了确定模型的参数 { b , w 1 , w 2 , ⋯ , w m } \{b,w_1,w_2,\cdots,w_m\} {b,w1​,w2​,⋯,wm​}。以图 4 4 4 为例,也就是为了确定 R 2 R^2 R2 中的某条直线的参数 { b , w 1 , w 2 } \{b,w_1,w_2\} {b,w1​,w2​}。
\qquad

图4 感知器的作用是,确定 R 2 R^2 R2 中的分界面(直线)将 ℓ 1 \ell_1 ℓ1​ 和 ℓ 2 \ell_2 ℓ2​ 分隔开

\qquad 线性组合器的输出:      v = w T x v=\boldsymbol w^T\boldsymbol x v=wTx

\qquad 感知器的(实际)输出值:   y = φ ( v ) = { 1 , w T x > 0 ⟹ x ∈ ℓ 1 0 , w T x ≤ 0 ⟹ x ∈ ℓ 2 y=\varphi(v)=\left\{\begin{matrix}1&,\boldsymbol w^T\boldsymbol x>0&\Longrightarrow\boldsymbol x\in\ell_1\\ \\0&,\boldsymbol w^T\boldsymbol x\le0&\Longrightarrow\boldsymbol x\in\ell_2\end{matrix}\right. y=φ(v)=⎩ ⎨ ⎧​10​,wTx>0,wTx≤0​⟹x∈ℓ1​⟹x∈ℓ2​​

\qquad 考虑训练样本集:

{ x n , t n } ∣ n = 1 N , x n ∈ R m \qquad\qquad\{\boldsymbol x_n,t_n\}\big |_{n=1}^{N},\boldsymbol x_n\in R^m {xn​,tn​} ​n=1N​,xn​∈Rm,其中 t n ∈ { 0 , 1 } t_n\in\{0,1\} tn​∈{0,1} 为(期望输出的)目标值

\qquad\qquad 对于训练样本 x n \boldsymbol x_n xn​,其目标值 t n = { 1 , x n ∈ ℓ 1 0 , x n ∈ ℓ 2 t_n=\left\{\begin{matrix}1&,\boldsymbol x_n\in\ell_1\\ \\0&,\boldsymbol x_n\in\ell_2\end{matrix}\right. tn​=⎩ ⎨ ⎧​10​,xn​∈ℓ1​,xn​∈ℓ2​​

\qquad
\qquad 训练规则基于“误差修正学习”:

w n e w = w o l d − η ( y n − t n ) x n \qquad\qquad\qquad\boldsymbol w^{new}=\boldsymbol w^{old}-\eta(y_n-t_n)\boldsymbol x_n wnew=wold−η(yn​−tn​)xn​, 其中 η \eta η 为学习率

(1)若感知器的输出值 y n y_n yn​ 与目标值 t n t_n tn​ 一致时,说明分类面正确区分了当前的训练样本,不需要改变当前分类面,无需调整权值, w n e w = w o l d \boldsymbol w^{new}=\boldsymbol w^{old} wnew=wold
(2)若感知器的输出值 y n y_n yn​ 与目标值 t n t_n tn​ 不一致,说明分类面错误区分了当前的训练样本,需要调整权值的大小,来改变分类面的方向,使得当前样本 x n \boldsymbol x_n xn​ 能够被正确划分

\qquad 考虑具体样本时的“误差修正学习”规则:

  • 当训练样本 x n ∈ ℓ 1 ( t n = 1 ) \boldsymbol x_n\in \ell_1\ (t_n=1) xn​∈ℓ1​ (tn​=1) 被送入感知器

⟶ \quad\longrightarrow ⟶ 若输出值 y n = 1 y_n=1 yn​=1(判定 x n ∈ ℓ 1 \boldsymbol x_n\in \ell_1 xn​∈ℓ1​,无误差),权值不会发生改变 w n e w = w o l d \boldsymbol w^{new}=\boldsymbol w^{old} wnew=wold
⟶ \quad\longrightarrow ⟶ 若输出值 y n = 0 y_n=0 yn​=0(判定 x n ∈ ℓ 2 \boldsymbol x_n\in \ell_2 xn​∈ℓ2​,有误差),权值更新为 w n e w = w o l d + η x n \boldsymbol w^{new}=\boldsymbol w^{old}+\eta\boldsymbol x_n wnew=wold+ηxn​
\qquad

图5 权值更新公式 w n e w = w o l d + η x n \boldsymbol w^{new}=\boldsymbol w^{old}+\eta\boldsymbol x_n wnew=wold+ηxn​ 中取 “ + ” “+” “+” 号的解释【当训练样本 x n \boldsymbol x_n xn​ 被错误划分】
(1)当训练样本 x n ∈ ℓ 1 \boldsymbol x_n\in \ell_1 xn​∈ℓ1​ 被(旧的)蓝色分类面错误划分,取 “ + ” “+” “+” 号调整权值,才能让旧的分类面旋转到能够正确划分 x n \boldsymbol x_n xn​ 的红色分类面的方向
(2)训练过程中,学习率 η \eta η 决定了权值变化的幅度(图中为 η = 1 \eta=1 η=1)
(3)已经正确划分的样本不会改变权值,训练过程只会针对图中 x n \boldsymbol x_n xn​ 样本,通过一步步调整 η x n \eta\boldsymbol x_n ηxn​(蓝色虚线向量) 来实现正确划分

  • 当训练样本 x n ∈ ℓ 2 ( t n = 0 ) \boldsymbol x_n\in \ell_2\ (t_n=0) xn​∈ℓ2​ (tn​=0) 被送入感知器

⟶ \quad\longrightarrow ⟶ 若输出值 y n = 0 y_n=0 yn​=0(判定 x n ∈ ℓ 2 \boldsymbol x_n\in \ell_2 xn​∈ℓ2​,无误差),权值不会发生改变 w n e w = w o l d \boldsymbol w^{new}=\boldsymbol w^{old} wnew=wold
⟶ \quad\longrightarrow ⟶ 若输出值 y n = 1 y_n=1 yn​=1(判定 x n ∈ ℓ 1 \boldsymbol x_n\in \ell_1 xn​∈ℓ1​,有误差),权值更新为 w n e w = w o l d − η x n \boldsymbol w^{new}=\boldsymbol w^{old}-\eta\boldsymbol x_n wnew=wold−ηxn​
\qquad

图6 权值更新公式 w n e w = w o l d − η x n \boldsymbol w^{new}=\boldsymbol w^{old}-\eta\boldsymbol x_n wnew=wold−ηxn​ 中取 “ + ” “+” “+” 号的解释【当训练样本 x n \boldsymbol x_n xn​ 被错误划分】
(1)当训练样本 x n ∈ ℓ 2 \boldsymbol x_n\in \ell_2 xn​∈ℓ2​ 被(旧的)蓝色分类面错误划分,取 “ − ” “-” “−” 号调整权值,才能让旧的分类面旋转到能够正确划分 x n \boldsymbol x_n xn​ 的红色分类面的方向
(2)训练过程中,学习率 η \eta η 决定了权值变化的幅度(图中为 η = 1 \eta=1 η=1)
(3)已经正确划分的样本不会改变权值,训练过程只会针对图中 x n \boldsymbol x_n xn​ 样本,通过一步步调整 η x n \eta\boldsymbol x_n ηxn​(蓝色虚线向量) 来实现正确划分

\qquad

4. 批处理训练过程

4.1 训练数据的规范化

\qquad 由图 4 4 4,假设分类面 w T x + b = 0 \boldsymbol w^T\boldsymbol x+b=0 wTx+b=0 可以实现正确的分类。那么对于训练样本 x n \boldsymbol x_n xn​ 而言,如果 w T x n > 0 \boldsymbol w^T\boldsymbol x_n>0 wTxn​>0,则 x n ∈ ℓ 1 \boldsymbol x_n\in\ell_1 xn​∈ℓ1​,如果 w T x n < 0 \boldsymbol w^T\boldsymbol x_n<0 wTxn​<0,则 x n ∈ ℓ 2 \boldsymbol x_n\in\ell_2 xn​∈ℓ2​。
\qquad

图7 训练数据的规范化过程【取自《模式分类》Fig 5.8】
图 (a) 为原始训练数据,黑色训练样本满足 w T x 1 > 0 \boldsymbol w^T\boldsymbol x_1>0 wTx1​>0,红色训练样本满足 w T x 2 < 0 \boldsymbol w^T\boldsymbol x_2<0 wTx2​<0
图 (b) 为规范化后的数据,红色样本点取反后,满足 w T ( − x 2 ) > 0 \boldsymbol w^T(\textcolor{red}{-\boldsymbol x_2})>0 wT(−x2​)>0

\qquad 训练数据的规范化 (normalization) \text{(normalization)} (normalization) 操作可以简化训练过程的描述:
\qquad (1)考虑 x ∈ ℓ 1 \boldsymbol x\in\ell_1 x∈ℓ1​ 类中训练数据满足 w T x > 0 \boldsymbol w^T\boldsymbol x>0 wTx>0
\qquad (2)将 x ∈ ℓ 2 \boldsymbol x\in\ell_2 x∈ℓ2​ 类中训练数据取反: w T x < 0 ⟹ w T ( − x ) > 0 \boldsymbol w^T\boldsymbol x<0\Longrightarrow\boldsymbol w^T(-\boldsymbol x)>0 wTx<0⟹wT(−x)>0
\qquad (3)此时,寻找权向量 w \boldsymbol w w 只需要针对新的数据集 ℓ = ℓ 1 ∪ { − ℓ 2 } \bold\ell=\ell_1\cup\{-\ell_2\} ℓ=ℓ1​∪{−ℓ2​} ,计算 w T x > 0 , x ∈ ℓ \boldsymbol w^T\boldsymbol x>0,\boldsymbol x\in\bold\ell wTx>0,x∈ℓ 即可。

或者也可以将数据集 { x n , t n } \{\boldsymbol x_n,t_n\} {xn​,tn​} 的目标值定义为 t n = { + 1 , x n ∈ ℓ 1 ( w T x n > 0 ) − 1 , x n ∈ ℓ 2 ( w T x n < 0 ) t_n=\begin{cases}+1&,\boldsymbol x_n\in\ell_1\ (\boldsymbol w^T\boldsymbol x_n>0)\\-1&,\boldsymbol x_n\in\ell_2\ (\boldsymbol w^T\boldsymbol x_n<0)\end{cases} tn​={+1−1​,xn​∈ℓ1​ (wTxn​>0),xn​∈ℓ2​ (wTxn​<0)​
显然,数据集满足: t n w T x n > 0 t_n\boldsymbol w^T\boldsymbol x_n>0 tn​wTxn​>0

\qquad

4.2 批处理感知器算法

\qquad 定义感知器的代价函数(损失函数):

J ( w ) = ∑ x ∈ X ( − w T x ) \qquad\qquad\qquad J(\boldsymbol w)=\displaystyle\sum_{\boldsymbol x\in \mathcal X}(-\boldsymbol w^T\boldsymbol x) J(w)=x∈X∑​(−wTx)

\qquad 其中, X \mathcal X X 表示“被错误划分的”训练样本集。

\qquad 若 x ∈ ℓ 1 \boldsymbol x\in\ell_1 x∈ℓ1​ 被错分,那么 w T x < 0 \boldsymbol w^T\boldsymbol x<0 wTx<0;若 x ∈ ℓ 2 \boldsymbol x\in\ell_2 x∈ℓ2​ 被错分,那么 w T ( − x ) < 0 \boldsymbol w^T(-\boldsymbol x)<0 wT(−x)<0 。因此,选择 ∑ x ∈ X ( − w T x ) \sum_{\boldsymbol x\in \mathcal X}(-\boldsymbol w^T\boldsymbol x) ∑x∈X​(−wTx) 作为代价函数时,一般而言,被错分的训练样本越多,代价函数的值就越大;被错分的训练样本越少,代价函数的值就越小。

\qquad 如果 X \mathcal X X 为空集(线性可分数据),则表明所有训练样本都被正确分类,代价函数的值为 0 0 0。

代价函数也可以采用“点到超平面的距离”来刻画:
(1) 任意点 x i \boldsymbol x_i xi​ 到超平面 y = w T x + b y=\boldsymbol w^T\boldsymbol x+b y=wTx+b 的距离为 r = w T x i + b ∥ w ∥ r=\dfrac{\boldsymbol w^T\boldsymbol x_i+b}{\Vert\boldsymbol w \Vert} r=∥w∥wTxi​+b​,简记为 r = w T x i ∥ w ∥ r=\dfrac{\boldsymbol w^T\boldsymbol x_i}{\Vert\boldsymbol w \Vert} r=∥w∥wTxi​​
(2) 规范化数据: { x ∈ ℓ 1 ⟹ w T x > 0 x ∈ ℓ 2 ⟹ w T ( − x ) > 0 \begin{cases}\boldsymbol x\in\ell_1\Longrightarrow\boldsymbol w^T\boldsymbol x>0\\\boldsymbol x\in\ell_2\Longrightarrow\boldsymbol w^T(-\boldsymbol x)>0\end{cases} {x∈ℓ1​⟹wTx>0x∈ℓ2​⟹wT(−x)>0​
 
(3) 代价函数 J ( w ) = ∑ x ∈ X ( − w T x ) ∼ ∑ x ∈ X − w T x ∥ w ∥ J(\boldsymbol w)=\displaystyle\sum_{\boldsymbol x\in \mathcal X}(-\boldsymbol w^T\boldsymbol x)\sim\displaystyle\sum_{\boldsymbol x\in \mathcal X}\dfrac{-\boldsymbol w^T\boldsymbol x}{\Vert\boldsymbol w \Vert} J(w)=x∈X∑​(−wTx)∼x∈X∑​∥w∥−wTx​ 定义为“所有误分点到超平面的总距离”。
 
显然,被误分的点也越少,误分点离超平面越近,这个总距离也越小。如果没有误分点,那么代价函数值为0。

\qquad 采用梯度下降法求解:

∇ J ( w ) = ∂ J ( w ) ∂ w = ∑ x ∈ X ( − x ) \qquad\qquad \nabla J(\boldsymbol w)=\dfrac{\partial J(\boldsymbol w)}{\partial \boldsymbol w}=\displaystyle\sum_{\boldsymbol x\in \mathcal X}(-\boldsymbol x) ∇J(w)=∂w∂J(w)​=x∈X∑​(−x)

w n e w = w o l d − η ∇ J ( w ) \qquad\qquad \boldsymbol w^{new}=\boldsymbol w^{old}-\eta\nabla J(\boldsymbol w) wnew=wold−η∇J(w)

\qquad 因此,迭代公式为:

w n e w = w o l d + η ∑ x ∈ X x \qquad\qquad \boldsymbol w^{new}=\boldsymbol w^{old}+\eta\displaystyle\sum_{\boldsymbol x\in \mathcal X}\boldsymbol x wnew=wold+ηx∈X∑​x

\qquad

实现代码

import numpy as np
import matplotlib.pyplot as pltdef singleperceptron(xhat,target,eta,mode='seq'):       iteration = 0flag = 1if mode=='seq':weight = np.random.random(xhat.shape[1])*2-1y = np.zeros((len(xhat),1)) while flag:                # sequentialfor i in range(len(xhat)):tmp = np.dot(weight,xhat[i,:])if tmp > 0:y[i] = 1else:y[i] = 0                          weight = weight - eta*(y[i]-target[i])*xhat[i,:]               print(weight)  iteration = iteration + 1if np.sum(np.abs(y-target))==0:#此处的迭代终止条件只针对线性可分数据flag = 0    if mode=='batch':weight = np.random.random((xhat.shape[1],1))*2-1xhat1 = xhat*np.where(target>0,1,-1)print(weight.flatten())while flag:             # batchy1 = np.dot(xhat,weight)y1 = np.where(y1>0,1,0)t = np.dot(xhat1.T, np.abs(y1-target))weight += eta*tprint(weight.flatten())         iteration = iteration + 1   if np.sum(t)==0:#此处的迭代终止条件只针对线性可分数据flag = 0weight = weight.flatten()/np.sum(weight)       return weightdef gen_lineardata(weight,interval):y = -(weight[0]*interval + weight[2])/weight[1]return ydef halfmoon(rad, width, dist, n_samp):      if n_samp%2 != 0:  n_samp += 1      data = np.zeros((3,n_samp))      rd = np.random.random((2,n_samp//2))  radius = (rad-width//2) + width*rd[0,:] theta = np.pi*rd[1,:]          x1     = radius*np.cos(theta)  y1     = radius*np.sin(theta) + dist/2  label1 = np.ones((1,len(x1)))           # label= 1 for Class 1        x2    = radius*np.cos(-theta) + rad  y2    = radius*np.sin(-theta) - dist/2  label2= np.zeros((1,len(x2)))           # label= 0 for Class 2       data[0,:]=np.concatenate([x1,x2])data[1,:]=np.concatenate([y1,y2])data[2,:]=np.concatenate([label1,label2],axis=1)    shuffle_seq = np.random.permutation(np.arange(n_samp))  data_shuffle = data[:,shuffle_seq]return data,data_shuffle  if __name__ == "__main__":# dataset1: halfmoontnum = 8000    data,data_shuffle = halfmoon(20,15,3,tnum)pos_data = data[:,0:tnum//2]neg_data = data[:,tnum//2:tnum]  training_data = data_shuffle.Ttmp1 = training_data[0:tnum,0:2]tmp2 = np.ones((tnum,1))xhat = np.concatenate((tmp1,tmp2),axis=1)target = training_data[0:tnum,2:]    interval = np.linspace(-30,50,100) # dataset2: or# data = np.array([[0,0],[0,1],[1,1],[1,0]])# pos_data = data[0:1,:].T# neg_data = data[1:,:].T# target = np.array([1,0,0,0]).reshape(4,1)# xhat = np.concatenate((data,np.ones((4,1))),axis=1)# interval = np.linspace(-0.2,0.6,100)# mainweight = singleperceptron(xhat,target,0.2)print('sequential:',weight)    y = gen_lineardata(weight,interval)plt.figure(1)    plt.plot(interval,y,'k')       plt.plot(pos_data[0,:],pos_data[1,:],'bo',markerSize=1)plt.plot(neg_data[0,:],neg_data[1,:],'ro',markerSize=1)        plt.title('sequential')    weight = singleperceptron(xhat,target,0.2,'batch')print('batch:',weight)    y = gen_lineardata(weight,interval)plt.figure(2)    plt.plot(interval,y,'k')       plt.plot(pos_data[0,:],pos_data[1,:],'bo',markerSize=1)plt.plot(neg_data[0,:],neg_data[1,:],'ro',markerSize=1)  plt.title('batch')  plt.show()

某一次运行结果
(1)半月形数据
sequential模式: [ w 1 , w 2 , b ] = [w_1,w_2,b]= [w1​,w2​,b]= [0.01727369 5.59047961 0.9740486 ]
batch模式:   [ w 1 , w 2 , b ] = [w_1,w_2,b]= [w1​,w2​,b]= [-0.06142 1.06444655 -0.00302655]

(2)OR数据:
sequential模式: [ w 1 , w 2 , b ] = [w_1,w_2,b]= [w1​,w2​,b]= [-0.22742997 -0.31955376 0.1226006 ]
batch模式:   [ w 1 , w 2 , b ] = [w_1,w_2,b]= [w1​,w2​,b]= [ 0.53262345 0.62096392 -0.15358737]
(3)线性不可分数据

感知器(perceptron)模型分析及实现相关推荐

  1. 基于 iris 数据集采用感知器 Perceptron 实现线性二分类

    基于 iris 数据集采用感知器 Perceptron 实现线性二分类 题目简述: 基于 iris 数据集(四个特征,三个类别),选取两个特征和两个类别,采用感知器 Perceptron 实现线性二分 ...

  2. 【Python-ML】SKlearn库感知器(perceptron) 使用

    # -*- coding: utf-8 -*- ''' Created on 2018年1月12日 @author: Jason.F @summary: Scikit-Learn库感知器学习算法 '' ...

  3. 感知器 Perceptron

    基本概念 线性可分:在特征空间中可以用一个线性分界面正确无误地分开两 类样本:采用增广样本向量,即存 在合适的增广权向量 a 使得: 则称样本是线性可分的.如下图中左图线性可分,右图不可分.所有满足条 ...

  4. 【模式识别】感知器 Perceptron

    基本概念 线性可分:在特征空间中可以用一个线性分界面正确无误地分开两 类样本:采用增广样本向量,即存 在合适的增广权向量 a 使得: 则称样本是线性可分的.如下图中左图线性可分,右图不可分.所有满足条 ...

  5. spark scala word2vec 和多层分类感知器在情感分析中的实际应用

    转自:http://www.cnblogs.com/canyangfeixue/p/7227998.html 对于威胁检测算法使用神经网络训练有用!!!TODO待实验 /*** Created by ...

  6. mysql物理优化_mysql物理优化器代价模型分析【原创】

    1.引言 mysql的sql server在根据where condition检索数据的时候,一般会有多种数据检索的方法,其会根据各种数据检索方法代价的大小,选择代价最小的那个数据检索方法. 比如说这 ...

  7. 感知器Perceptron

    //perceptron.h #ifndef PERCEPTRON_H__ #define PERCEPTRON_H__#include <stdio.h> #include <st ...

  8. 多层感知器用实际例子和Python代码进行解释情绪分析

    多层感知器用实际例子和Python代码进行解释情绪分析 多层感知器是一种学习线性和非线性数据之间关系的神经网络. 这是专门介绍深度学习系列的第一篇文章,深度学习是一组机器学习方法,其根源可以追溯到20 ...

  9. 感知器(Perceptron)

    转载自:http://blog.163.com/zzz216@yeah/blog/static/16255468420107875552606/ 感知器是由美国计算机科学家罗森布拉特(F.Rosebl ...

最新文章

  1. 得力人脸识别考勤机密码设置_百度大脑人脸识别公有云日均调用量过亿 成为业内第一...
  2. Linux中的进程创建函数fork
  3. 一步步解析Attention is All You Need
  4. macd java 源代码_MACD交易系统原理、用法及源代码
  5. HarmonyOS之剪贴板的功能和使用
  6. java后台json传递,后台json传递
  7. javascript Math object
  8. Windows10安装redis(图文教程)
  9. java 日期 年数_关于java:为什么不赞成使用“新日期(整数年,整数月,整数日)”?...
  10. ClassFinal 加密 Java class文件工具
  11. Linux01-BASH脚本编程之信号捕捉及任务计划53
  12. 软件测试报告有哪些内容?
  13. 基于nrf52832 mpu6050应用实例(7)
  14. 用生活案例讲述:erp系统是什么?有哪些作用?
  15. 《ZLToolKit源码学习笔记》(16)网络模块之整体框架概述
  16. ADO.NET 概述
  17. 微信公众平台开发【发送消息】被动回复消息
  18. 重启数据库服务器后数据库无法连接的解决方法
  19. Java 中Date类getTime()的方法
  20. Python调用Jar包的两种方式

热门文章

  1. Docker 安装 KMS 服务器
  2. AEE-ADAPTIVE Emulation Environment
  3. 打开网站服务器显示403,网站服务器返回状态码403解决办法
  4. ITSS运维资质和信息系统安全运维服务资质的区别
  5. CO2气体保护电弧焊
  6. easyExcel 实现简单的读写操作
  7. LAMP服务器安装配置Discuz论坛
  8. 如何把电脑屏幕截图直接保存为文件
  9. 大肠埃希菌相关坏死性筋膜炎的研究进展,有人写过相关论文吗
  10. C4D里如何进行材质烘培?