0、前言:
在前面的博客中,我们也讲解过分类算法,它的另外一个名字又叫做逻辑回归。🔗【吴恩达·学习>机器学习】第三章:分类任务:逻辑回归模型(交叉熵损失函数、决策边界、过拟合、正则化)
在那篇博客中,我们了解到简单的线性回归模型+阈值分割无法完成所有的分类任务,但是在回归模型的基础上引入逻辑函数,将其线性转换为非线性的逻辑回归模型,则可以很好的解决这个问题。
事实上,逻辑回归只是解决分类问题其中一种方法,在此篇文章,我们将系统的了解分类问题,且就其中一种线性分类算法——Fisher 进行详细的讲解。
一、基本分类问题的概念
➢问题的定义:
设有满足独立同分布条件(I.I.D)的训练数据集为:
D = { ( x n , y n ) } n = 1 N D=\{(x_n,y_n)\}_{n=1}^N D={(xn,yn)}n=1N
其中标注𝑦仅取有限的离散值,即𝑦表示其所有代表的类型编号,
y ∈ { 1 , 2 , . . . , C } y\in\{1,2,...,C\} y∈{1,2,...,C}
ps:样本的抽取是相互独立的,一个样本的抽取不会影响另外一个样本的抽取。
➢ 分类(Classification):
C = 2 , b i n a r y c l a s s i f i c a t i o n C > 2 , m u l t i c l a s s c l a s s i f i c a t i o n \begin{aligned}&C=2,binaryclassification\\&C>2,multiclassclassification\end{aligned} C=2,binaryclassificationC>2,multiclassclassification
训练过程中标签 y y y的定义:
1 对于2类问题: y ∈ { 0 , 1 } , y = 1 ⇒ C 1 y = 0 ⇒ C 2 ; 2 对于K ( > 2 ) 类问题(K-to-1编码) : y = ( 0 , ⋯ , 0 , 1 , 0 , ⋯ , 0 ) T \begin{aligned}&1\text{ 对于2类问题: }y\in\{0,1\},y=1\Rightarrow C1\quad y=0\Rightarrow C2;\\&2\text{ 对于K }(>2)\text{类问题(K-to-1编码)}:y=(0,\cdots,0,1,0,\cdots,0)^T\end{aligned} 1 对于2类问题: y∈{0,1},y=1⇒C1y=0⇒C2;2 对于K (>2)类问题(K-to-1编码):y=(0,⋯,0,1,0,⋯,0)T
二、求解方法
➢ 求解方法:
- 区分函数法:设计一个区分函数𝑓(𝝓) ,基于某种准则对该函数进行优化,进而得到分类面,如Fisher,它是就要人为定义的准则,没有考虑概率意义;——判别式(决策边界(Decision Boundary))
- 生成性概率模型法:对每个类𝐶𝑘建立一个统计模型 p ( ϕ ∣ C k ) p(\phi|C_k) p(ϕ∣Ck) ,在分类时考查测试样本在每个模型上的概率,再基于贝叶斯公式得到属于某一类的后验概率𝑝(𝐶𝑘|𝜙) ,这一方法依赖模型 p ( ϕ ∣ C k ) p(\phi|C_k) p(ϕ∣Ck)与实际数据的契合程度;——基于似然(概率)
- .区分性概率模型法:直接对后验概率𝑝(𝐶𝑘|𝜙)建模,不对数据分布做显示假设,只关注分类。
1. 区分函数法
-
通俗解释
- 想象你要在一片草地上划分出两个区域,一个是种玫瑰花的区域,一个是种郁金香的区域。区分函数法就像是你自己制定一个规则来划分这片草地。比如,你看哪里的土比较肥沃(这就是你自己定义的一个特征,相当于函数中的变量),然后你根据这个特征画一条线(这个线就是分类面),把草地分成两部分。像Fisher方法,就好比你只根据自己觉得土肥不肥这个标准来划分,不考虑其他的,也不关心从概率的角度看这样划分是不是合理。
-
举例
- 假如我们要区分猫和狗的图片。我们定义一个区分函数,这个函数可能是看图片中动物的鼻子长度(这是我们自己选的一个区分特征)。如果鼻子长度大于某个值,我们就认为是狗的图片;小于这个值,就是猫的图片。这个过程中,我们没有去考虑猫和狗的鼻子长度在所有猫和狗的图片中出现的概率是多少。
-
重点关注
- 这种方法重点在于设计一个好的区分规则,找到一个合适的函数来划分不同的类别。它更像是一种几何或者基于特征比较的方法,直接确定分类的边界,不涉及概率的计算。
- 这种方法重点在于设计一个好的区分规则,找到一个合适的函数来划分不同的类别。它更像是一种几何或者基于特征比较的方法,直接确定分类的边界,不涉及概率的计算。
-
经典算法:
- Fisher 线性判别分析(LDA):它的基本思想是寻找一个投影方向,使得在这个方向上,不同类别之间的样本尽可能地分开,而同一类别内的样本尽可能地聚集。通过计算类间散度矩阵和类内散度矩阵,找到一个最优的线性变换向量,将高维数据投影到低维空间,然后在这个低维空间中确定分类边界。——核心:降维
- 感知机算法:感知机是一种简单的线性分类模型,它基于神经元的工作原理。对于输入的特征向量,通过权重向量和偏置进行线性组合,然后通过一个激活函数(通常是阶跃函数)来判断输出类别。它通过不断地调整权重向量,使得错误分类的样本能够被正确分类。
2. 生成性概率模型法
- 通俗解释
- 还是用花园的例子。现在你知道玫瑰花和郁金香各自喜欢什么样的生长环境(这就相当于对每个类建立一个统计模型)。比如,玫瑰花喜欢阳光多、土壤湿度适中的环境,郁金香喜欢阳光少一点、土壤肥沃的环境。当有一个新的小区域(相当于测试样本)出现时,你先看看这个小区域符合玫瑰花生长环境的概率有多大,再看看符合郁金香生长环境的概率有多大,然后根据贝叶斯公式(就像是一个公平的裁判)来判断这个小区域更可能是种玫瑰花还是郁金香。这种方法很依赖你对玫瑰花和郁金香生长环境的了解是不是准确,也就是模型和实际数据是不是契合。
- 举例
- 对于区分手写数字0 - 9的任务。我们对每个数字建立一个生成模型,比如对于数字0,我们可能知道它的笔画通常是怎么弯曲的,笔画的粗细分布等概率情况(这些就是模型的参数)。当看到一个新的手写数字时,我们计算这个数字符合数字0的笔画概率、符合数字1的笔画概率等等,最后根据贝叶斯公式算出它最有可能是哪个数字。
- 重点关注
- 重点在于准确地建立每个类别的统计模型,也就是要知道每个类别自身的概率分布情况。然后通过贝叶斯公式综合考虑先验概率和似然概率来得到后验概率,以此来进行分类。这种方法需要对数据的生成过程有一定的假设和了解。
- 经典算法
- 朴素贝叶斯算法:基于贝叶斯定理,假设特征之间相互独立(这是 “朴素” 的来源)。对于给定的类别,计算每个特征出现的概率,然后根据贝叶斯公式计算后验概率,选择后验概率最大的类别作为分类结果。
- 高斯混合模型(GMM):它假设数据是由多个高斯分布混合而成的。每个高斯分布代表一个类别,通过估计每个高斯分布的参数(均值、协方差等)来建立模型。在分类时,计算测试样本属于每个高斯分布的概率,然后根据概率大小确定类别。
3. 区分性概率模型法
-
通俗解释
- 就好像你有一个魔法盒子,你把一张图片(测试样本)放进去,这个盒子直接告诉你这张图片是猫的概率是多少,是狗的概率是多少,它不会去管猫和狗在整个世界上的分布情况(不对数据分布做显示假设),它只关心怎么准确地把这张图片分到猫或者狗的类别里。它的目标就是直接得到这个分类的概率,然后根据概率大小来分类。
-
举例
- 假设我们有一个区分性概率模型来判断一封邮件是垃圾邮件还是正常邮件。这个模型不会去考虑正常邮件和垃圾邮件在所有邮件中的比例(先验概率),也不会去建立垃圾邮件和正常邮件是怎么产生的模型(像生成性概率模型那样)。它只是通过大量的已经标记好的邮件来学习,直接输出一封新邮件是垃圾邮件或者正常邮件的概率,然后我们根据这个概率来判断邮件的类别。
-
重点关注
- 重点在于直接对后验概率建模,跳过了对数据生成过程的假设,更关注如何从数据中直接学习到分类的概率,以达到更好的分类效果。这种方法相对更注重分类的准确性,而不是数据的生成机制。
-
经典算法:
- 逻辑回归:它是一种广义线性模型,通过将线性函数的结果映射到一个概率值(0 - 1 之间)来进行分类。使用 Sigmoid 函数(对于二分类情况)将线性组合的结果转换为后验概率。
- 支持向量机(SVM) - 概率输出版本:传统的 SVM 是通过找到一个最优的分类超平面,使得两类样本之间的间隔最大。而概率输出版本的 SVM 是在传统 SVM 的基础上,通过一些方法(如 Platt 缩放等)将 SVM 的输出转换为概率输出,从而可以直接得到样本属于某一类的概率。——核心:特征升维
三、Fisher线性判别分析算法
本篇文章选取其中一个经典算法——Fisher,来进行详细的讲解。
1、原理概述
LDA线性判别分析——Linear Discriminant Analysis:
LDA算法的思想是将数据投影到低维空间之后,使得同一类数据尽可能的紧凑,不同类的数据尽可能分散;因此,是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的.
LDA的思想——“投影后类内方差最小,类间方差最大” 。 将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。
在上图,我们可以看到,投影后,类间距离更大,类内距离更小更紧凑,于是更容易分类。投影便是Fisher算法的思想,那么我们的目标也就是要找到尽可能好的投影方向—— w w w
🔑关键:按照类间小,类内大的目标,设立目标函数求解 w w w
值得注意的是,我们求得的w是最终投影的平面(在这里为一维直线)方向,而不是感知机或逻辑回归中的决策边界!
2、原理详解
2.1、输入
设包含N个样本的训练集 D = { ( ϕ n , y n ) : n = 1 , 2 , . . . , N } , 其中 y n ∈ { C 1 , C 2 } 为两类。 \text{设包含N个样本的训练集}D=\{(\phi_n,y_n){:}n=1{,}2,...,N\},\text{ 其中}y_n\in\{C_1,C_2\}\text{为两类。} 设包含N个样本的训练集D={(ϕn,yn):n=1,2,...,N}, 其中yn∈{C1,C2}为两类。
2.2、投影与模型假设
基本上所有的学习>机器学习,我们首先要确定我们的模型是什么,这个模型有可能能解决我们的问题。等模型确定好后,我们再用算法对模型的参数进行求解,确定最终模型的这个样子。
如上图,我们的核心就是确定投影方向 w w w,这句话还是很抽象,我们具体来看看这个w
到底是什么,然后了解怎么投影,最后确定我们要求解的到底是什么。
🌱 投影,到底怎么投?
值得注意的是,在这里投影指的是 :以原点为起点, x i x_{i} xi为终点的向量在直线 z z z(方向为 w w w这个向量)上的投影。
假设啊,我们现在找到了一个适合的投影方向,则样本 x x x在直线 z z z上的投影为: z i = w T x i z_i = w^Tx_i zi=wTxi。
这个公式的来源:我们假设 w w w 的模为1(因为方向重要长度不重要,可以缩放)。在两个向量中,你可以很明显地看出 x i x_i xi在 w w w上的投影 Δ = x i c o s θ \Delta=x_{i}cos\theta Δ=xicosθ ,而 x i x_i xi在 w w w上的投影,写作: w T x i w^{T}x_{i} wTxi的形式
然后,所有样本在 z z z上的投影的均值为:
z ˉ = 1 N ∑ i = 1 N z i = 1 N ∑ i = 1 N w T x i \bar{z}=\frac1N\sum_{i=1}^Nz_i=\frac1N\sum_{i=1}^Nw^Tx_i zˉ=N1i=1∑Nzi=N1i=1∑NwTxi
还记得我们的目标吗:类内小,类间大
在这之前,我们先了解几个概念:
1.方差:
-
用于衡量一组数据的离散程度,在统计描述中,方差用来计算每一个变量(观察值)与总体均数之间的差异,即将各个变量值与其均值离差平方的平均数。
-
(1)总体方差:在统计学中,方差是用来度量单个随机变量的离散程度,方差的计算公式为: σ 2 = 1 N ∑ i = 1 N ( x i − μ ) 2 \sigma^2=\frac1N\sum_{i=1}^N(x_i-\mu)^2 σ2=N1i=1∑N(xi−μ)2
其中,𝑁 表示样本量,𝜇总体的均值,标准差(standard deviation)是方差的平方根,𝝈 为总体的标准差 -
(2)样本方差,在实际情况中,总体均值𝜇是很难得到的,无偏方差也就得不到;往往通过抽样来计算,于是有样本方差,计算公式如下: s 2 = 1 N − 1 ∑ i = 1 N ( x i − x ˉ ) 2 s^2=\frac1{N-1}\sum_{i=1}^N(x_i-\bar{x})^2 s2=N−11i=1∑N(xi−xˉ)2其中, x ‾ \overline{x} x⎯⎯⎯⎯ 为样本的均值, 𝒔 为样本的标准差,N 为样本的个数。
-
方差:物理意义实际是描述数据的偏离程度,所以方差越大偏离程度越大。——离散程度
-
标准差:描述的是样本集合的各个样本点到均值的距离之平均;标准差描述的是散布度,即标准差越小,分布越集中。
2.协方差:
协方差(Covariance):在概率论和统计学中用于衡量两个变量的总体误差,用于衡量两个变量的之间的关系。如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。
C o v ( x , y ) = σ ( y , x ) = 1 n − 1 ∑ k = 1 n ( x k − x ˉ ) ( y k − y ˉ ) Cov(x,y)=\sigma(y,x)=\frac1{n-1}\sum_{k=1}^n(x_k-\bar{x})(y_k-\bar{y}) Cov(x,y)=σ(y,x)=n−11k=1∑n(xk−xˉ)(yk−yˉ)
好我们回来。如果基于训练数据能够学习一个优化的𝑤,使得不同类的训练样本在映射空间里的“区分性”最大(类内小,类间大),则基于下面公式可得到一个简单的分类函数。也是我们需要最大化的目标函数!
L ( w ) = ( m 2 − m 1 ) 2 δ 1 2 + δ 2 2 L(w)=\frac{(m_2-m_1)^2}{\delta_1^2+\delta_2^2} L(w)=δ12+δ22(m2−m1)2
其中, 𝑚1、 𝑚2是𝐶1和𝐶2的样本点在映射空间里的均值, δ 1 2 \delta_1^2 δ12和 δ 2 2 \delta_2^2 δ22是映射空间里的方差。
即:投影后类内距离越小,类间距离越大,则两类的区分性越强。
2.3、优化目标函数求解参数 w w w
值得注意的是,这里的 S W S_{W} SW、 S B S_{B} SB与之前的方差有很大的不同!!!!!!在这里前者是矩阵!!!后者方差是指的是协方差矩阵!!!
这个地方一定要搞清楚,不然你就不知道为什么前面是方差是一个数但是后面方差求出来是一个矩阵了!
🚨这里将 L ( w ) L(w) L(w)转化的意义在于,将原来假设的投影 w w w的方差和均值转化为了各类别样本本身的方差和均值,这样求解出来的w就可以直接用样本本来的值求解了,你甚至可以理解成把虚的变成实的!(因为我们知道的就是样本本来的值,就是要根据它去求)
3、算法流程
-
计算各类样本均值向量 m i m_i mi, 𝑁𝑖 是𝑤𝑖类的样本个数:
m i = 1 N i ∑ x j ∈ w i x j , i = 1 , 2 m_i=\frac1{N_i}\sum_{x_j\in w_i}x_j\quad,\quad i=1,2 mi=Ni1xj∈wi∑xj,i=1,2 -
计算样本类内离散度矩阵 S i S_i Si 和总类内离散度矩阵𝑆𝑤 :
S i = ∑ x j ∈ w i ( x j − m i ) ( x j − m i ) T , i = 1 , 2 ; S w = S 1 + S 2 S_i=\sum_{x_j\in w_i}(x_j-m_i)(x_j-m_i)^T,\:i=1,2\quad;\quad S_w=S_1+S_2 Si=xj∈wi∑(xj−mi)(xj−mi)T,i=1,2;Sw=S1+S2 -
计算样本类间离散度矩阵 S B S_B SB:
S B = ( m 1 − m 2 ) ( m 1 − m 2 ) T S_B=(m_1-m_2)(m_1-m_2)^T SB=(m1−m2)(m1−m2)T -
求投影方向向量 𝑾 (维度和样本的维度相同),希望投影后,在一维𝒀 空间里各类样本尽可能分开,就是希望的两类样本均值之差(𝒎𝟏 − 𝒎𝟐) 越大越好,同时希望各类样本内部尽量密集,即是:希望类内离散度越小越好。因此,我们可以定义 Fisher准则函数为: J ( w ) = w T S B w w T S W w : J ( w ) 取极大值,则: w = S w − 1 ( m 1 − m 2 ) J(w)=\frac{w^TS_Bw}{w^TS_Ww}:\quad J(w)\quad\text{取极大值,则:}\mathrm{w=S_w^{-1}(m_1-m_2)} J(w)=wTSWwwTSBw:J(w)取极大值,则:w=Sw−1(m1−m2)
样本类内离散度 S i 2 ‾ \overline{S_{i}^{2}} Si2和总类内离散度 S W ‾ \overline{S_{W}} SW:
S i ‾ 2 = ∑ y j ∈ w i ( y j − m i ‾ ) 2 , 则 S w ‾ = S ˉ 1 2 + S ˉ 2 2 , i = 1 , 2 \overline{S_i}^2=\sum_{y_j\in w_i}(y_j-\overline{m_i})^2,\quad\text{则}\overline{S_w}=\bar{S}_1^2+\bar{S}_2^2\quad,\quad i=1,2 Si2=yj∈wi∑(yj−mi)2,则Sw=Sˉ12+Sˉ22,i=1,2 -
将训练集内所有样本进行投影 y = w T x y=w^Tx y=wTx
计算在投影空间上的分割阈值𝑦0,在一维𝑌空间,各类样本均值为 m i ‾ : \overline{m_{\mathrm{i}}}: mi: m i ‾ = 1 N i ∑ y j ∈ w i y j = 1 N i ∑ x j ∈ w i w T x j = w T m i i = 1 , 2 ; y 0 = N 1 m 1 + N 2 m 2 N 1 + N 2 \overline{m_i}=\frac{1}{N_i}\sum_{y_j\in w_i}y_j\quad=\frac{1}{N_i}\sum_{x_j\in w_i}w^Tx_j\quad=w^Tm_i\:i=1,2\quad;\quad y_0=\frac{N_1m_1+N_2m_2}{N_1+N_2} mi=Ni1yj∈wi∑yj=Ni1xj∈wi∑wTxj=wTmii=1,2;y0=N1+N2N1m1+N2m2
-
对于二分类问题,类内离散度不是一个矩阵,而是一个值,还可以发现, 𝑆𝐵和 𝑆𝑊都是对称矩阵,即 S B = S B T , S W = S W T S_B=S_B^T,S_W=S_W^T SB=SBT,SW=SWT
-
对于给定的测试样本𝑥 ,计算出它在 𝑤 上的投影点 y \text{y} y
-
根据决策规则分类
{ y > y 0 ⟹ x ∈ ω 1 y < y 0 ⟹ x ∈ ω 2 \begin{cases}y>y_0\Longrightarrow x\in\omega_1\\y<y_0\Longrightarrow x\in\omega_2\end{cases} {y>y0⟹x∈ω1y<y0⟹x∈ω2
4、例题&算法实现
-
计算各类样本均值向量:
x ‾ 1 ( 1 ) = 1 6 ( 1.14 + 1.18 + . . . + 1.28 ) = 1.227 x ‾ 1 ( 2 ) = 1 6 ( 1.78 + 1.96 + . . . + 1.96 ) = 1.927 x ‾ 2 ( 1 ) = 1 9 ( 1.24 + 1.36 + . . . + 1.56 ) = 1.413 x ‾ 2 ( 2 ) = 1 9 ( 1.72 + 1.74 + . . . + 1.78 ) = 1.800 x ‾ 1 = [ x ‾ 1 ( 1 ) x ‾ 1 ( 2 ) ] = [ 1.227 1.927 ] x ‾ 2 = [ x ‾ 2 ( 1 ) x ‾ 2 ( 2 ) ] = [ 1.413 1.800 ] \begin{aligned}&\overline{x}_{1}^{(1)}=\frac{1}{6}(1.14+1.18+...+1.28)=1.227\\&\overline{x}_{1}^{(2)}=\frac{1}{6}(1.78+1.96+...+1.96)=1.927\\&\overline{x}_{2}^{(1)}=\frac{1}{9}(1.24+1.36+...+1.56)=1.413\\&\overline{x}_{2}^{(2)}=\frac{1}{9}(1.72+1.74+...+1.78)=1.800\\&\overline{\mathbf{x}}_{1}=\begin{bmatrix}\overline{x}_{1}^{(1)}\\\overline{x}_{1}^{(2)}\end{bmatrix}=\begin{bmatrix}1.227\\1.927\end{bmatrix}\\&\overline{\mathbf{x}}_{2}=\begin{bmatrix}\overline{x}_{2}^{(1)}\\\overline{x}_{2}^{(2)}\end{bmatrix}=\begin{bmatrix}1.413\\1.800\end{bmatrix}\end{aligned} x1(1)=61(1.14+1.18+...+1.28)=1.227x1(2)=61(1.78+1.96+...+1.96)=1.927x2(1)=91(1.24+1.36+...+1.56)=1.413x2(2)=91(1.72+1.74+...+1.78)=1.800x1=[x1(1)x1(2)]=[1.2271.927]x2=[x2(1)x2(2)]=[1.4131.800] -
计算样本类内离散度矩阵 S i S_i Si
S 1 = ( 1.14 − 1.227 1.78 − 1.927 ) ( 1.14 − 1.227 1.78 − 1.927 ) + . . . + ( 1.28 − 1.227 1.96 − 1.927 ) ( 1.28 − 1.227 1.96 − 1.927 ) = ( 0.0197 0.0225 0.0225 0.0389 ) S 2 = ( 1.24 − 1.413 1.72 − 1.804 ) ( 1.24 − 1.413 1.72 − 1.804 ) + . . . + ( 1.56 − 1.413 1.78 − 1.804 ) ( 1.56 − 1.413 1.78 − 1.804 ) = ( 0.0784 0.0536 0.0536 0.1352 ) \begin{aligned}&S_{1}=\begin{pmatrix}1.14-1.227\\1.78-1.927\end{pmatrix}\begin{pmatrix}1.14-1.227&1.78-1.927\end{pmatrix}+...\\&+\begin{pmatrix}1.28-1.227\\1.96-1.927\end{pmatrix}\begin{pmatrix}1.28-1.227&1.96-1.927\end{pmatrix}\\&=\begin{pmatrix}0.0197&0.0225\\0.0225&0.0389\end{pmatrix}\\&S_{2}=\begin{pmatrix}1.24-1.413\\1.72-1.804\end{pmatrix}\begin{pmatrix}1.24-1.413&1.72-1.804\end{pmatrix}+...\\&+\begin{pmatrix}1.56-1.413\\1.78-1.804\end{pmatrix}\begin{pmatrix}1.56-1.413&1.78-1.804\end{pmatrix}\\&=\begin{pmatrix}0.0784&0.0536\\0.0536&0.1352\end{pmatrix}\end{aligned} S1=(1.14−1.2271.78−1.927)(1.14−1.2271.78−1.927)+...+(1.28−1.2271.96−1.927)(1.28−1.2271.96−1.927)=(0.01970.02250.02250.0389)S2=(1.24−1.4131.72−1.804)(1.24−1.4131.72−1.804)+...+(1.56−1.4131.78−1.804)(1.56−1.4131.78−1.804)=(0.07840.05360.05360.1352)
- 总类内离散度矩阵 S w S_w Sw :
S w = S 1 + S 2 = ( 0.0981 0.0761 0.0761 0.1741 ) S_{_w}=S_1+S_2=\begin{pmatrix}0.0981&0.0761\\[0.3em]0.0761&0.1741\end{pmatrix} Sw=S1+S2=(0.09810.07610.07610.1741)
-
⭐ 求最优投影向量 w = S w − 1 ( m 1 − m 2 ) \mathrm{w=S_w^{-1}(m_1-m_2)} w=Sw−1(m1−m2)
S w − 1 = ( 15.4209 − 6.7422 − 6.7422 8.6905 ) W ∗ = S w − 1 ( x ˉ 1 − x ˉ 2 ) = ( − 3.7326 2.3593 ) T \begin{aligned}&S_{w}^{-1}=\begin{pmatrix}15.4209&-6.7422\\-6.7422&8.6905\end{pmatrix}\\&W^{*}=S_{w}^{-1}(\mathbf{\bar{x}}_{1}-\mathbf{\bar{x}}_{2})=\begin{pmatrix}-3.7326&2.3593\end{pmatrix}^{T}\end{aligned} Sw−1=(15.4209−6.7422−6.74228.6905)W∗=Sw−1(xˉ1−xˉ2)=(−3.73262.3593)T -
对两类已知样本,求出它们在W*上的投影点y:
y 1 = W ∗ T X 1 , y 2 = W ∗ T X 2 y 1 = [ − 0.0555 0.2199 − 0.0907 0.0156 − 0.1337 − 0.1534 ] T y 2 = [ − 0.5703 − 0.9711 − 1.2816 − 0.8570 − 0.6682 − 1.2147 − 1.2302 − 0.8407 − 1.6232 ] T \begin{aligned}&y_{1}=\mathrm{W}^{*T}X_{1},y_{2}=\mathrm{W}^{*T}X_{2}\\&y1=[-0.0555\quad0.2199\quad-0.0907\quad0.0156\quad-0.1337\quad-0.1534]^T\\&y2=[-0.5703\quad-0.9711\quad-1.2816\quad-0.8570\quad-0.6682\quad-1.2147\quad-1.2302\quad-0.8407\quad-1.6232]^T\end{aligned} y1=W∗TX1,y2=W∗TX2y1=[−0.05550.2199−0.09070.0156−0.1337−0.1534]Ty2=[−0.5703−0.9711−1.2816−0.8570−0.6682−1.2147−1.2302−0.8407−1.6232]T -
求各类的均值 Y ˉ i \bar{Y}_{i} Yˉi
Y i ‾ = 1 N i ∑ Y ∈ ω Y y ‾ 1 = − 0.0330 y ‾ 2 = − 1.0286 \overline{Y_{i}}=\frac{1}{N_{i}}\sum_{Y\in\omega}Y\\\overline{\mathbf{y}}_{1}=-0.0330\\\overline{\mathbf{y}}_{2}=-1.0286 Yi=Ni1Y∈ω∑Yy1=−0.0330y2=−1.0286 -
选取分类阈值 w 0 \mathrm{w}_{0} w0
有三种取法,这里取: W 0 = Y ‾ 1 + Y ‾ 2 2 = − 0.5308 W_0=\frac{\overline{Y}_1+\overline{Y}_2}{2}=-0.5308 W0=2Y1+Y2=−0.5308 -
对待测样本 x x x,计算它在 W ∗ W^* W∗上的投影点 y y y
公式: y=W*T X X = ( 1.24 1.80 1.28 1.84 1.40 2.04 ) ⇒ Y = ( − 0.3816 , − 0.4365 , − 0.4126 ) T \begin{aligned}&\text{公式: y=W*T X}\\&X=\begin{pmatrix}1.24&1.80\\1.28&1.84\\1.40&2.04\end{pmatrix}\\&\Rightarrow\\&Y=\begin{pmatrix}-0.3816,&-0.4365,&-0.4126\end{pmatrix}^T\end{aligned} 公式: y=W*T XX= 1.241.281.401.801.842.04 ⇒Y=(−0.3816,−0.4365,−0.4126)T -
根据判别规则对样本 X X X进行分类: Y = W ∗ T X > W 0 , 则 X ∈ ω 1 ; Y = W ∗ T X < W 0 , 则 X ∈ ω 2 。 根据(7),分类阈值W 0 = − 0.5308 而: Y = ( − 0.3816 , − 0.4365 , − 0.4126 ) T 可以看出, y i > W 0 因此,这三个样本都属于Apf蠓( ω 1 类 ) \begin{aligned}&\mathrm{Y=W^{*T}X>W0,则X\in\omega1~;}\\&\mathrm{Y=W^{*T}X<W0,则X\in\omega2~。}\\&\text{根据(7),分类阈值W}_{0}=-0.5308\\&\text{而:}\\&Y=\begin{pmatrix}-0.3816,&-0.4365,&-0.4126\end{pmatrix}^T\\&\text{可以看出,}y_i>W_0\\&\text{因此,这三个样本都属于Apf蠓(}\omega_1\text{类})\end{aligned} Y=W∗TX>W0,则X∈ω1 ;Y=W∗TX<W0,则X∈ω2 。根据(7),分类阈值W0=−0.5308而:Y=(−0.3816,−0.4365,−0.4126)T可以看出,yi>W0因此,这三个样本都属于Apf蠓(ω1类)
import numpy as np
import matplotlib.pyplot as pltdef fisher_algorithm():# 已知数据x1 = np.array([[1.14, 1.78], [1.18, 1.96], [1.20, 1.86], [1.24, 1.94], [1.26, 1.98], [1.28, 1.96]])x2 = np.array([[1.24, 1.72], [1.36, 1.74], [1.38, 1.64], [1.38, 1.82], [1.40, 1.70], [1.48, 1.82], [1.54, 1.82],[1.56, 1.76], [1.56, 1.78]])x_test = np.array([[1.24, 1.80], [1.28, 1.84], [1.40, 2.04]])# 1. 计算各类样本均值向量mean_x1 = np.mean(x1, axis=0)mean_x2 = np.mean(x2, axis=0)# 2. 计算样本类内离散度矩阵s1 = np.zeros((2, 2))for sample in x1:diff = sample - mean_x1s1 += np.outer(diff, diff)s2 = np.zeros((2, 2))for sample in x2:diff = sample - mean_x2s2 += np.outer(diff, diff)# 3. 计算总类内离散度矩阵s_w = s1 + s2# 4. 求最优投影向量s_w_inv = np.linalg.inv(s_w)w_star = s_w_inv.dot(mean_x1 - mean_x2)# 5. 对两类已知样本,求出它们在 W*上的投影点 yy1 = x1.dot(w_star)y2 = x2.dot(w_star)# 6. 求各类的均值mean_y1 = np.mean(y1)mean_y2 = np.mean(y2)# 7. 选取分类阈值w0 = (mean_y1 + mean_y2) / 2# 8. 对待测样本 x,计算它在 W*上的投影点 yy_test = x_test.dot(w_star)return w_star, w0, x1, x2, x_test, y_testdef plot_fisher(w_star, w0, x1, x2, x_test, y_test):# 绘制两类已知样本和测试样本plt.scatter(x1[:, 0], x1[:, 1], label='Apf midge samples', color='blue')plt.scatter(x2[:, 0], x2[:, 1], label='Af midge samples', color='red')plt.scatter(x_test[:, 0], x_test[:, 1], label='Test samples', color='green')# 绘制判别函数直线# 判别函数直线的方程为 w_star[0]*x + w_star[1]*y - w0 = 0# 转化为 y = (-w_star[0]*x + w0) / w_star[1]x_range = np.array([np.min([np.min(x1[:, 0]), np.min(x2[:, 0]), np.min(x_test[:, 0])]),np.max([np.max(x1[:, 0]), np.max(x2[:, 0]), np.max(x_test[:, 0])])])y_range = (-w_star[0] * x_range + w0) / w_star[1]plt.plot(x_range, y_range, color='black', label='Discriminant function')plt.xlabel('Antenna length')plt.ylabel('Wing length')plt.legend()plt.title('Midge Classification by Fisher Algorithm')plt.show()w_star, w0, x1, x2, x_test, y_test = fisher_algorithm()
plot_fisher(w_star, w0, x1, x2, x_test, y_test)# 打印测试结果
for i, sample in enumerate(x_test):if y_test[i] > w0:print(f"Test sample {i + 1} belongs to Apf midge.")else:print(f"Test sample {i + 1} belongs to Af midge.")
结果:
Test sample 1 belongs to Apf midge.
Test sample 2 belongs to Apf midge.
Test sample 3 belongs to Apf midge.