600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 基于Jupyter完成Iris数据集的 Fisher线性分类 学习数据可视化技术

基于Jupyter完成Iris数据集的 Fisher线性分类 学习数据可视化技术

时间:2024-02-26 07:08:32

相关推荐

基于Jupyter完成Iris数据集的 Fisher线性分类 学习数据可视化技术

Iris数据集的 Fisher线性分类和数据可视化技术

一、Iris数据集的 Fisher线性分类(一)Python全部代码(二)运行结果二、数据可视化技术(一)数据浏览1、数据读取2、查看数据的整体信息3、描述性统计(二)特征工程1、数据清洗2、数据可视化3、直方图4、箱线图5、琴图6、分布图(三) 对比决策树分类算法

一、Iris数据集的 Fisher线性分类

(一)Python全部代码

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt path=r'Iris2.csv'df = pd.read_csv(path, header=0)Iris1=df.values[0:50,0:4]Iris2=df.values[50:100,0:4]Iris3=df.values[100:150,0:4]m1=np.mean(Iris1,axis=0)m2=np.mean(Iris2,axis=0)m3=np.mean(Iris3,axis=0)s1=np.zeros((4,4))s2=np.zeros((4,4))s3=np.zeros((4,4))for i in range(0,30,1):a=Iris1[i,:]-m1a=np.array([a])b=a.Ts1=s1+np.dot(b,a) for i in range(0,30,1):c=Iris2[i,:]-m2c=np.array([c])d=c.Ts2=s2+np.dot(d,c) #s2=s2+np.dot((Iris2[i,:]-m2).T,(Iris2[i,:]-m2))for i in range(0,30,1):a=Iris3[i,:]-m3a=np.array([a])b=a.Ts3=s3+np.dot(b,a) sw12=s1+s2sw13=s1+s3sw23=s2+s3#投影方向a=np.array([m1-m2])sw12=np.array(sw12,dtype='float')sw13=np.array(sw13,dtype='float')sw23=np.array(sw23,dtype='float')#判别函数以及T#需要先将m1-m2转化成矩阵才能进行求其转置矩阵a=m1-m2a=np.array([a])a=a.Tb=m1-m3b=np.array([b])b=b.Tc=m2-m3c=np.array([c])c=c.Tw12=(np.dot(np.linalg.inv(sw12),a)).Tw13=(np.dot(np.linalg.inv(sw13),b)).Tw23=(np.dot(np.linalg.inv(sw23),c)).T#print(m1+m2) #1x4维度 invsw12 4x4维度 m1-m2 4x1维度T12=-0.5*(np.dot(np.dot((m1+m2),np.linalg.inv(sw12)),a))T13=-0.5*(np.dot(np.dot((m1+m3),np.linalg.inv(sw13)),b))T23=-0.5*(np.dot(np.dot((m2+m3),np.linalg.inv(sw23)),c))kind1=0kind2=0kind3=0newiris1=[]newiris2=[]newiris3=[]for i in range(30,49):x=Iris1[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)kind1=kind1+1elif g12<0 and g23>0:newiris2.extend(x)elif g13<0 and g23<0 :newiris3.extend(x)#print(newiris1)for i in range(30,49):x=Iris2[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)elif g12<0 and g23>0:newiris2.extend(x)kind2=kind2+1elif g13<0 and g23<0 :newiris3.extend(x)for i in range(30,50):x=Iris3[i,:]x=np.array([x])g12=np.dot(w12,x.T)+T12g13=np.dot(w13,x.T)+T13g23=np.dot(w23,x.T)+T23if g12>0 and g13>0:newiris1.extend(x)elif g12<0 and g23>0:newiris2.extend(x)elif g13<0 and g23<0 :newiris3.extend(x)kind3=kind3+1#花瓣与花萼的长度散点图plt.scatter(df.values[:50, 3], df.values[:50, 1], color='red', marker='o', label='setosa')plt.scatter(df.values[50:100, 3], df.values[50: 100, 1], color='blue', marker='x', label='versicolor')plt.scatter(df.values[100:150, 3], df.values[100: 150, 1], color='green', label='virginica')plt.xlabel('petal length')plt.ylabel('sepal length')plt.title("花瓣与花萼长度的散点图")plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签plt.rcParams['axes.unicode_minus']=Falseplt.legend(loc='upper left')plt.show()#花瓣与花萼的宽度度散点图plt.scatter(df.values[:50, 4], df.values[:50, 2], color='red', marker='o', label='setosa')plt.scatter(df.values[50:100, 4], df.values[50: 100, 2], color='blue', marker='x', label='versicolor')plt.scatter(df.values[100:150, 4], df.values[100: 150, 2], color='green', label='virginica')plt.xlabel('petal width')plt.ylabel('sepal width')plt.title("花瓣与花萼宽度的散点图")plt.legend(loc='upper left')plt.show()correct=(kind1+kind2+kind3)/60print("样本类内离散度矩阵S1:",s1,'\n')print("样本类内离散度矩阵S2:",s2,'\n')print("样本类内离散度矩阵S3:",s3,'\n')print('-----------------------------------------------------------------------------------------------')print("总体类内离散度矩阵Sw12:",sw12,'\n')print("总体类内离散度矩阵Sw13:",sw13,'\n')print("总体类内离散度矩阵Sw23:",sw23,'\n')print('-----------------------------------------------------------------------------------------------')print('判断出来的综合正确率:',correct*100,'%')

(二)运行结果

二、数据可视化技术

(一)数据浏览

注意这里读取数据文件为csv格式文件

1、数据读取

import pandas as pddf_Iris = pd.read_csv('Iris2.csv')

查看前5行、后五行数据

#前5行df_Iris.head()#后5行df_Iris.tail()

该数据表格的题头信息描述如下:

Id: 鸢尾花编号

SepaLengthCm: 花萼长度, 单位cm

SepalWidthCm: 花萼宽度, 单位cm

PetalLengthCm: 花瓣长度, 单位cm

PetalWidthCm; 花瓣宽度, 单位cm

Species: 鸢尾花种类

2、查看数据的整体信息

#查看数据整体信息df_Iris.info()

打印的信息可以看出150行, 6列,4个64位浮点数, 1个64位整型, 1个python对象, 数据中无缺失值

3、描述性统计

# 描述性统计df_Iris.describe()

(二)特征工程

1、数据清洗

去掉Species特征中的’Iris-'字符

# 分割df_Iris['Species']= df_Iris.Species.apply(lambda x: x.split('-')[1])df_Iris.Species.unique()

2、数据可视化

Seaborn是一个python的可视化库, 它基于matplotlib, 这使得它能与pandas紧密结合, 并且提供了高级绘图界面, 能更方便地完成探索性分析

import seaborn as snsimport matplotlib.pyplot as plt#sns初始化sns.set()#设置散点图x轴与y轴以及data参数sns.relplot(x='SepalLengthCm', y='SepalWidthCm', data = df_Iris)plt.title('SepalLengthCm and SepalWidthCm data analysize')

鸢尾花又分为三个品种, 显示关于这三个品种的分布

sns.relplot(x='SepalLengthCm', y='SepalWidthCm', hue='Species', style='Species', data=df_Iris )plt.title('SepalLengthCm and SepalWidthCm data by Species')

绘制花萼与花瓣长度分布散点图:

# 花萼与花瓣长度分布散点图sns.relplot(x='SepalLengthCm', y='PetalLengthCm', hue='Species', style='Species', data=df_Iris )plt.title('SepalLengthCm and PetalLengthCm data by Species')

绘制花萼与花瓣宽度分布散点图:

# 花萼与花瓣宽度分布散点图sns.relplot(x='SepalWidthCm', y='PetalWidthCm', hue='Species', style='Species', data=df_Iris )plt.title('SepalWidthCm and PetalWidthCm data by Species')

Id编号与花萼长度, 花萼宽度, 花瓣长度, 花瓣宽度之间的关系:

#花萼长度与Id之间关系图sns.relplot(x="Id", y="SepalLengthCm",hue="Species", style="Species",kind="line", data=df_Iris)plt.title('SepalLengthCm and Id data analysize')#花萼宽度与Id之间关系图sns.relplot(x="Id", y="SepalWidthCm",hue="Species", style="Species",kind="line", data=df_Iris)plt.title('SepalWidthCm and Id data analysize')#花瓣长度与Id之间关系图sns.relplot(x="Id", y="PetalLengthCm",hue="Species", style="Species",kind="line", data=df_Iris)plt.title('PetalLengthCm and Id data analysize')#花瓣宽度与Id之间关系图sns.relplot(x="Id", y="PetalWidthCm",hue="Species", style="Species",kind="line", data=df_Iris)plt.title('PetalWidthCm and Id data analysize')

花萼Id-Length:

花萼Id-Width:

花瓣Id-Length:

花瓣Id-Width:

Id中前50个为setosa, 51到100为versicolour, 101到150为Virginica, 以及每个种类对应属性值的范围, 每个种类中的属性与其对应的Id没有明确的关系。

3、直方图

散点图和直方图对比之下, 可以直观地看出哪组频数最大, 哪组频数最小。

sns.jointplot(x='SepalLengthCm', y='SepalWidthCm', data=df_Iris)sns.jointplot(x='PetalLengthCm', y='PetalWidthCm', data=df_Iris)

散点图:

直方图:

4、箱线图

#比如数据中的SepalLengthCm属性sns.boxplot(x='SepalLengthCm', data=df_Iris)#比如数据中的SepalWidthCm属性sns.boxplot(x='SepalWidthCm', data=df_Iris)

将四个图合并:

#对于每个属性的data创建一个新的DataFrameIris1 = pd.DataFrame({"Id": np.arange(1,151), 'Attribute': 'SepalLengthCm', 'Data':df_Iris.SepalLengthCm, 'Species':df_Iris.Species})Iris2 = pd.DataFrame({"Id": np.arange(151,301), 'Attribute': 'SepalWidthCm', 'Data':df_Iris.SepalWidthCm, 'Species':df_Iris.Species})Iris3 = pd.DataFrame({"Id": np.arange(301,451), 'Attribute': 'PetalLengthCm', 'Data':df_Iris.PetalLengthCm, 'Species':df_Iris.Species})Iris4 = pd.DataFrame({"Id": np.arange(451,601), 'Attribute': 'PetalWidthCm', 'Data':df_Iris.PetalWidthCm, 'Species':df_Iris.Species})#将四个DataFrame合并为一个.Iris = pd.concat([Iris1, Iris2, Iris3, Iris4])#绘制箱线图sns.boxplot(x='Attribute', y='Data', data=Iris)

将鸢尾花的三种种类再加入到箱线图中:

sns.boxplot(x='Attribute', y='Data',hue='Species', data=Iris)

除了SepalWidthCm属性外, 中位数在其他属性的三种花中均表现为: Virginica > versicolour > setosa

除了setosa种类外, 中位数在其他种类的四个属性中均表现为: SepalLengthCm > PetalLengthCm > SepalWidthCm > PetalWidthCm

5、琴图

琴图是箱线图与核密度图的结合体, 既可以展示四分位数, 又可以展示任意位置的密度。

sns.violinplot(x='Attribute', y='Data', hue='Species', data=Iris )

将每一个图画具体来看:

#花萼长度sns.boxplot(x='Species', y='SepalLengthCm', data=df_Iris)sns.violinplot(x='Species', y='SepalLengthCm', data=df_Iris)plt.title('SepalLengthCm data by Species')#花萼宽度sns.boxplot(x='Species', y='SepalWidthCm', data=df_Iris)sns.violinplot(x='Species', y='SepalWidthCm', data=df_Iris)plt.title('SepalWidthCm data by Species')#花瓣长度sns.boxplot(x='Species', y='PetalLengthCm', data=df_Iris)sns.violinplot(x='Species', y='PetalLengthCm', data=df_Iris)plt.title('PetalLengthCm data by Species')#花瓣宽度sns.boxplot(x='Species', y='PetalWidthCm', data=df_Iris)sns.violinplot(x='Species', y='PetalWidthCm', data=df_Iris)plt.title('PetalWidthCm data by Species')

6、分布图

#删除Id特征, 绘制分布图sns.pairplot(df_Iris.drop('Id', axis=1), hue='Species')#保存图片, 由于在jupyter notebook中太大, 不能一次截图plt.savefig('pairplot.png')plt.show()

综上, 花萼的长度, 花萼的宽度, 花瓣的长度, 花瓣的宽度与花的种类之间均存在一定的相关性, 且对于这三个种类的分布, satosa在任何一种分布中较其他两者集中; 就同一种花的平均水平来看, 其花萼的长度最长, 花瓣的宽度最短; 就同一属性的平均水平来看, 三种花在除了花萼的宽度外的属性中平均水平均表现为: Virginica > versicolour > setosa。

(三) 对比决策树分类算法

决策树分类算法

from sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifierX = df_Iris[['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm']]y = df_Iris['Species']#将数据按照8:2的比例随机分为训练集, 测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)#初始化决策树模型dt = DecisionTreeClassifier()#训练模型dt.fit(X_train, y_train)#用测试集评估模型的好坏dt.score(X_test, y_test)

运行结果

到这里Iris数据集的分类和数据可视化就全部完成了,还有很多需要学习的地方。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。