分类算法有两种类型:感知器和适应性线性神经元
w = [ w 1 w 2 . . . w m ] , x = [ x 1 x 2 . . . x m ] w=\begin{bmatrix} w_1 \\ w_2 \\ ... \\ w_m \\ \end{bmatrix} , x=\begin{bmatrix} x_1 \\ x_2 \\ ... \\ x_m\\ \end{bmatrix} w=⎣⎢⎢⎡w1w2...wm⎦⎥⎥⎤,x=⎣⎢⎢⎡x1x2...xm⎦⎥⎥⎤ z = w 1 x 1 + w 2 x 2 + ⋅ ⋅ ⋅ + w m x m z=w_1x_1 + w_2x_2 + ···+w_mx_m z=w1x1+w2x2+⋅⋅⋅+wmxm 其中w为权重,x为训练样本
为了计算方便我们添加 w 0 x 0 w_0x_0 w0x0, 其中 w 0 = − θ , x 0 = 1 w_0=-\theta,x_0=1 w0=−θ,x0=1 则 z = w 0 x 0 + w 1 x 1 + . . . + w m x m = w T x , ϕ ( z ) = { 1 if z>0 − 1 , otherwise z=w_0x_0 + w_1x_1+...+w_mx_m = w^Tx , \phi(z)=\begin{cases} 1 & \text {if z>0} \\ -1, & \text{otherwise} \end{cases} z=w0x0+w1x1+...+wmxm=wTx,ϕ(z)={1−1,if z>0otherwise 这样,当 z > 0 z>0 z>0时, ϕ ( z ) = 1 \phi(z)=1 ϕ(z)=1,当 z < 0 z<0 z<0时, ϕ ( z ) = − 1 \phi(z)=-1 ϕ(z)=−1.
假设
权重向量初始化为: w = [ 0 , 0 , 0 ] w=[0,0, 0] w=[0,0,0]训练样本的值: x = [ 1 , 2 , 3 ] x=[1,2,3] x=[1,2,3]学习率: η = 0.3 \eta=0.3 η=0.3这个样本的正确分类y=1感知器算出来的分类是y’=-1调整权重向量 Δ w ( 0 ) = 0.3 ∗ ( 1 − ( − 1 ) ) ∗ x ( 0 ) = 0.3 ∗ 2 ∗ 1 = 0.6 \Delta w(0)=0.3*(1-(-1))*x(0)=0.3*2*1=0.6 Δw(0)=0.3∗(1−(−1))∗x(0)=0.3∗2∗1=0.6, w ( 0 ) = w ( 0 ) + Δ w ( 0 ) = 0.6 w(0) = w(0)+\Delta w(0)=0.6 w(0)=w(0)+Δw(0)=0.6,则权重的第一个分量更新为0.6,即 w = [ 0.6 , 0 , 0 ] w=[0.6,0,0] w=[0.6,0,0]
同理, Δ w ( 1 ) = 0.3 ∗ ( 1 − ( − 1 ) ) ∗ x ( 1 ) = 0.3 ∗ 2 ∗ 2 = 1.2 \Delta w(1)=0.3*(1-(-1))*x(1)=0.3*2*2=1.2 Δw(1)=0.3∗(1−(−1))∗x(1)=0.3∗2∗2=1.2,则更新权重的第二个分量为 w ( 1 ) = w ( 1 ) + Δ w ( 1 ) = 1.2 w(1)=w(1)+\Delta w(1)=1.2 w(1)=w(1)+Δw(1)=1.2
同理, Δ w ( 2 ) = 0.3 ∗ ( 1 − ( − 1 ) ∗ x ( 2 ) ) = 0.3 ∗ 2 ∗ 3 = 1.8 \Delta w(2)=0.3*(1-(-1)*x(2))=0.3*2*3=1.8 Δw(2)=0.3∗(1−(−1)∗x(2))=0.3∗2∗3=1.8,则更新权重的第三个分量为 w ( 2 ) = w ( 2 ) + Δ w ( 2 ) = 1.8 w(2)=w(2)+\Delta w(2)=1.8 w(2)=w(2)+Δw(2)=1.8
最终可以得到更新后的权重向量为 w = [ 0.6 , 1.2 , 1.8 ] w=[0.6, 1.2, 1.8] w=[0.6,1.2,1.8]
这样就可以再次将新的训练样本输入到模型中,根据分类结果走相同的步骤继续改进权重向量。
必须要满足上图中第一个图中的情况,也就是预测的数据可以现行分割,感知器的训练目标就是要找出这条线。而后面两个情况,是无法进行线性可分的,不适用于感知器算法进行分类。
目前虽然有了感知器的分类算法,但是还没有运行起来,下面将如何使用这个感知器分类算法,然后将训练样本输入到模型中,最后进行预测数据。
有了基本模型后,要做的就是要把大量的数据,输入至模型中,让模型通过对大量数据的观察,总结出数据中隐含的某种规律,根据数据特点不断调节模型中神经元权重数值,当神经元的权重数值调节到合适的范围之内后,就可以利用训练后的模型对新的数据进行预测分类。 首先需要先介绍训练数据的数据结构。训练数据内容如下: 使用pandas工具,来读取数据,可以很容易的进行抽取数据。 首先安装pandas:pip install pandas -i https://pypi.douban.com/simple
import pandas as pd file="./iris.csv" df = pd.read_csv(file, header=None) print(df.head())结果输出如下: 可视化展示这个数据,使用matplotlib工具进行展示。
import matplotlib.pyplot as plt import numpy as np from test3 import df # 将df中0到100行的数据的第四列赋值给y向量 y = df.loc[0:100, 4].values # 将Iris-setosa转为-1,其余转为1 y = np.where(y == 'Iris-setosa', -1, 1) # print(y) # 将df0到100行的数据的第0列和第2列抽取出来,赋值给x向量 X = df.iloc[0:100, [0, 2]].values # print(X) # 将X向量的钱50条数据的第0列作为x轴,第1列作为y轴坐标,画在二维坐标轴,画出来的点是红色的'o', plt.scatter(X[:50, 0], X[:50, 1], color = 'red', marker='o', label='setosa') plt.scatter(X[50:100, 0], X[50:100, 1], color = 'blue', marker='x', label='versicolor') plt.xlabel('花瓣长度') plt.ylabel('花径长度') plt.legend(loc='upper left') # 下面两行解决乱码问题 plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体 plt.rcParams['axes.unicode_minus'] = False plt.show()可以看出来这两类数据可以线性分割开。
