包含三部分内容
1、Fisher线性分类器
2、利用 LDA 进行一个分类的问题:假设一个产品有两个参数柔软性 A 和钢性 B 来衡量它是否合格
3、基于 ORL 人脸库(见附件),实验样本主要来自于两个人,每人 45 张图片,共有 90 个样本,其中的 80 个样本作为训练样本,10 个作为测试样本。通过 LDA 实现两类问题的线性判别
有些图片等加载失败等,完整版实验报告、程序、实验所需资源请看附带资源
实验三 Fisher线性分类器的设计与实现
一、实验目的
1) 掌握 Fisher 线性判别的基本原理
2) 利用 Fisher 线性判别解决基本的两类线性分类问题
二、实验原理
2.1 基本思想
若把样本的多维特征空间的点投影到一条直线上,就能把特征空间压缩成一维。那么关键就是找到这条直线的方向,找得好,分得好,找不好,就混在一起。因此 fisher 方法目标就是找到这个最好的直线方向以及如何实现向最好方向投影的变换。这个投影变换恰是我们所寻求的解向量这是 fisher 算法的基本问题。
样本训练集以及待测样本的特征数目为 n。为了找到最佳投影方向,需要计算出各类均值、样本类内离散度矩阵 和总类间离散度矩阵、样本类间离散度矩阵,根据 Fisher 准则,找到最佳投影准则,将训练集内所有样本进行投影,投影到一维 Y 空间,由于 Y 空间是一维的,则需要求出 Y 空间的划分边界点,找到边界点后,就可以对待测样本进行一维 Y 空间的投影,判断它的投影点与分界点的关系,将其归类。
2.2 实现步骤
(1) 计算各类样本均值向量 mi , mi 是各个类的均值, Ni 是ωi类的样本个数。
(2) 计算样本类内离散度矩阵 Si 和总类内离散度矩阵 Sw
(3)计算样本类间离散度矩阵 Sb
- 求向量W*
我们希望投影后,在一维 Y 空间各类样本尽可能地分开,也就是说我们希望两类样本均值之差(m1-m2)越大越好,同时希望各类样本内部尽量密集,即希望类内离散度越小越好,因此,我们可以定义 Fisher 准则函数:
- 将训练集内所有样本进行投影
如果 Sw 是非奇异的,则要获得类间离散度与类内离散度的比值最大的投影方向
其中
是满足下式的 Sb 和 Sw 对应的 m 个最大特征值所对应的特征向量。注意到该矩阵最多只有 C-1 个非零特征值,C 是类别数。
三、实验内容
实验 1:利用 LDA 进行一个分类的问题:假设一个产品有两个参数柔软性 A 和钢性 B 来衡量它是否合格,如下图所示:
根据上图,我们可以把样本分为两类,一类是合格的产品,一类是不合格的产品。通过LDA 算法对训练样本的投影获得判别函数,然后判断测试样本的类别,即输入一个样本的参数,判断该产品是否合格。
实验 2:基于 ORL 人脸库,实验样本主要来自于两个人,每人 45 张图片,共有 90 个样本,其中的 80 个样本作为训练样本,10 个作为测试样本。通过 LDA 实现两类问题的线性判别。
实验 3:(选做)基于 ORL 人脸库,基于 Fisher 线性分类器实现多类人脸的识别问题。
四、实验结果及分析
要求:
- 写清楚具体的实验步骤及结果
线性判别分析包括LDA和Fisher,其思想都是讲数据映射到一条直线上,使得同类方差最小,不同类的方差最大。
LDA于Fisher的区别是不同类的协方差矩阵是否相等且满秩。
实验1:
LDA的思想:由所给定的数据集,设法将样例数据投影在一条直线上,使得同类数据的投影点尽可能的接近、而异类数据的投影点之间将可能间隔更远。在我们做新样本数据的分类时,将其投影到同样的直线上,再根据投影点的位置来确定新样本的类别。
实验要求:通过LDA 算法对训练样本的投影获得判别函数,然后判断测试样本的类别
步骤介绍:
首先,将实验数据参数整理输入,作为训练样本
然后,处理训练样本,得到判别函数
按照是否合格将样本分为两类,一类为合格的样本,一类为不合格样本;根据上述实现步骤,实现LDA算法,
(1)计算各类样本均值向量;
# 各类样本的均值向量
mean_0 = np.mean(x_0, axis=0) # 按列求均值,即每个特征的均值
mean_1 = np.mean(x_1, axis=0)
- 计算样本类内离散度矩阵和总类内离散度矩阵;
# 总样本类内散度矩阵
# 其实就是协方差矩阵之和
S_w = np.cov(x_0.T) + np.cov(x_1.T) # np.cov()求特征的协方差,默认一列表示一个样本,但我们传入的是一行表示一个样本,所以要先进行转置
- 计算样本类间离散度矩;
# 样本类间离散度矩阵
# numpy.matmul(a,b,out=None)两个numpy数组的矩阵相乘
S_b = np.matmul((mean_0 - mean_1).reshape(-1,1</