线性判别分析(LDA)

这篇具有很好参考价值的文章主要介绍了线性判别分析(LDA)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线性判别分析(Linear Discriminant Analysis,简称LDA)是一种常用的多元统计分析方法,通常被用于分类和特征提取。它的目的是在给定一组带有标签的数据的情况下,找到一个线性变换,将数据投影到一个低维空间中,使得不同类别的数据点在该低维空间中能够更加容易地区分开来。简而言之,LDA 的目的是将高维数据投影到低维空间中,同时最大化类别之间的差异性,最小化类别内部的差异性。

LDA 的基本思想是,将数据在低维空间中找到一个合适的投影方向,使得类别之间的距离最大化,同时类别内部的距离最小化。为了实现这个目的,LDA 首先需要计算数据的协方差矩阵,然后对协方差矩阵进行特征值分解,得到协方差矩阵的特征向量和特征值。这些特征向量构成了投影矩阵,可以将原始数据映射到新的低维空间中。投影后的数据可以使用简单的分类器(如线性分类器)来进行分类。

LDA 和 PCA(Principal Component Analysis,主成分分析)有相似之处,但它们的目标不同。PCA 的目标是在不降低数据的可区分性的前提下,将数据投影到一个低维空间中,以最大化数据的方差。而 LDA 的目标是最大化类别之间的距离,最小化类别内部的距离,以提高分类的准确性。

总之,LDA 是一种经典的分类算法,具有较好的分类性能和解释性。在实际应用中,LDA 常常被用于面部识别、语音识别、图像分类等领域。

LDA 的数学推导可以分为两个步骤:第一步是计算数据的协方差矩阵,第二步是找到一个合适的投影方向。

首先,假设有 N 个样本,每个样本有 p 个特征,数据矩阵为 X_{N\times p},其中 X_i 表示第 i 个样本的特征向量。假设数据被分为 K个类别,每个类别包含 N_k 个样本,其中 sum_{k=1}^{K}N_k=N。每个类别的均值向量为 mu_k,总体均值向量为 mu。类内散度矩阵为 S_w,类间散度矩阵为 S_b。则有:

lda,机器学习,人工智能

 

其中,C_k 表示第 k个类别。

接下来,我们需要找到一个投影方向 w,将数据矩阵 X 映射到一维空间中。投影后的数据为 y=Xw。我们希望在投影后的一维空间中,不同类别的数据点能够更加容易地区分开来。因此,我们希望在一维空间中最大化类间散度矩阵 S_b,同时最小化类内散度矩阵 S_w。

类间散度矩阵 S_b 在一维空间中的表达式为:

lda,机器学习,人工智能

类内散度矩阵 S_w 在一维空间中的表达式为:

lda,机器学习,人工智能

 

其中,c_i 表示第 i 个样本所属的类别,mu_{c_i} 表示第 i个样本所属类别的均值。y_i 表示第 i个样本在一维空间中的投影。

为了最大化 S_b,我们需要找到一个投影方向 w,使得 w^T(\mu_1-\mu_2)^2w 最大化。这等价于找到一个方向 w,使得 w^TS_bw最大化。

为了最小化 S_w,我们需要找到一个投影方向 w,使得 w^T\sum_{i=1}^{N}(y_i-\mu_{c_i})^2w 最小化。因为 y=Xw,所以有:

lda,机器学习,人工智能

 

因此,我们需要最小化 sum_{i=1}^{N}(y_i-\mu_{c_i})^2,即最小化类内散度矩阵 S_w。

综上所述,我们需要找到一个投影方向 w,使得 w^TS_bw 最大化,w^TS_ww 最小化。这是一个标准的广义瑞利商问题,可以通过求解广义特征值问题来解决。具体来说,我们需要求解下面的广义特征值问题:

lda,机器学习,人工智能

 求解出特征值和特征向量之后,我们可以选择最大的 d 个特征向量,将数据矩阵X映射到 d 维空间中,从而进行分类。

 当我们得到数据矩阵 X和类别向量 y 后,可以使用 Python 中的 sklearn.discriminant_analysis.LinearDiscriminantAnalysis 类来进行线性判别分析。下面是一个简单的例子:

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 创建 LDA 模型对象
lda = LinearDiscriminantAnalysis()

# 使用 LDA 拟合数据
lda.fit(X, y)

# 对新数据进行预测
y_pred = lda.predict(X_new)

其中,X 是形状为 (n_samples, n_features)的数据矩阵,y 是形状为 (n_samples,) 的类别向量,X_new 是形状为 (m, n_features) 的新数据矩阵,y_pred 是形状为 (m,) 的预测结果向量。

在实际使用中,我们可以先将数据集拆分成训练集和测试集,然后使用训练集来拟合 LDA 模型,最后使用测试集来评估模型的分类性能。下面是一个完整的例子:

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.metrics import accuracy_score

# 生成样本数据
X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_classes=2, random_state=42)

# 将数据集拆分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建 LDA 模型对象
lda = LinearDiscriminantAnalysis()

# 使用训练集拟合 LDA 模型
lda.fit(X_train, y_train)

# 对测试集进行预测
y_pred = lda.predict(X_test)

# 计算分类准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

在这个例子中,我们首先使用 make_classification 函数生成一个二分类数据集,然后将数据集拆分成训练集和测试集,使用训练集来拟合 LDA 模型,最后使用测试集来评估模型的分类性能。在这个例子中,我们使用了分类准确率来评估模型的性能。

除了使用 sklearn 库提供的 LinearDiscriminantAnalysis 类之外,我们还可以手动实现线性判别分析算法。下面是一个基于 NumPy 的简单实现:

import numpy as np

class LinearDiscriminantAnalysis:
    def __init__(self, n_components=None):
        self.n_components = n_components
        self.w = None
        
    def fit(self, X, y):
        # 计算类别数量、总均值和类内散度矩阵
        self.classes_ = np.unique(y)
        self.mean_ = np.mean(X, axis=0)
        Sw = np.zeros((X.shape[1], X.shape[1]))
        for c in self.classes_:
            Xc = X[y == c]
            mean_c = np.mean(Xc, axis=0)
            Sw += (Xc - mean_c).T.dot(Xc - mean_c)
        self.Sw_ = Sw
        
        # 计算类间散度矩阵和投影方向
        Sb = np.zeros((X.shape[1], X.shape[1]))
        for c in self.classes_:
            Xc = X[y == c]
            mean_c = np.mean(Xc, axis=0)
            Sb += Xc.shape[0] * (mean_c - self.mean_).reshape(-1, 1).dot((mean_c - self.mean_).reshape(1, -1))
        eigvals, eigvecs = np.linalg.eig(np.linalg.inv(self.Sw_).dot(Sb))
        eigvecs = eigvecs[:, np.argsort(eigvals)[::-1]]
        if self.n_components is not None:
            self.w = eigvecs[:, :self.n_components]
        else:
            self.w = eigvecs
        
    def transform(self, X):
        return X.dot(self.w)
    
    def fit_transform(self, X, y):
        self.fit(X, y)
        return self.transform(X)

在这个实现中,我们首先定义了一个 LinearDiscriminantAnalysis 类,其中 n_components 参数指定了投影的维数,如果不指定,则默认为原始特征的维数。

fit 方法中,我们首先计算了类别数量、总均值和类内散度矩阵 Sw,然后计算了类间散度矩阵 Sb 和投影方向 w。我们使用 numpy.linalg.eig 函数来求解广义特征值问题,然后将特征向量按照特征值从大到小排序,并选择前 n_components 个特征向量作为投影方向。最后,我们将投影方向保存在 w 属性中。

transform 方法中,我们将数据矩阵 X 乘以投影方向 w,得到经过投影后的数据矩阵。在 fit_transform 方法中,我们先调用 fit 方法来拟合模型,然后调用 transform 方法来进行投影。

对于分类问题,我们可以使用投影后的数据进行训练和预测。下面是一个完整的示例,演示了如何使用上面的实现来训练和评估模型:

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 生成样本数据
X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
lda = LinearDiscriminantAnalysis(n_components=1)
X_train_lda = lda.fit_transform(X_train, y_train)

# 预测测试集
X_test_lda = lda.transform(X_test)
y_pred = np.zeros_like(y_test)
for c in lda.classes_:
    y_c = y_train == c
    mu_c = np.mean(X_train_lda[y_c], axis=0)
    sigma_c = np.var(X_train_lda[y_c], axis=0, ddof=1)
    p_c = np.sum(y_c) / len(y_train)
    y_pred += p_c * stats.norm.pdf(X_test_lda, mu_c, np.sqrt(sigma_c))

# 计算准确率
y_pred = np.argmax(y_pred, axis=1)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

在这个示例中,我们首先生成了一个样本数据集,并将其划分为训练集和测试集。然后,我们实例化了一个 LinearDiscriminantAnalysis 类,并使用训练集拟合了模型。接下来,我们将训练集和测试集投影到一维空间,并使用高斯分布来拟合每个类别的投影值分布。最后,我们使用贝叶斯公式来计算每个测试样本属于每个类别的概率,并选择具有最大概率的类别作为预测结果。我们使用 accuracy_score 函数来计算准确率。

可视化代码实现

 

下面我们以鸢尾花数据集为例,来展示如何使用线性判别分析进行分类。

首先,我们从Scikit-learn库中导入鸢尾花数据集,并将其分为训练集和测试集。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

接下来,我们使用LinearDiscriminantAnalysis类来训练线性判别分析模型,并使用训练集对其进行拟合。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

lda = LinearDiscriminantAnalysis()
lda.fit(X_train, y_train)

然后,我们可以使用训练好的模型对测试集进行预测,并计算分类准确率。

from sklearn.metrics import accuracy_score

y_pred = lda.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

最后,我们可以使用Matplotlib库将训练集和测试集在二维平面上可视化,以及绘制决策边界。

import numpy as np
import matplotlib.pyplot as plt

# 将训练集和测试集投影到二维平面
X_train_lda = lda.transform(X_train)
X_test_lda = lda.transform(X_test)

# 绘制训练集和测试集
plt.figure(figsize=(8,6))
for i, target_name in enumerate(iris.target_names):
    plt.scatter(X_train_lda[y_train == i, 0], X_train_lda[y_train == i, 1], label=target_name)
    plt.scatter(X_test_lda[y_test == i, 0], X_test_lda[y_test == i, 1], marker='x', label=target_name)

# 绘制决策边界
x_min, x_max = X_train_lda[:, 0].min() - 1, X_train_lda[:, 0].max() + 1
y_min, y_max = X_train_lda[:, 1].min() - 1, X_train_lda[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))
Z = lda.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, colors='black', alpha=0.5)

plt.xlabel('LD1')
plt.ylabel('LD2')
plt.title('Linear Discriminant Analysis')
plt.legend()
plt.show()

 在这个图中,每个类别用不同的颜色表示。我们可以看到,训练集和测试集在投影后可以明显地分开。决策边界是一个非线性的分割线,它将不同的类别分开。文章来源地址https://www.toymoban.com/news/detail-774235.html

到了这里,关于线性判别分析(LDA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据毕业设计Python+Django旅游景点评论数据采集分析可视化系统 NLP情感分析 LDA主题分析 bayes分类 旅游爬虫 旅游景点评论爬虫 机器学习 深度学习 人工智能 计算机毕业设计

    毕业论文(设计)开题报告 学生姓名 学  号 所在学院 信息工程学院 专  业 指导教师姓名 指导教师职称 工程师 助教 指导教师单位 论文(设计)题目 基于朴素贝叶斯算法旅游景点线上评价情感分析 开  题  报  告  内  容 选题依据及研究内容(国内、外研究现状,初步

    2024年04月17日
    浏览(66)
  • 机器学习---LDA代码

    1. 获取投影坐标        该函数用于获取一个点到一条直线的投影点的坐标。函数中的参数point表示点的坐标,以[a,b] 的形式表示;参数line表示直线的参数,以[k,t]的形式表示,其中k表示直线的斜率,t表示直线的截 距。函数的返回值为投影点的坐标,以[a\\\',b\\\']的形式表示。

    2024年02月11日
    浏览(35)
  • 基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树

    目录 1.算法理论概述 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程        情绪识别是一种重要的情感分析任务,旨在从文本、语音或图像等数据中识别出人的情绪状态,如高兴、悲伤、愤怒等。本文介绍一种基于机器学习的情绪识别算法,

    2024年02月15日
    浏览(228)
  • 机器学习之LDA算法

    目录 LDA算法 LDA目标 LDA原理推导 LDA除法模型 LDA减法模型 LDA除法正则模型 LDA减法正则模型 证明:St=Sw+Sb LDA算法流程 LDA优点 LDA缺点 基于LDA的人脸识别 线性判别分析(linear discriminant analysis,LDA), 是一种经典的线性学习方法,其原理是:给定训练样例集,设法将样例投影到

    2024年02月11日
    浏览(34)
  • 人工智能基础_机器学习001_线性回归_多元线性回归_最优解_基本概念_有监督机器学习_jupyter notebook---人工智能工作笔记0040

       线性和回归,就是自然规律,比如人类是身高趋于某个值的概率最大,回归就是通过数学方法找到事物的规律. 机器学习作用: 该专业实际应用于机器视觉、指纹识别、人脸识别、视网膜识别、虹膜识别、掌纹识别、专家系统、自动规划、智能搜索、定理证明、博弈、自动程序

    2024年02月06日
    浏览(55)
  • 机器学习之基于LDA的人脸识别

    目录 LDA降维 思想 matlab代码 fisherface 思想 matlab代码 人脸识别 思想 matlab代码 首先,代码通过使用 dir 函数获取指定路径下所有以\\\".bmp\\\"结尾的文件,并存储在变量 pictures 中。 然后,定义了一些参数: people 表示人数, personPictureNumber 表示每个人的图像数量, Dimension 表示图像的

    2024年02月11日
    浏览(33)
  • 机器学习之线性判别分析(Linear Discriminant Analysis)

    线性判别分析(Linear Discriminant Analysis,简称LDA)是一种经典的监督学习算法,也称\\\"Fisher 判别分析\\\"。LDA在模式识别领域(比如人脸识别,舰艇识别等图形图像识别领域)中有非常广泛的应用。 LDA的核心思想是给定训练样本集,设法将样例投影到一条直线上。使得同类样例的

    2024年02月15日
    浏览(38)
  • 人工智能基础_机器学习003_有监督机器学习_sklearn中线性方程和正规方程的计算_使用sklearn解算八元一次方程---人工智能工作笔记0042

    然后我们再来看看,如何使用sklearn,来进行正规方程的运算,当然这里 首先要安装sklearn,这里如何安装sklearn就不说了,自己查一下 首先我们还是来计算前面的八元一次方程的解,但是这次我们不用np.linalg.solve这个 解线性方程的方式,也不用 直接 解正规方程的方式: 也就是上面这种

    2024年02月08日
    浏览(55)
  • 【数据挖掘】PCA/LDA/ICA:A成分分析算法比较

            在深入研究和比较算法之前,让我们独立回顾一下它们。请注意,本文的目的不是深入解释每种算法,而是比较它们的目标和结果。 如果您想了解更多关于

    2024年02月15日
    浏览(44)
  • 数据分析的未来:机器学习和人工智能的革命

    数据分析是现代科学和工业的核心技术,它涉及到大量的数据收集、存储、处理和分析。随着数据的增长和复杂性,传统的数据分析方法已经不能满足需求。机器学习和人工智能技术正在革命化数据分析领域,为我们提供了更高效、准确和智能的解决方案。 在本文中,我们将

    2024年02月20日
    浏览(147)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包