Python

您所在的位置:网站首页 python鸢尾花数据集两个类别散点图可视化 Python

Python

2024-07-11 23:41| 来源: 网络整理| 查看: 265

本博客运行环境为Jupyter Notebook、Python3。使用的数据集是鸢尾花数据集。

目录 线性判别分析代码实现缺少一组数据的问题已解决!代码已更新!

线性判别分析

线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的线性学习方法,在二分类问题.上因为最早由[Fisher, 1936]提出,亦称“Fisher判别分析”。 LDA的基本思想:给定训练样例集,设法将样例投影到一条直线上,使得同类样例的投影点尽可能接近、异类样例的投影点尽可能远离;在对新样本进行分类时,将其投影到同样的这条直线上,再根据投影点的位置来确定新样本的类别。 下图是LDA的二维示意图,“+”、“-”分别代表正倒和反倒,椭圆表示数据簇的外轮廓,虚线表示投影,红色实心圆和实心三角形分别表示两类样本投影后的中心点。 在这里插入图片描述

线性判别函数的一般形式可以表示为: g ( X ) = W T X + w 0 g(X)=W^TX+w_{0} g(X)=WTX+w0​ 其中, 在这里插入图片描述

Fisher选择投影方向W的原则,即使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,类内样本投影尽可能密集的要求。

(1)W的确定 各类样本均值向量mi 在这里插入图片描述 样本类内离散度矩阵 Si 和总类内离散度矩阵 Sw 在这里插入图片描述 样本类间离散度矩阵 Sb 在这里插入图片描述 在投影后的一维空间中,各类样本均值 在这里插入图片描述 样本类内离散度和总类内离散度 在这里插入图片描述 样本类间离散度 在这里插入图片描述 Fisher准则函数为 在这里插入图片描述

(2)阈值的确定 W0 是个常数,称为阈值权,对于两类问题的线性分类器可以采用下属决策规则: 在这里插入图片描述 如果g(x)>0,则决策x属于W1;如果g(x)y0,则x∈w1;否则x∈w2。

(4)“群内离散度”与“群间离散度” “群内离散度”要求的是距离越远越好;而“群间离散度”的距离越近越好。 “群内离散度”(样本类内离散矩阵)的计算公式为 S i = ∑ x ∈ X i ( x − m i ) ( x − m i ) T S_i=\sum_{x∈X_i}(x-m_i)(x-m_i)^T Si​=x∈Xi​∑​(x−mi​)(x−mi​)T 因为每一个样本有多维数据,因此需要将每一维数据代入公式计算后最后在求和即可得到样本类内离散矩阵。存在多个样本,重复该计算公式即可算出每一个样本的类内离散矩阵。 “群间离散度”(总体类离散度矩阵)的计算公式为 S w i j = S i + S j S_wij=S_i+S_j Sw​ij=Si​+Sj​

代码实现

例如鸢尾花数据集,将数据集分为三类样本,然后得到三个总体类离散度矩阵,三个总体类离散度矩阵根据上述公式计算即可。 IRIS数据集以鸢尾花的特征作为数据来源,数据集包含150个数据集,有4维,分为3 类,每类50个数据,每个数据包含4个属性,是在数据挖掘、数据分类中非常常用的测试集、训练集。 Python代码如下: df = pd.read_csv(r’Iris.csv’,header = None)这句是数据集存储路径,我已将数据集保存为.csv文件,需要修改为自己的路径。若使用sklearn库引用可以参看后面的代码。

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns #path=r'Iris.csv' #df = pd.read_csv(path, header=None) df = pd.read_csv(r'Iris.csv',header = None) 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,50): 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 g120: newiris2.extend(x) elif g130: newiris1.extend(x) elif g120: newiris2.extend(x) kind2=kind2+1 elif g130: newiris1.extend(x) elif g120: newiris2.extend(x) elif g13


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3