基于Jupyter完成Iris数据集的 Fisher线性分类,学习数据可视化技术
Iris数据集的 Fisher线性分类和数据可视化技术
- 一、Iris数据集的 Fisher线性分类
- (一)Python全部代码
- (二)运行结果
- 二、数据可视化技术
- (一)数据浏览
- 1、数据读取
- 2、查看数据的整体信息
- 3、描述性统计
- (二)特征工程
- 1、数据清洗
- 2、数据可视化
- 3、直方图
- 4、箱线图
- 5、琴图
- 6、分布图
- (三) 对比决策树分类算法
一、Iris数据集的 Fisher线性分类
(一)Python全部代码
import pandas as pd
import numpy as np
import 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+s2
sw13=s1+s3
sw23=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-m2
a=np.array([a])
a=a.T
b=m1-m3
b=np.array([b])
b=b.T
c=m2-m3
c=np.array([c])
c=c.T
w12=(np.dot(np.linalg.inv(sw12),a)).T
w13=(np.dot(np.linalg.inv(sw13),b)).T
w23=(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=0
kind2=0
kind3=0
newiris1=[]
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']=False
plt.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)/60
print("样本类内离散度矩阵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 pd
df_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 sns
import 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创建一个新的DataFrame
Iris1 = 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_split
from 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数据集的分类和数据可视化就全部完成了,还有很多需要学习的地方。
基于Jupyter完成Iris数据集的 Fisher线性分类,学习数据可视化技术相关推荐
- Jupyter完成Iris数据集的 Fisher线性分类和数据可视化技术
文章目录 一.Iris数据集的 Fisher线性分类判断准确率 1.代码: 2.结果: 二.数据可视化 1.数据显示 2.描述性统计 3.特征计数 三.特征工程 1.绘制花萼的长度与宽度的散点图 2. ...
- 机器学习--Iris数据集的Fisher线性分类以及数据可视化技术的学习
Iris数据集的Fisher线性分类以及数据可视化技术的学习 1.Iris数据集的Fisher线性分类 2.数据可视化技术的学习 1.数据集介绍 2.观看数据前5行 3.特征工程 1.数据清洗 2.数 ...
- 支持向量机鸢尾花Iris数据集的SVM线性分类练习
支持向量机&鸢尾花Iris数据集的SVM线性分类练习 摘要 一.SVM基础 1.三种支持向量机 2.非线性支持向量机 二.鸢尾花实例 1.认识鸢尾花 2.鸢尾花实例演示 3.使用多项式特征和核 ...
- (转载)基于sklearn的iris数据集及简介
(一)iris数据集简介 Iris数据集是机器学习任务中常用的分类实验数据集,由Fisher在1936收集整理.Iris中文名是安德森鸢尾花卉数据集,英文全称是Anderson's Iris data ...
- 混淆矩阵是什么?Python多分类的混淆矩阵计算及可视化(包含原始混淆矩阵及归一化的混淆矩阵):基于skelarn框架iris数据集
混淆矩阵是什么?Python多分类的混淆矩阵计算及可视化(包含原始混淆矩阵及归一化的混淆矩阵):基于skelarn框架iris数据集 目录
- Python机器学习实验二:1.编写代码,实现对iris数据集的KNN算法分类及预测
Python机器学习实验二:编写代码,实现对iris数据集的KNN算法分类及预测 1.编写代码,实现对iris数据集的KNN算法分类及预测,要求: (1)数据集划分为测试集占20%: (2)n_nei ...
- 基于Web组态软件(HT for Web)实现水泥工厂数据可视化系统
前言 如今的制造行业,基于数据进行生产策略制定与管理已经成为一种趋势,特别是 工业4.0 的浪潮下,数据战略已经成为很多制造企业的优先战略,而数据可视化以更直观的方式,帮助指导决策,成为数据分析传递信 ...
- 基于tensorflow的mnist数据集手写字体分类level-1
本文属于学些tensorflow框架系列的文章,不是注重于算法- 基于之前博文中的工作,已经安装好tensorflow等等的配置工作,开始学习tensorflow框架的使用,本文参考了以下链接,致以敬 ...
- r包调用legend函数_R语言实现基于朴素贝叶斯构造分类模型数据可视化
本文内容原创,未经作者许可禁止转载! 目录 一.前言 二.摘要 三.关键词 四.算法原理 五.经典应用 六.R建模 1.载入相关包(内含彩蛋): 1.1 library包载入 1.2 pacman包载 ...
- 数据可视化之雷达图:自助数据集处理,完美演绎球员数据可视化
数据可视化,不只应用于工作或者财务报告,在某些场合通过使用图表展示数据,进行信息可视化表达,不仅可以省去繁冗的文字,还能更为清晰直观地展示,化平庸为神奇,让任何人有认真看的欲望. 当今世界人们越来越崇 ...
最新文章
- Seaborn使用lmplot函数可视化散点图并添加回归曲线以及回归线对应的置信区间(Scatter plot with regression line)
- Ionic创建页面以及页面之间跳转、页面添加返回按钮、新增底部页面
- 如何防止通过url攻击_什么是XSS攻击?如何防御XSS攻击?
- 一个本地分支能关联两个远程仓库吗_使用git分支保存hexo博客源码到github
- 【转】什么是CORS
- dpkg: 处理归档 /var/cache/apt/archives/libpng12-0_1.2.54-1ubuntu1.1_amd64.deb (--unpack)时出错: 无法安装 /lib/
- Android安全:代码注入
- win10系统HP打印机驱动程序无法使用
- 怎样进行文献调研?——与青年朋友谈科研(7)
- mysql 查询分析器_MYSQL查询分析器工具
- Flash存储卡与读卡器常识
- rovio环境配置与测试笔记
- AngularJS动态加载Controller
- MATLAB绘图基础01—复杂网络工具箱命令
- VUE-flex布局之align-items交叉轴对齐方式(5)
- C# GDAL 数字图像处理Part6 大气辐射矫正
- mySql中union all 及max,ifnull用法
- java DecimalFormate格式化十进制数字(小数,千分号,百分比……)
- 遥感学习笔记(二)——地物反射波谱特征
- iOS App Store 预览视频尺寸要求上传(经验)