下面在鸢尾花数据上使用感知器算法实现分类。如果使用4个特征属性解决鸢尾花的三分类问题,其实问题是非线性可分的。为了把它变成一个单层感知器可以解决的问题,接下来只关心山鸢尾和杂色鸢尾两类数据,并且只使用其中的花萼长度和花瓣长度两个特征属性进行分类。首先需要导入将要使用的库,其中pandas用来处理和分析数据,numpy用来做数组与矩阵的运算,matplotlib用来做数据可视化。另外,为了简单起见,这里直接使用sklearn提供的感知器算法。
In[1]:importpandasaspd
In[2]:importnumpyasnp
In[3]:
In[4]:importmatplotlibasmat
In[5]:
In[6]:fromsklearn.linear_modelimportPerceptron
在Python使用matplotlib画图时,在图中使用中文说明会增强图的可读性,但如果直接用中文进行说明,会显示乱码。为了解决这个问题,可以事先指定中文字体,在画图过程中需要使用中文时,可以直接调用这个字体,就不会有乱码问题了。
In[7]:font=mat.font_manager.FontProperties(fname='C:\Wind
ows\Fonts\')
从文件夹读取数据集,打印最后5条数据和数据形状,以熟悉接下来需要进行分析的数据的存储格式。
In[8]:data=pd.read_csv("",header=None)
In[9]:print((n=5))
012345
146146.06.735.22.3virginica
147147.06.32.55.19virginica
148148.06.535.22virginica
149149.06.23.45.42.3virginica
150150.05.935.11.8virginica
In[10]:print()
(151,6)
为了让读者更熟悉Python处理数据的方式,在这个案例中,将从整个鸢尾花数据集中抽取需要使用的类别和特征属性数据。
In[11]:flower_class=[1:101,5].values
In[12]:flower_class=(flower_class=="setosa",-1,1)
In[13]:flower_shape=[1:101,[1,3]].values
在上述数据抽取的过程中,有几点需要注意。在Python中数据编号是从0开始的。例如,想读取第1条数据,那么在代码中应该告诉Python你想读取的数据编号是0,如果想读取第9条数据,那么告诉Python的数据编号应该是8。案例需要分析的是鸢尾花数据的前两类,一共100条数据。在下载的数据集中,第一行是数据项的名称,所以应该读取第2到第101条。因此在In[11]中,告诉Python的数据编号是“1:101”(不含101)。类别数据在表格中位于第6列,所以代码中的列编号为“5”。类似地,花萼长度和花瓣长度位于表格的第2列和第4列,所以在In[13]中告诉Python的编号是1和3。In[12]中,把类别“setosa”和“versicolour”转换成了-1和1,它的意思是,如果是setosa,则类别为-1,否则为1。
接下来定义绘制数据散点图的函数,通过data_show( )调用函数显示散点图(图6-4)。
In[14]:defdata_show():
("鸢尾花散点图",fontproperties=font)
("花瓣长度",fontproperties=font)
("萼片长度",fontproperties=font)
