Iris数据集的Fisher线性分类及可视化

一、线性分类及准确率

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt 
path=r'F:/人工智能与机器学习/iris.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,:]-m1
    a=np.array([a])
    b=a.T
    s1=s1+np.dot(b,a)    
for i in range(0,30,1):
    c=Iris2[i,:]-m2
    c=np.array([c])
    d=c.T
    s2=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,:]-m3
    a=np.array([a])
    b=a.T
    s3=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)+T12
    g13=np.dot(w13,x.T)+T13
    g23=np.dot(w23,x.T)+T23
    if g12>0 and g13>0:
        newiris1.extend(x)
        kind1=kind1+1
    elif 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)+T12
    g13=np.dot(w13,x.T)+T13
    g23=np.dot(w23,x.T)+T23
    if g12>0 and g13>0:
        newiris1.extend(x)
    elif g12<0 and g23>0:
 
        newiris2.extend(x)
        kind2=kind2+1
    elif 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)+T12
    g13=np.dot(w13,x.T)+T13
    g23=np.dot(w23,x.T)+T23
    if 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,'%')

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、数据可视化

导入库

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns

读取数据

data = pd.read_csv(r'F:/人工智能与机器学习/iris.csv')

1.前五行数据

data.head()
IdSepalLengthSepalWidthPetalLengthPetalWidthSpecies
015.13.51.40.2setosa
124.93.01.40.2setosa
234.73.21.30.2setosa
344.63.11.50.2setosa
455.03.61.40.2setosa

2.后五行数据

data.tail()
IdSepalLengthSepalWidthPetalLengthPetalWidthSpecies
1451466.73.05.22.3virginica
1461476.32.55.01.9virginica
1471486.53.05.22.0virginica
1481496.23.45.42.3virginica
1491505.93.05.11.8virginica

3.数据描述

data.describe()
IdSepalLengthSepalWidthPetalLengthPetalWidth
count150.000000150.000000150.000000150.000000150.000000
mean75.5000005.8433333.0573333.7580001.199333
std43.4453680.8280660.4358661.7652980.762238
min1.0000004.3000002.0000001.0000000.100000
25%38.2500005.1000002.8000001.6000000.300000
50%75.5000005.8000003.0000004.3500001.300000
75%112.7500006.4000003.3000005.1000001.800000
max150.0000007.9000004.4000006.9000002.500000

4.对每种特征计数

data.Species.value_counts()

virginica 50
setosa 50
versicolor 50
Name: Species, dtype: int64

可视化操作

1.绘制花萼的长度与宽度的散点图与直方图

sns.jointplot(x="SepalLength",y="SepalWidth",data=data,kind='scatter');
plt.show()

在这里插入图片描述

2.绘制花瓣的长度与宽度的散点图与直方图

sns.jointplot(x="PetalLength",y="PetalWidth",data=data,kind='scatter');
plt.show()

在这里插入图片描述

3.绘制花萼的长度与宽度的折线图

sns.lineplot(x="SepalLength",y="SepalWidth",hue='Species',data=data)
plt.show()

在这里插入图片描述

4.绘制花瓣的长度与宽度的折线图

sns.lineplot(x="PetalLength",y="PetalWidth",hue='Species',data=data)
plt.show()

在这里插入图片描述

5.绘制花萼的长度与宽度的散点图

sns.relplot(x="SepalLength",y="SepalWidth",hue='Species',data=data)
plt.show()

在这里插入图片描述

6.绘制花瓣的长度与宽度的散点图

sns.relplot(x="PetalLength",y="PetalWidth",hue='Species',data=data)
plt.show()

在这里插入图片描述

7.绘制花萼长度的直方图

sns.distplot(data.SepalLength,bins=8,hist=True,kde=False)

在这里插入图片描述

8.绘制花萼宽度的直方图

sns.distplot(data.SepalWidth,bins=8,hist=True,kde=False)

在这里插入图片描述

9.绘制花瓣长度的直方图

sns.distplot(data.PetalLength,bins=5,hist=True,kde=False)

在这里插入图片描述

10.绘制花瓣宽度的直方图

sns.distplot(data.PetalWidth,bins=5,hist=True,kde=False)

在这里插入图片描述

11.绘制箱线图

sns.boxplot(x='SepalLength',data=data)

在这里插入图片描述

为了更加直观的观察四个属性的关系,将其放入一个图中

#对于每个属性的data创建一个新的DataFrame
Iris1 = pd.DataFrame({"Id": np.arange(1,151), 'Attribute': 'SepalLengthCm', 'Data':data.SepalLength, 'Species':data.Species})
Iris2 = pd.DataFrame({"Id": np.arange(151,301), 'Attribute': 'SepalWidthCm', 'Data':data.SepalWidth, 'Species':data.Species})
Iris3 = pd.DataFrame({"Id": np.arange(301,451), 'Attribute': 'PetalLengthCm', 'Data':data.PetalLength, 'Species':data.Species})
Iris4 = pd.DataFrame({"Id": np.arange(451,601), 'Attribute': 'PetalWidthCm', 'Data':data.PetalWidth, 'Species':data.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)

在这里插入图片描述

12.绘制分布图

sns.pairplot(data.drop('Id',axis=1),hue='Species')
plt.show()

在这里插入图片描述

参考文章

http://bob0118.club/?p=268

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值