奇书网

奇书网>人工智能股票龙头前十名 > 第二节 单层感知器与线性分类(第1页)

第二节 单层感知器与线性分类(第1页)

第二节单层感知器与线性分类

单层感知器适用于解决线性可分问题,这是前文反复提到的分类问题的一种。简单地说,当平面上的两类数据可以用一条直线(称为决策边界)分开时,就称其为线性可分的,如图6-3所示。在这一节,将以一个简单的线性分类问题为例,介绍感知器的学习算法。

图6-3

这个实例所采用的数据集来自机器学习领域的经典数据集——鸢尾花数据集(Iris数据集)。在各种分类问题中,经常会采用这个数据集作为训练数据和测试数据。相应的数据可从教材的资源平台下载。

下载数据后打开,会发现该数据集包括3类共150条数据,其中每类各含50条数据。这3类数据描述了山鸢尾(irissetosa)、杂色鸢尾(irisversicolour)和弗吉尼亚鸢尾(irisvirginica)3种鸢尾花的4个特征属性,分别是花萼长度(SepalLength)、花萼宽度(SepalWidth)、花瓣长度(PetalLength)和花瓣宽度(PetalWidth)。数据形式如表6-1所示。

表6-1

接下来的目标是使用感知器,通过在这个数据集上进行训练,给出一个分类器。分类器根据一个未知类型的鸢尾花数据可以自动识别出它所属的鸢尾种类。

神经网络的学习过程,就是根据训练数据学习合适的连接权重,从而可以使用合适的连接权重来提取正确的类别特征。什么叫作合适的连接权重呢?当然是当一组连接权重可以通过特征属性输出正确的类别时,就是合适的。

为了更简单地说明神经网络的学习法则,接下来只考虑两类鸢尾——山鸢尾和杂色鸢尾,把问题变成一个二分类问题。用-1表示山鸢尾,用1表示杂色鸢尾。每一个输入信息(即每一条数据)包含4个特征属性值和1个类别值。两类数据一共有100条,可以写成

Χ={(x1,C1),(x2,C2),…,(x100,C100)}

其中表示这两个向量的内积。使用上一节定义的函数作为激活函数,则感知器的输出为

此时输出的结果与这条数据对应的真实类别值不一定相符,这是因为初始的连接权重并不合适,所以需要对它进行调整。接下来通过比较ci与y0来调整连接权重。共有如下四种情况。

①ci=1,y0=1,输出的类别正确,保持权重不变ω1=ω0;

②ci=-1,y0=-1,输出的类别正确,保持权重不变ω1=ω0;

其中ω1}表示调整后的权重,η是一个大于零的正数,叫作学习速率。上述工作流程可以不断地迭代下去(由ωk推出ωk+1),直到感知器输出的所有分类信息都是正确的,就可以停止更新权重,得到一个可用的分类器。当然在很多实际任务中,感知器即使经过很多次迭代,也未必能输出完全正确的分类信息,此时如果输出分类信息的正确率达到事先指定的水平,也可以停止继续迭代。

在上述工作流程中,可以通过随机数给出初始权重。实际上初始权重还有其他的指定方法,不同的初始权重对于算法的收敛性和收敛速度都会产生影响。更新权重的过程中出现的学习速率,也是一个重要的参数,它设定得过大可能会造成算法不收敛,设定得过小会减慢收敛速度。这种权重的更新方式可以通过严格的数学推理得出,它是神经网络中基本的学习方法,叫作梯度下降。它所依赖的数学知识是函数的导数,因为需要用到多元函数的导数,所以这里略去了它的严格推导过程。

影响神经网络算法收敛性和收敛速度的因素还有很多。参数设置不当或者算法不适用于所考虑的问题,都可能导致不收敛或者收敛速度过慢,读者可以在将来的实践操作中进行学习。但是需要说明的是,对于线性可分的问题,早在1958年,罗斯布拉特就已经严格证明了上述算法经过有限步的迭代一定会收敛到一个正确的分类器。

下面在鸢尾花数据上使用感知器算法实现分类。如果使用4个特征属性解决鸢尾花的三分类问题,其实问题是非线性可分的。为了把它变成一个单层感知器可以解决的问题,接下来只关心山鸢尾和杂色鸢尾两类数据,并且只使用其中的花萼长度和花瓣长度两个特征属性进行分类。首先需要导入将要使用的库,其中pandas用来处理和分析数据,numpy用来做数组与矩阵的运算,matplotlib用来做数据可视化。另外,为了简单起见,这里直接使用sklearn提供的感知器算法。

In[1]:importpandasaspd

In[2]:importnumpyasnp

In[3]:importmatplotlib。pyplotasplt

In[4]:importmatplotlibasmat

In[5]:frommatplotlib。portListedap

In[6]:fromsklearn。liPer

在Python使用matplotlib画图时,在图中使用中文说明会增强图的可读性,但如果直接用中文进行说明,会显示乱码。为了解决这个问题,可以事先指定中文字体,在画图过程中需要使用中文时,可以直接调用这个字体,就不会有乱码问题了。

In[7]:font=mat。foProperties(fname='d

owsFontssimsun。ttc')

从文件夹读取数据集,打印最后5条数据和数据形状,以熟悉接下来需要进行分析的数据的存储格式。

In[8]:data=pd。read_csv("iris。csv",header=None)

In[9]:print(data。tail(n=5))

012345

146146。06。735。22。3virginica

热门小说推荐

最新标签