机器学习:特征提取之LDA

1. LDA的基本思想

LDA基本思想:给定带有标签的训练样本集,设法将样本投影到一条直线上,使得同类样本的投影点尽可能近,异类样本的投影点尽可能远。如果是进行分类,将新样本投影到同样的这条直线上,根据投影点的位置来确定新样本的类别。
将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性
参考其它作者图
举个例子,上图给出了两种不同的投影方式,直观上来看右图更好。因为右图中蓝色和红色数据较为集中,且类别之间的距离明显,而左图边界处数据混杂。
那么如何用数学语言对“同类样本的投影点尽可能近(组内差异),异类样本的投影点尽可能远(组间差异)”进行表达呢?

2. 二分类LDA原理

接下来从二分类LDA入手,分析LDA原理

在这里插入图片描述
图中红色实心的圆点表示类别为0的样本的均值在直线上的投影位置,红色实心三角形表示的是类别为1的样本的均值在直线上的投影位置
在这里插入图片描述
所以优化目标就可以写成公式4的样子:
J(W)表示LDA投影到直线W上的之后的损失函数,
类内分散度(类内方差,或叫组间方差)矩阵
在这里插入图片描述
优化目标其实就是 组间差异/组内差异 的值越大越好
综上,对于二分类样本,只要求出原始样本的均值和方差就能确定最佳的投影方向w了。

3. 多分类LDA原理

如果是多类向低维投影,则此时投影到的低维空间就不是一条直线,而是一个超平面了。
在这里插入图片描述
LDA降维和PCA降维有很多相似之处:
  (1) 两者在降维时都使用了特征分解的思想 ,PCA主要是从特征的协方差角度,去找到比较好的投影方式。LDA更多的是考虑了标注,即希望投影后不同类别之间数据点的距离更大,同一类别的数据点更紧凑
  (2) 两者都假设数据符合高斯分布,因此LDA和PCA都不适合对非高斯分布的样本进行降维 。下图中红色区域表示一类样本,蓝色区域表示另一类,由于是2类,所以最多投影到1维上。不管在直线上怎么投影,都难使红色点和蓝色点内部凝聚,类间分离。
在这里插入图片描述
  相对于PCA,LDA又有所不同:
  (1) LDA是有监督的降维方法,降维过程中可以使用类别的先验知识经验,而PCA不行
  (2) LDA选择分类性能最好的投影方向,而PCA选择最大方差的投影方向,因此LDA有过拟合的风险
  (3) LDA最多能降到N−1的维数,如果降维维度大于N−1,则不能使用LDA,而PCA没有这个限制 。N-1表示矩阵的秩的最大个数
  (4) 当样本分类信息依赖均值时LDA效果较好;依赖方差的时候PCA效果较好。下图中,样本点依靠方差信息进行分类,而不是均值信息。LDA不能够进行有效分类,因为LDA过度依靠均值信息 在这里插入图片描述

4. 二分类LDA—Python实现

原始数据集的图如下:
在这里插入图片描述

实现分类结果图:
图中的点的横坐标为y值,为了观察方便,我们将各点的纵坐标设为其标签,获得下图
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_classification
from mpl_toolkits.mplot3d import Axes3D
 
def LDA(X, y):
    X1 = np.array([X[i] for i in range(len(X)) if y[i] == 0])
    X2 = np.array([X[i] for i in range(len(X)) if y[i] == 1])
 
    len1 = len(X1)
    len2 = len(X2)
 
    mju1 = np.mean(X1, axis=0)#求中心点
    mju2 = np.mean(X2, axis=0)
 
    cov1 = np.dot((X1 - mju1).T, (X1 - mju1))
    cov2 = np.dot((X2 - mju2).T, (X2 - mju2))
    Sw = cov1 + cov2
    
    w = np.dot(np.mat(Sw).I, (mju1 - mju2).reshape((len(mju1), 1)))  # 计算w
    X1_new = func(X1, w)
    X2_new = func(X2, w)
    y1_new = [1 for i in range(len1)]
    y2_new = [2 for i in range(len2)]
    return X1_new, X2_new, y1_new, y2_new
 
def func(x, w):
    return np.dot((x), w)
 
if '__main__' == __name__:
    X, y = make_classification(n_samples=500, n_features=2, n_redundant=0, n_classes=2,
                               n_informative=1, n_clusters_per_class=1, class_sep=0.5, random_state=10)
 
    X1_new, X2_new, y1_new, y2_new = LDA(X, y)
 
    plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
    plt.show()
 
    plt.plot(X1_new, y1_new, 'b*')
    plt.plot(X2_new, y2_new, 'ro')
    plt.show()

参考文献:1.https://blog.csdn.net/qq_16137569/article/details/82385050
2. https://blog.csdn.net/z962013489/article/details/79871789
3. 特征提取之PCA方法的链接点此

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值