机器学习算法之感知机模型算法原理及实现
机器学习算法之感知机模型算法原理及实现
感知机是一种二分类线性模型,属于判别模型
1 算法原理
1.1 感知机模型
- 输入空间:X⊆RnX \subseteq R^{n}X⊆Rn
- 输入变量:x∈Xx \in Xx∈X
- 输出空间:Y={+1,−1}Y=\{+1,-1\}Y={+1,−1}
- 输出变量:y∈{+1,−1}y \in\{+1,-1\}y∈{+1,−1}
- 假设空间:f(x)=sign(w⋅x+b)f(x)=\operatorname{sign}(w \cdot x+b)f(x)=sign(w⋅x+b)
- 相关说明: 输入变量是一个维向量, 表示该实例是正类, 表示该实例是负类。
如图,输入空间为两维,即X⊆R2X \subseteq R^{2}X⊆R2。x(1)x^{(1)}x(1)和x(2)x^{(2)}x(2)表示实例的两个特征分量,然后根据训练集中每一个实例在这两个输入变量上的取值,将其划分到输入空间中对应的点,实例就是由图中的∘\circ∘和×\times×表示的,其中∘\circ∘表示正类, 表示×\times×负类。
感知机模型的输入变量是线性可分的,即图中的点可以使用一条直线分开。在直线上方的是正类,下方的是负类。该直线的表示形式为:w1x(1)+w2x(2)+b=0w_{1} x^{(1)}+w_{2} x^{(2)}+b=0w1x(1)+w2x(2)+b=0,该平面中所有的直线构成该模型的假设空间。则实例分类按照如下公式:
w1x(1)+w2x(2)+b{⩾0正例<0负例w_{1} x^{(1)}+w_{2} x^{(2)}+b\left\{\begin{array}{l}{\geqslant 0} & {\text {正例} }\\ {<0}& {\text {负例} }\end{array}\right.w1x(1)+w2x(2)+b{⩾0<0正例负例
假设空间:
f(x)=sign(w⋅x+b)={+1w⋅x+b⩾0−1w⋅x+b<0f(x)=\operatorname{sign}(w \cdot x+b)=\left\{\begin{array}{ll}{+1} & {w \cdot x+b \geqslant 0} \\ {-1} & {w \cdot x+b<0}\end{array}\right.f(x)=sign(w⋅x+b)={+1−1w⋅x+b⩾0w⋅x+b<0
其中www是nnn维向量。
w⋅x=w1x(1)+w1x(1)+⋯+wnx(n)w \cdot x=w_{1} x^{(1)}+w_{1} x^{(1)}+\cdots+w_{n} x^{(n)}w⋅x=w1x(1)+w1x(1)+⋯+wnx(n)
总结: 在感知机模型中,假设空间是关于输入变量的线性函数,再取其符号函数。取符号函数的目的是输出变量是需要分类的,为+1或-1。
1.2 感知机学习策略
1.2.1 损失函数
所有误分类点到分类超平面的距离和:
L(w,b)=−∑xi∈Myi(w⋅xi+b)L(w, b)=-\sum_{x_{i} \in M} y_{i}\left(w \cdot x_{i}+b\right)L(w,b)=−xi∈M∑yi(w⋅xi+b)
MMM为总体中误分类实例的集合。
1.2.2 损失函数推导
感知机模型中,损失函数定义如下:误分类的实例到分类超平面的距离。
对于任意实例xix_ixi到超平面的距离为∣w⋅xi+b∣∥w∥\frac{\left|w \cdot x_{i}+b\right|}{\|w\|}∥w∥∣w⋅xi+b∣,其中∥w∥=w12+⋯+wn2\|w\|=\sqrt{w_{1}^{2}+\cdots+w_{n}^{2}}∥w∥=w12+⋯+wn2,误分类实例xix_ixi到超平面的距离等价于
−yi(w⋅xi+b)∥w∥\frac{-y_{i}\left(w \cdot x_{i}+b\right)}{\|w\|}∥w∥−yi(w⋅xi+b)
因为∣w⋅xi+b∣\left|w \cdot x_{i}+b\right|∣w⋅xi+b∣带有绝对值符号,对于误分类实例yi(w⋅xi+b)<0y_{i}\left(w \cdot x_{i}+b\right)<0yi(w⋅xi+b)<0,因此加上符号使其始终为正。
对于:−yi(w⋅xi+b)∥w∥\frac{-y_{i}\left(w \cdot x_{i}+b\right)}{\|w\|}∥w∥−yi(w⋅xi+b)
计算其最小值,只需计算:
−∑xi∈Myi(w⋅xi+b)-\sum_{x_{i} \in M} y_{i}\left(w \cdot x_{i}+b\right)−xi∈M∑yi(w⋅xi+b)
**附:**超平面:在输入变量是2维的时候,用一条直线来分类的,当输入变量是3维的时候,用一个平面类划分,当输入变量是4维的时候,用一个3维的平面来划分,这个时候,该平面被称为超平面。当输入变量是nnn维的时候,用一个n−1n-1n−1维的超平面来分类,所以就用超平面来表示分割平面。
1.3 感知机学习算法
1.3.1 感知机学习算法的原始形式
算法1 随机梯度下降法
输入: 训练数据集T=[(x1,y1),…,(xN,yN)]T=\left[\left(x_{1}, y_{1}\right), \ldots,\left(x_{N}, y_{N}\right)\right]T=[(x1,y1),…,(xN,yN)],学习率η\etaη
初始化初值w0w_0w0,b0b_0b0,即初始化假设空间中的一个模型
在训练集中选取数据(xi,yi)\left(x_{i}, y_{i}\right)(xi,yi)
如果yi(w⋅xi+b)⩽0y_{i}\left(w \cdot x_{i}+b\right) \leqslant 0yi(w⋅xi+b)⩽0,说明误分类:
- w:=w+ηyixiw:=w+\eta y_{i} x_{i}w:=w+ηyixi
- b:=b+ηyib:=b+\eta y_{i}b:=b+ηyi
转至2,直到训练集中没有误分类点
输出:www,bbb
η∈(0,1]\eta\in(0,1]η∈(0,1],控制超平面向误分类点移动的程度。
1.3.2 感知机学习算法的对偶形式
对偶形式:
f(x)=sign(∑j=1Nαjyjxj⋅x+b)α=(α1,⋯ ,αN)T\begin{array}{c}{f(x)=\operatorname{sign}\left(\sum_{j=1}^{N} \alpha_{j} y_{j} x_{j} \cdot x+b\right)} \\ {\alpha=\left(\alpha_{1}, \cdots, \alpha_{N}\right)^{T}}\end{array}f(x)=sign(∑j=1Nαjyjxj⋅x+b)α=(α1,⋯,αN)T
该假设空间由αj\alpha_{j}αj,bbb决定的。
算法2 随机梯度下降法
输入: 训练数据集T=[(x1,y1),…,(xN,yN)]T=\left[\left(x_{1}, y_{1}\right), \ldots,\left(x_{N}, y_{N}\right)\right]T=[(x1,y1),…,(xN,yN)],学习率η\etaη
初始化初值α=0\alpha=0α=0,b=0b=0b=0,即初始化假设空间中的一个模型
在训练集中选取数据(xi,yi)\left(x_{i}, y_{i}\right)(xi,yi)
如果yi(∑j=1Nαjyjxj⋅xi+b)⩽0y_{i}\left(\sum_{j=1}^{N} \alpha_{j} y_{j} x_{j} \cdot x_{i}+b\right) \leqslant 0yi(∑j=1Nαjyjxj⋅xi+b)⩽0,说明误分类:
- αi:=αi+η\alpha_{i}:=\alpha_{i}+\etaαi:=αi+η
- b:=b+ηyib:=b+\eta y_{i}b:=b+ηyi
转至2,直到训练集中没有误分类点
输出:α\alphaα,bbb
η∈(0,1]\eta\in(0,1]η∈(0,1],控制超平面向误分类点移动的程度。
1.3.3两种形式的对比
对于对偶形式的算法,每次只会更新两个数α\alphaα和bbb,而原始形式算法,每次需要更新一个向量和一个数,相比于算法2.2,需要更新得更多,并且每次都要计算一次w⋅xiw \cdot x_{i}w⋅xi内积,计算量也会很大。对偶形式也需要计算一个内积xi⋅xjx_{i} \cdot x_{j}xi⋅xj,但只是当前点的内积,可以提前将所有实例的输入向量的内积都算出来。
所以,对偶形式比原始形式整体上计算量要少一点。
1.4 随机梯度下降
感知机模型的学习策略是要最小化误分类点到分类超平面距离的和,其对应的经验风险函数是:
L(w,b)=−∑xi∈Myi(w⋅xi+b)L(w, b)=-\sum_{x_{i} \in M} y_{i}\left(w \cdot x_{i}+b\right)L(w,b)=−xi∈M∑yi(w⋅xi+b)
是关于www和bbb的函数,www是一个nnn维向量,xix_ixi也是一个nnn维向量,xi∈Mx_{i}\in Mxi∈M表示经验风险函数中包含的求和项只是在当前的分类超平面中被误分类的那些点,现在需要找到是该公式的值最小的www和bbb,也就是要最小化L(w,b)L(w, b)L(w,b)。
首先求出损失函数关于www的梯度:
∇wL(w,b)=−∑xi∈Myixi\nabla_{w} L(w, b)=-\sum_{x_{i} \in M} y_{i} x_{i}∇wL(w,b)=−xi∈M∑yixi
求出关于bbb的梯度:
∇bL(w,b)=−∑xi∈Myi\nabla_{b} L(w, b)=-\sum_{x_{i} \in M} y_{i}∇bL(w,b)=−xi∈M∑yi
采用梯度下降方法,对www和bbb进行更新:
w:=w+η∑xi∈Myixiw:=w+\eta \sum_{x_{i} \in M} y_{i} x_{i}w:=w+ηxi∈M∑yixi
b:=b+η∑xi∈Myib:=b+\eta \sum_{x_{i} \in M} y_{i}b:=b+ηxi∈M∑yi
随机梯度下降法,仅使用一个yixiy_{i}x_{i}yixi。
使用随机梯度下降的原因:
因为在一般的问题里面,可能数据量比较大,每次只用一个数据来更新www和bbb,降低计算量;还有另外一个原因,需要更新的xix_{i}xi是误分类点,在更新完之后,就不是误分类的点,所以再第二次更新的时候,仍需再一次计算yixiy_{i}x_{i}yixi,浪费计算时间。
1.5 算法收敛性
为了便于叙述和推导,将偏置bbb并入权重向量www,记作w^=(wT,b)T\hat{w}=(w^{T},b)^{T}w^=(wT,b)T,同样也将输入向量加以扩充,加入常数1,记作x^=(xT,1)T\hat{x}=(x^{T},1)^{T}x^=(xT,1)T。
1.5.1 Novikoff定理
定理1 Novikoff
假设训练数据集 T={(x1,y1),(x2,y2),…,(xN,yN)}T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots,\left(x_{N}, y_{N}\right)\right\}T={(x1,y1),(x2,y2),…,(xN,yN)}是线性可分的,其中xi∈X=Rnx_{i} \in \mathcal{X}=\mathrm{R}^{n}xi∈X=Rn,yi∈Y={−1,+1},i=1,2,⋯ ,Ny_{i} \in \mathcal{Y}=\{-1,+1\}, i=1,2, \cdots, Nyi∈Y={−1,+1},i=1,2,⋯,N,则
- 存在满足条件∥w^opt∥=1\left\|\hat{w}_{opt}\right\|=1∥w^opt∥=1的超平面w^opt⋅x^=wopt⋅x+bopt=0\hat{w}_{o p t} \cdot \hat{x}=w_{o p t} \cdot x+b_{o p t}=0w^opt⋅x^=wopt⋅x+bopt=0将训练数据集完全分开;且存在γ>0\gamma>0γ>0,对所有i=1,2,⋯ ,Ni=1,2,\cdots,Ni=1,2,⋯,N,满足:
yi(w^opt⋅x^)=yi(wopt⋅xi+bopt)⩾γy_{i}\left(\hat{w}_{o p t} \cdot \hat{x}\right)=y_{i}\left(w_{o p t} \cdot x_{i}+b_{o p t}\right) \geqslant \gammayi(w^opt⋅x^)=yi(wopt⋅xi+bopt)⩾γ - 令R=max1⩽i⩽N∥x^i∥R=\max _{1 \leqslant i \leqslant N}\left\|\hat{x}_{i}\right\|R=max1⩽i⩽N∥x^i∥,则原始感知机算法在训练集上的误分类次数kkk满足下面不等式:
k⩽(Rγ)2k \leqslant\left(\frac{R}{\gamma}\right)^{2}k⩽(γR)2
注释:
- 超平面wopt⋅xi+bopt=0w_{o p t} \cdot x_{i}+b_{o p t}=0wopt⋅xi+bopt=0可以将训练数据集线性可分。
- w^opt=(woptT,bopt)T,x^=(xT,1)T\hat{w}_{o p t}=\left(w_{o p t}^{T}, b_{o p t}\right)^{T}, \hat{x}=\left(x^{T}, 1\right)^{T}w^opt=(woptT,bopt)T,x^=(xT,1)T
- w^opt\hat{w}_{o p t}w^opt和x^\hat{x}x^的内积: w^opt⋅x^=wopt⋅xi+bopt\hat{w}_{o p t} \cdot \hat{x}=w_{o p t} \cdot x_{i}+b_{o p t}w^opt⋅x^=wopt⋅xi+bopt
- 为了使w^opt\hat{w}_{o p t}w^opt表示唯一,对其进行约束,使得其长度等于单位长度:∥w^opt∥=1\left\|\hat{w}_{o p t}\right\|=1∥w^opt∥=1
1.5.2 证明
证明1:
因为超平面wopt⋅xi+bopt=0w_{o p t} \cdot x_{i}+b_{o p t}=0wopt⋅xi+bopt=0可以将训练数据集线性可分,对于任意实例yi(w^opt⋅x^i)>0y_{i}\left(\hat{w}_{o p t} \cdot \hat{x}_{i}\right)>0yi(w^opt⋅x^i)>0,所以存在γ=mini{yi(w^opt,xi)}\gamma=\min _{i}\left\{y_{i}\left(\hat{w}_{o p t}, x_{i}\right)\right\}γ=mini{yi(w^opt,xi)},得证。
证明2:
根据算法,每找到一个点,都会对www进行修正,修正的总次数kkk一定是有上界的,要得到这个结论,需要两个步骤。
- 第一步:需要证明w^k⋅w^opt⩾kηγ\hat{w}_{k} \cdot \hat{w}_{o p t} \geqslant k \eta \gammaw^k⋅w^opt⩾kηγ,其中η\etaη为算法中的学习率,wk^\hat{w_{k}}wk^表示在第kkk个误分类点修正之后所得到的。假设w^0=(0,0,⋯ ,0)T\hat{w}_{0}=(0,0, \cdots, 0)^{T}w^0=(0,0,⋯,0)T:
w^k⋅w^opt=(w^k−1+ηyix^i)⋅w^opt=w^k−1⋅w^opt+ηyix^i⋅w^opt⩾w^k−1⋅w^opt+ηγ⩾w^k−2⋅w^opt+2ηγ⋯⩾w^0⋅w^opt+kηγ=kηγ\begin{aligned} \hat{w}_{k} \cdot \hat{w}_{o p t} &=\left(\hat{w}_{k-1}+\eta y_{i} \hat{x}_{i}\right) \cdot \hat{w}_{o p t} \\ &=\hat{w}_{k-1} \cdot \hat{w}_{o p t}+\eta y_{i} \hat{x}_{i} \cdot \hat{w}_{o p t} \\ & \geqslant \hat{w}_{k-1} \cdot \hat{w}_{o p t}+\eta \gamma \\ & \geqslant \hat{w}_{k-2} \cdot \hat{w}_{o p t}+2\eta \gamma \\ & \cdots \\ & \geqslant \hat{w}_{0} \cdot \hat{w}_{o p t}+k \eta \gamma \\ &=k \eta \gamma \end{aligned}w^k⋅w^opt=(w^k−1+ηyix^i)⋅w^opt=w^k−1⋅w^opt+ηyix^i⋅w^opt⩾w^k−1⋅w^opt+ηγ⩾w^k−2⋅w^opt+2ηγ⋯⩾w^0⋅w^opt+kηγ=kηγ
得证。 - 第二步:需要证明∥ω^k∥2\left\|\hat{\omega}_{k}\right\|^{2}∥ω^k∥2有上界的,小于某个值。
二范数的平方裂项:
∥a+b∥2=(a+b)T(a+b)=∥a∥2+2a⋅b+∥b∥2\begin{aligned}\|a+b\|^{2} &=(a+b)^{T}(a+b) \\ &=\|a\|^{2}+2 a \cdot b+\|b\|^{2} \end{aligned}∥a+b∥2=(a+b)T(a+b)=∥a∥2+2a⋅b+∥b∥2
证明:
∥w^k∥2=∥w^k−1+ηyix^i∥2=∥w^k−1∥2+2ηyiw^k−1⋅x^i+η2∥x^i∥2\begin{aligned}\left\|\hat{w}_{k}\right\|^{2} &=\left\|\hat{w}_{k-1}+\eta y_{i} \hat{x}_{i}\right\|^{2} \\ &=\left\|\hat{w}_{k-1}\right\|^{2}+2 \eta y_{i} \hat{w}_{k-1} \cdot \hat{x}_{i}+\eta^{2}\left\|\hat{x}_{i}\right\|^{2} \end{aligned}∥w^k∥2=∥w^k−1+ηyix^i∥2=∥w^k−1∥2+2ηyiw^k−1⋅x^i+η2∥x^i∥2
由于是误分类点,可得2ηyiw^k−1⋅x^i<02 \eta y_{i} \hat{w}_{k-1} \cdot \hat{x}_{i}<02ηyiw^k−1⋅x^i<0,又由于∥x^i∥⩽R\left\|\hat{x}_{i}\right\| \leqslant R∥x^i∥⩽R,所以:
∥w^k−1∥2+2ηyiw^k−1⋅x^i+η2∥x^i∥2⩽∥w^k−1∥2+η2R2\left\|\hat{w}_{k-1}\right\|^{2}+2 \eta y_{i} \hat{w}_{k-1} \cdot \hat{x}_{i}+\eta^{2}\left\|\hat{x}_{i}\right\|^{2} \leqslant\left\|\hat{w}_{k-1}\right\|^{2}+\eta^{2} R^{2}∥w^k−1∥2+2ηyiw^k−1⋅x^i+η2∥x^i∥2⩽∥w^k−1∥2+η2R2
递推下去,可以得到:
∥w^k∥2⩽∥w^k−1∥2+η2R2⩽⋯⩽∥w^0∥2+kη2R2=kη2R2\begin{aligned}\left\|\hat{w}_{k}\right\|^{2} & \leqslant\left\|\hat{w}_{k-1}\right\|^{2}+\eta^{2} R^{2} \\ & \leqslant \cdots \\ & \leqslant\left\|\hat{w}_{0}\right\|^{2}+k \eta^{2} R^{2} \\ &=k \eta^{2} R^{2} \end{aligned}∥w^k∥2⩽∥w^k−1∥2+η2R2⩽⋯⩽∥w^0∥2+kη2R2=kη2R2
得证。
根据上面两个公式继续推导:根据柯西不等式,得到:w^k⋅w^opt⩽∥w^k∥⋅∥w^opt∥\hat{w}_{k} \cdot \hat{w}_{o p t} \leqslant\left\|\hat{w}_{k}\right\| \cdot\left\|\hat{w}_{o p t}\right\|w^k⋅w^opt⩽∥w^k∥⋅∥w^opt∥
因为∥w^opt∥=1\left\|\hat{w}_{opt}\right\|=1∥w^opt∥=1
所以w^k⋅w^opt⩽∥w^k∥\hat{w}_{k} \cdot \hat{w}_{o p t} \leqslant\left\|\hat{w}_{k}\right\|w^k⋅w^opt⩽∥w^k∥
由2得,∥w^k∥⩽kηR\left\|\hat{w}_{k}\right\| \leqslant \sqrt{k} \eta R∥w^k∥⩽kηR
由1得,w^k⋅w^opt⩾kηγ\hat{w}_{k} \cdot \hat{w}_{o p t} \geqslant k \eta \gammaw^k⋅w^opt⩾kηγ
所以:
kηγ⩽w^k⋅w^opt⩽∥w^k∥⩽kηRk \eta \gamma \leqslant \hat{w}_{k} \cdot \hat{w}_{o p t} \leqslant\left\|\hat{w}_{k}\right\| \leqslant \sqrt{k} \eta Rkηγ⩽w^k⋅w^opt⩽∥w^k∥⩽kηR
kηγ⩽kη2R2k \eta \gamma \leqslant \sqrt{k \eta^{2} R^{2}}kηγ⩽kη2R2
k⩽(Rγ)2k \leqslant\left(\frac{R}{\gamma}\right)^{2}k⩽(γR)2
所以结论2得证,误分类次数kkk是有上界的,随机梯度下降法在有限步之后就可以使得所有训练集中的实例都正确分类。
2 算法实现
import pandas as pdimport numpy as npfrom sklearn.datasets import load_irisimport matplotlib.pyplot as plt%matplotlib inline
# load datairis = load_iris()df = pd.DataFrame(iris.data, columns=iris.feature_names)df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']df.label.value_counts()
2 501 500 50Name: label, dtype: int64
plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')plt.xlabel('sepal length')plt.ylabel('sepal width')plt.legend()
<matplotlib.legend.Legend at 0xfd0e0bf630>
data = np.array(df.iloc[:100, [0, 1, -1]])print(data)
[[5.1 3.5 0. ][4.9 3. 0. ][4.7 3.2 0. ][4.6 3.1 0. ][5. 3.6 0. ][5.4 3.9 0. ][4.6 3.4 0. ][5. 3.4 0. ][4.4 2.9 0. ][4.9 3.1 0. ][5.4 3.7 0. ][4.8 3.4 0. ][4.8 3. 0. ][4.3 3. 0. ][5.8 4. 0. ][5.7 4.4 0. ][5.4 3.9 0. ][5.1 3.5 0. ][5.7 3.8 0. ][5.1 3.8 0. ][5.4 3.4 0. ][5.1 3.7 0. ][4.6 3.6 0. ][5.1 3.3 0. ][4.8 3.4 0. ][5. 3. 0. ][5. 3.4 0. ][5.2 3.5 0. ][5.2 3.4 0. ][4.7 3.2 0. ][4.8 3.1 0. ][5.4 3.4 0. ][5.2 4.1 0. ][5.5 4.2 0. ][4.9 3.1 0. ][5. 3.2 0. ][5.5 3.5 0. ][4.9 3.6 0. ][4.4 3. 0. ][5.1 3.4 0. ][5. 3.5 0. ][4.5 2.3 0. ][4.4 3.2 0. ][5. 3.5 0. ][5.1 3.8 0. ][4.8 3. 0. ][5.1 3.8 0. ][4.6 3.2 0. ][5.3 3.7 0. ][5. 3.3 0. ][7. 3.2 1. ][6.4 3.2 1. ][6.9 3.1 1. ][5.5 2.3 1. ][6.5 2.8 1. ][5.7 2.8 1. ][6.3 3.3 1. ][4.9 2.4 1. ][6.6 2.9 1. ][5.2 2.7 1. ][5. 2. 1. ][5.9 3. 1. ][6. 2.2 1. ][6.1 2.9 1. ][5.6 2.9 1. ][6.7 3.1 1. ][5.6 3. 1. ][5.8 2.7 1. ][6.2 2.2 1. ][5.6 2.5 1. ][5.9 3.2 1. ][6.1 2.8 1. ][6.3 2.5 1. ][6.1 2.8 1. ][6.4 2.9 1. ][6.6 3. 1. ][6.8 2.8 1. ][6.7 3. 1. ][6. 2.9 1. ][5.7 2.6 1. ][5.5 2.4 1. ][5.5 2.4 1. ][5.8 2.7 1. ][6. 2.7 1. ][5.4 3. 1. ][6. 3.4 1. ][6.7 3.1 1. ][6.3 2.3 1. ][5.6 3. 1. ][5.5 2.5 1. ][5.5 2.6 1. ][6.1 3. 1. ][5.8 2.6 1. ][5. 2.3 1. ][5.6 2.7 1. ][5.7 3. 1. ][5.7 2.9 1. ][6.2 2.9 1. ][5.1 2.5 1. ][5.7 2.8 1. ]]
X, y = data[:,:-1], data[:,-1]y = np.array([1 if i == 1 else -1 for i in y])print(y)
[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1-1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1]
print(len(data[0]))print(len(y))
3100
2.1 手工实现
class Model:def __init__(self):self.w=np.ones(len(X[0]),dtype=np.float32)self.b=0self.l_rate=0.1def sign(self,x,w,b):y=np.dot(x,w)+breturn ydef fit(self,X_train,y_train):is_wrong=Falsewhile(not is_wrong):wrong_count=0for d in range(len(X_train)):X=X_train[d]y=y_train[d]if(y*self.sign(X,self.w,self.b)<=0):self.w=self.w+self.l_rate*np.dot(y,X)self.b=self.b+self.l_rate*ywrong_count+=1if(wrong_count==0):is_wrong=Truereturn "Train Sucessful"
perceptron=Model()perceptron.fit(X,y)
'Train Sucessful'
x_points = np.linspace(4, 7, 10)y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]plt.plot(x_points, y_)plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')plt.xlabel('sepal length')plt.ylabel('sepal width')plt.legend()
<matplotlib.legend.Legend at 0xfd196a5b38>
print(perceptron.w[1])
-10.000000000000105
2.2 scikit-learn实现
import sklearnfrom sklearn.linear_model import Perceptron
model=Perceptron(max_iter=1000,shuffle=True,fit_intercept=True,tol=None)model.fit(X,y)
Perceptron(alpha=0.0001, class_weight=None, early_stopping=False, eta0=1.0,fit_intercept=True, max_iter=1000, n_iter_no_change=5, n_jobs=None,penalty=None, random_state=0, shuffle=True, tol=None,validation_fraction=0.1, verbose=0, warm_start=False)
print(model.coef_)print(model.intercept_)
[[ 70.7 -87.9]][-117.]
# 画布大小plt.figure(figsize=(10,10))# 中文标题plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.title('鸢尾花线性数据示例')plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')# 画感知机的线x_ponits = np.arange(4, 8)y_ = -(model.coef_[0][0]*x_ponits + model.intercept_)/model.coef_[0][1]plt.plot(x_ponits, y_)# 其他部分plt.legend() # 显示图例plt.grid(False) # 不显示网格plt.xlabel('sepal length')plt.ylabel('sepal width')plt.legend()
<matplotlib.legend.Legend at 0xfd13cad630>
- 点赞1
- 收藏
- 分享
- 文章举报
- 深度学习基础模型算法原理及编程实现--01.感知机
- 机器学习算法 原理、实现与实践 —— 感知机与梯度下降 神经网络
- 机器学习算法之k近邻模型算法原理及实现
- 《李航:统计学习方法》--- 感知机算法原理与实现
- 深度学习基础模型算法原理及编程实现--09.自编码网络
- 感知机算法原理(PLA原理)及 Python 实现
- 机器学习算法 原理、实现与实践 —— 感知机与梯度下降
- 统计学习方法 --- 感知机模型原理及c++实现
- 统计学习方法 --- 感知机模型原理及c++实现
- 机器学习算法 原理、实现与实战——模型评估与模型选择
- 机器学习算法 原理、实现与实践 —— 感知机与梯度下降
- 深度学习基础模型算法原理及编程实现--05.卷积神经网络
- [笔记-统计学习方法]感知机模型(perceptron) 原理与实现
- <基础原理进阶>机器学习算法python实现【1】--分类简谈&KNN算法
- 深度学习基础模型算法原理及编程实现--03.全链接
- 深度学习基础模型算法原理及编程实现--06.循环神经网络
- 感知机算法原理及代码实现
- 深度学习基础模型算法原理及编程实现--02.线性单元
- 机器学习算法原理与实践(六)、感知机算法
- 深度学习基础模型算法原理及编程实现--04.改进神经网络的方法