PCA和Fisher LDA

本文深入探讨了两种主要的降维技术:PCA(主成分分析)和FisherLDA(线性判别分析)。PCA适用于无监督场景,通过最大化数据投影的方差来减少维度;而FisherLDA则是在有监督的情况下,通过优化类间距离与类内距离的比值来进行降维。文章详细解释了这两种方法的数学原理和实现过程。

PCA

PCA主要用于没有标签的降维,想法就是把数据投影在某个方向上,使得信噪比最大,也就是投影的方差最大。

对于给定的一组数据x1,x2,...,xnx_1, x_2,...,x_nx1,x2,...,xn,其中每一个都是列向量,假设投影方向的单位列向量是w,投影后的方差可以表示为
D(x)=1n∑i=1n(xiTw)2D(x)=1n∑i=1n(xiTw)T(xiTw)D(x)=wT[1n∑i=1n(xixiT)]w D(x)=\frac{1}{n}\sum_{i=1}^n(x_i^Tw)^2\\ D(x)=\frac{1}{n}\sum_{i=1}^n(x_i^Tw)^T(x_i^Tw)\\ D(x)=w^T[\frac{1}{n}\sum_{i=1}^n(x_ix_i^T)]w D(x)=n1i=1n(xiTw)2D(x)=n1i=1n(xiTw)T(xiTw)D(x)=wT[n1i=1n(xixiT)]w
中间刚好是协方差矩阵Σ\SigmaΣ,所以目标函数就是
arg max⁡wwTΣws.t.wTw=1 \argmax_w w^T\Sigma w \\ s.t. w^Tw=1 wargmaxwTΣws.t.wTw=1
所以拉格朗日乘数法就上了,可以推出
D(x)=wTΣw=λwTw=λ D(x)=w^T\Sigma w=\lambda w^T w=\lambda D(x)=wTΣw=λwTw=λ
所以x投影后的方差就是协方差矩阵的特征值,投影的方向就是特征值对应的特征向量。哪个投影方向好就是特征值较大的方向,最后取特征值较大的特征向量的方向。

Fisher LDA

Fisher LDA是有监督的降维,降维目标是类间距离和类内距离的比值达到最大,也就是
J(w)=wT(u1−u2)(u1−u2)Tw∑x∈CiwT(x−ui)(x−ui)TwSB=(u1−u2)(u1−u2)TSW=∑x∈Ci(x−ui)(x−ui)T J(w)=\frac{w^T(u_1-u_2)(u_1-u_2)^Tw}{\sum_{x \in C_i}w^T(x-u_i)(x-u_i)^Tw} \\ S_B=(u_1-u_2)(u_1-u_2)^T\\ S_W=\sum_{x \in C_i}(x-u_i)(x-u_i)^T\\ J(w)=xCiwT(xui)(xui)TwwT(u1u2)(u1u2)TwSB=(u1u2)(u1u2)TSW=xCi(xui)(xui)T
其中uiu_iui表示第i类的均值向量,SBS_BSBSWS_WSW可以看成是类间和类内的散列矩阵
问题可以简化成
J(w)=wTSBwwTSWw J(w)=\frac{w^TS_Bw}{w^TS_Ww} J(w)=wTSWwwTSBw
我们要最大化J(w)J(w)J(w),对它求偏导。先补充一点矩阵偏导的推导,利用迹trace。如果A是方阵,w是列向量,那么可以有以下表达式,这个如果直接求容易被矩阵绕晕掉:
f(w)=wTAw∂f(w)∂w=wT(AT+A) f(w)=w^TAw\\ \frac{\partial f(w)}{\partial w}=w^T(A^T+A) f(w)=wTAwwf(w)=wT(AT+A)
推导可以利用迹trace,如下:
df(w)=(dw)TAw+wTAdwtr[df(w)]=tr([dw)TAw]T+wTAdw)tr[df(w)]=tr(wTATdw+wTAdw) df(w)=(dw)^TAw+w^TAdw\\ tr[df(w)]=tr([dw)^TAw]^T+w^TAdw)\\ tr[df(w)]=tr(w^TA^Tdw+w^TAdw) df(w)=(dw)TAw+wTAdwtr[df(w)]=tr([dw)TAw]T+wTAdw)tr[df(w)]=tr(wTATdw+wTAdw)
所以最后∂f(w)∂w\frac{\partial f(w)}{\partial w}wf(w)是一个列向量,如果想把它变成行向量再转置一个就好。
有了推导的方法,可以得到
(wTSWw)SBw=(wTSBw)SWw(w^TS_Ww)S_Bw=(w^TS_Bw)S_Ww(wTSWw)SBw=(wTSBw)SWw
(wTSBw)(w^TS_Bw)(wTSBw)(wTSWw)(w^TS_Ww)(wTSWw)是两个数,可以令λ=J(w)\lambda=J(w)λ=J(w),所以可以得到
SW−1SBw=λw S_W^{-1}S_Bw=\lambda w SW1SBw=λw
所以这个问题也变成了求矩阵特征值的解法
最后还有两点需要注意:

  1. 对于二分类,由于SB=(u1−u2)(u1−u2)TS_B=(u_1-u_2)(u_1-u_2)^TSB=(u1u2)(u1u2)T,因此最终投影方向SBwS_BwSBw和均值方向的差(u1−u2)(u_1-u_2)(u1u2)是一样的。因为(u1−u2)Tw(u_1-u_2)^Tw(u1u2)Tw是个数字
  2. 如果只考虑方向,不考虑长度,可以得
    SW−1k(u1−u2)=λwS_W^{-1}k(u_1-u_2)=\lambda w SW1k(u1u2)=λw
    也就是说,可以只算样本的均值和类的方差,就可以快速得到投影方向w

更多内容参考葫芦书

### PCA LDA 在人脸识别中的应用 #### 基本概念技术背景 主成分分析(PCA)是一种用于数据的技术,能够有效地减少高空间中样本之间的冗余度并保留其重要特性。在人脸识别场景下,PCA 可以用来压缩人脸图片的信息量,同时保持足够的区分能力来识别人物的身份[^3]。 线性判别分析(LDA),又称为Fisher 判别分析,旨在找到一种投影方式使得不同类别间的差异最大化而同一类内的变化最小化。这有助于提高分类器对于新输入模式的泛化性能,在人脸识别任务里能增强模型对个体间区别的敏感程度[^1]。 #### 技术原理 当应用于人脸识别时: - **PCA 的作用**:通过对原始图像矩阵执行奇异值分解(SVD),获得一组正交基向量作为新的坐标轴;这些轴代表了原数据集中方差最大的方向。选取前几个具有最大贡献率的方向构成低子空间——即所谓的“特征脸”。每张待测照片都可以表示成这个子空间里的一个点,并据此完成相似度匹配工作。 - **LDA 的功能**:进一步利用已知标签信息指导变换过程,使经过映射后的各类样本尽可能远离彼此中心位置的同时拉近同类成员间的距离。最终得到更有利于监督学习框架下的识别效果提升的新表征形式。 #### 实现方法 以下是采用 Python 编程语言结合 OpenCV 库 scikit-learn 工具包的一个简单例子展示如何运用这两种技术来进行基本的人脸检测与辨认操作: ```python import cv2 from sklearn.decomposition import PCA as RandomizedPCA from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from sklearn.metrics import accuracy_score def load_faces(directory): """加载指定目录下的所有人脸图像""" images = [] labels = [] for label in os.listdir(directory): path = f"{directory}/{label}" if not os.path.isdir(path): continue for filename in glob.glob(f'{path}/*.jpg'): img = cv2.imread(filename, 0) #读取灰度图 flattened_img = img.flatten() / 255. images.append(flattened_img) labels.append(label) le = LabelEncoder() encoded_labels = le.fit_transform(labels) return np.array(images), encoded_labels, le.classes_ faces_dir = 'your_dataset_path_here' X, y, classes = load_faces(faces_dir) pca = RandomizedPCA(n_components=150).fit(X) X_pca = pca.transform(X) lda = LDA().fit(X_pca, y) y_pred = lda.predict(pca.transform(new_face_image)) print('预测结果:',classes[y_pred]) ``` 上述代码片段展示了从准备训练集到构建基于PCA-LDA组合策略的简易版人脸识别流程。需要注意的是这里仅提供了一个非常基础的概念验证版本,在真实世界应用场景中还需要考虑更多因素如光照条件、姿态角度等影响因子处理以及更加复杂的预处理步骤[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值