Fisher线性判别(LDA)python实现

LDA是一种有监督的分类算法,旨在寻找最优直线以最大化类间距离并最小化类内距离。算法通过计算类均值向量、类内散度矩阵和类间散度矩阵来确定投影方向。LDA不仅用于分类,还可作为特征抽取技术,提高计算效率并减少过拟合。Python实现LDA主要涉及数学运算,理解算法原理后编程相对简单。
摘要由CSDN通过智能技术生成

LDA概述

首先,LDA是一个用于分类的有监督算法。
基本想法非常质朴,不失一般性的以二维平面二分类为例:
对于两类样本点,我们的目的是想找一条直线,将两类样本点映射到这条直线上时,使这两类之间的类间间距最大,类内间距最小。

图形上的直观理解如下。
对于第一张图,不同类映射到同一条直线上时出现混叠区域,难以判别类别。
对于第二张图,不同类映射到同一条直线上时没有混叠,分界鲜明(类间间距最大),且同一类内部样本距离样本中心点较近(类内间距最小)
在这里插入图片描述

推导

不想看的可跳过,毕竟现在都是直接调包(不过建议看下,可以深入理解算法,并且再次体会数学的美妙)

整个算法的推导是一个数学上很优美的过程,详细过程如下。

注意:在模式识别中,所有向量都是m×1形式。

定义类均值向量:
在这里插入图片描述

类内散度矩阵:
在这里插入图片描述
物理意义上理解:就是各样本到自己所属类别中心点的欧式距离平方的和

类间散度矩阵:
在这里插入图片描述
物理意义上理解:就是两类样本中心点的欧式距离的平方

假设我们已经找到最优的那条直线,将其记为向量u’
则新的(y1, y2)可以由下式得到:
在这里插入图片描述
同理,计算出新的SwSb
在这里插入图片描述

则按照LDA最初始的想法,我们想让投影得到的类间距离最大,类内距离最小,我们可以构造下面这个函数:
在这里插入图片描述
即最大化该函数(在特征选择中也称该函数为JF判据,属于基于类内类间距离选择特征的一种判据)

接下来就是常规操作了,求导求极值
在这里插入图片描述

注意其中最后一步中的 α 是代换掉了倒数第二个公式中的最后两项向量的内积(可轻易证明其内积为一常数)且 λ 也为常数(亦可证得)

因为向量的大小不影响方向,所以直线向量可摒弃前面的常系数

所以决策域可表示为
在这里插入图片描述

算法总结

  1. 计算两类的均值向量
  2. 计算总类内散度阵
  3. 计算总类内散度阵的逆
  4. 按照 u 的计算公式求解 u
  5. 计算投影过后的两类的均值向量
  6. 计算分类阈值
  7. 对未知模式 x 判决模式类

可以看出,整个算法就是在进行数学运算,所以LDA是一个数学上非常优美的算法。

应用方向

  • 作为特征抽取的技术
  • 可以提高数据分析过程中的计算效率
  • 对于不适用与正则化的模型,可以降低因维度灾难带来的过拟合

算法实现(python)

因为其数学过于优美,理解其思路后计算机编程实现非常简单

函数实现:

import numpy as np


def LDA(
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Fisher线性判别是一种经典的分类算法,它可以将数据投影到一个低维空间,从而实现分类。在Python,可以使用scikit-learn库来实现Fisher线性判别。具体实现步骤如下: 1. 导入需要的库: ```python from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score ``` 2. 生成数据集: ```python X, y = make_classification(n_samples=100, n_features=10, n_classes=2, random_state=42) ``` 3. 划分训练集和测试集: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=42) ``` 4. 训练模型: ```python lda = LinearDiscriminantAnalysis() lda.fit(X_train, y_train) ``` 5. 预测测试集: ```python y_pred = lda.predict(X_test) ``` 6. 计算准确率: ```python accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) ``` 以上就是Fisher线性判别Python实现步骤。 ### 回答2: Fisher线性判别Fisher Linear Discriminant,简称FLD)又叫做Fisher判别分析(Fishers Discriminant Analysis,简称FDA),是一种常用的分类方法。其主要目的是将p维数据降到k维(k<p),以便于分类。Fisher线性判别最早是由1936年英国统计学家Ronald A. Fisher提出的,其思想是寻找一组投影变换,使得变换后的数据能够更好地区分不同的类别。 在Python实现Fisher线性判别,可以使用Scikit-learn包的LinearDiscriminantAnalysis类。这个类可以用于分类问题,也可以用于降维问题,具体用法如下: 1. 导入相关库: from sklearn.datasets import make_classification from sklearn.discriminant_analysis import LinearDiscriminantAnalysis import matplotlib.pyplot as plt 2. 生成模拟数据: X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=0, n_classes=2, random_state=42) 3. 对数据进行FLD降维: lda = LinearDiscriminantAnalysis(n_components=1) X_lda = lda.fit_transform(X, y) 4. 可视化结果: fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10,5)) ax[0].scatter(X[:, 0], X[:, 1], c=y) ax[0].set_title('Original Data') ax[1].scatter(X_lda[:, 0], [0]*len(X_lda), c=y) ax[1].set_title('LDA Data') plt.show() 在上述代码,首先使用make_classification函数生成一个二分类的模拟数据,然后使用LinearDiscriminantAnalysis类对数据进行FLD降维。最后通过可视化结果对比原始数据和FLD降维后的数据,从而看出降维的效果。 总体来说,Fisher线性判别是一种比较常用的降维方法,它可以帮助我们提高分类的精度,同时也可以减少运算的时间和空间复杂度。在Python实现Fisher线性判别非常方便,只需要导入Scikit-learn包的LinearDiscriminantAnalysis类,并使用该类提供的函数即可实现。 ### 回答3: Fisher线性判别是一种二分类算法,主要用于对数值型数据进行分类。它的目标是找到一个线性投影,将样本点从高维特征空间投射到低维空间,在低维空间进行分类。该算法的核心思想是将样本点投影到一条直线上,使得不同类别的样本点在投影后的结果尽可能分开。具体步骤如下: 1. 将样本集按类别分开,得到两个类别的样本矩阵 X1 和 X2。 2. 分别求出两个类别的样本均值向量。m1 = mean(X1),m2 = mean(X2)。 3. 计算两个类别的散度矩阵 S1 和 S2。S1 = (X1 - m1) * (X1 - m1).T,S2 = (X2 - m2) * (X2 - m2).T。 4. 计算类内散度矩阵 Sw = S1 + S2。 5. 计算投影向量 w,使得类内散度矩阵 Sw 最小,类间散度矩阵 Sb 最大。w = inv(Sw) * (m1 - m2)。 6. 将样本点 X 分别投影到直线 w 上,得到低维空间的样本点 Y = w.T * X。 7. 根据低维空间的 Y 值进行分类。 以下是 Fisher 线性判别Python 代码实现: ```python import numpy as np class Fisher: def __init__(self): self.w = None def fit(self, X, y): # 按类别分离样本 X1 = X[y==0] X2 = X[y==1] # 计算样本均值向量 m1 = np.mean(X1, axis=0) m2 = np.mean(X2, axis=0) # 计算类内散度矩阵 Sw 和类间散度矩阵 Sb Sw = np.cov(X1.T) + np.cov(X2.T) Sb = np.outer(m1 - m2, m1 - m2) # 计算投影向量 w self.w = np.linalg.inv(Sw).dot(m1 - m2) def predict(self, X): # 将样本点投影到直线上 Y = X.dot(self.w.T) # 根据低维空间的值进行分类 return (Y > 0).astype(int) ``` 在这段代码,我们使用了 numpy 库的 cov 函数计算样本协方差矩阵,还使用了 dot 函数计算投影向量和矩阵乘法。通过 fit 函数训练模型,predict 函数进行预测,我们可以很方便地实现 Fisher 线性判别算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值