告别PCA,开始玩高阶的PLS-DA

前言

让我们简单的解读PLS-LDA,涵盖理论基础、数学公式、示例场景,并最终生成一个具有细致解释和可视化功能的可操作Python代码。非理论版本。

基本原理概述

PLS-LDA,或偏最小二乘判别分析,使用PLS的强度进行降维,使用LDA进行分类。通过合并这些技术,PLS-LDA擅长分析变量多于观测值的数据,并提供了一种有效的分类机制,尤其有益于化学计学、生物信息学等领域。

数学推导

目标:

找到一组投影向量,将X变量投影到新的空间,使得这些新的成分与响应变量Y的协方差最大化。

数学表达:

  • 假设有矩阵 X X X属于 R n ∗ p R^{n*p} Rn∗p和向量矩阵 Y Y Y属于 R n R^{n} Rn,其中, n n n是样本数,$p是变量个数。
  • 我们寻找载荷向量 w w w,使得投影后的得分向量 t = X w t=Xw t=Xw与 Y Y Y的协方差最大化: m a x i m i z e c o v ( t , Y ) maximize\ cov(t,Y) maximize cov(t,Y)
  • 通过优化过程,得到一系列的成分 t 1 , t 2 , . . . , t l t_1,t_2,...,t_l t1,t2,...,tl以及他们对应的载荷向量 w 1 , w 2 , . . . , w l w_1,w_2,...,w_l w1,w2,...,wl

基本案例

假设我们有一个数据集,包括三种不同的植物类别(响应变量Y),每种植物的多个测量特征(预测变量X)。我们的目标是构建一个PLS-LDA模型,以准确地分类植物类型。

代码实现

我们将使用Python中的sklearn和pls库来实现PLS-LDA。假设我们的数据集已经准备好并被分为训练集和测试集。

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cross_decomposition import PLSRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder

# 假设数据已加载到X_train, Y_train, X_test, Y_test

# PLS变换
pls = PLSRegression(n_components=2)
X_train_pls = pls.fit_transform(X_train, Y_train)[0]
X_test_pls = pls.transform(X_test)

# 将Y转换为数值
le = LabelEncoder()
Y_train_encoded = le.fit_transform(Y_train)
Y_test_encoded = le.transform(Y_test)

# LDA分类
lda = LinearDiscriminantAnalysis()
lda.fit(X_train_pls, Y_train_encoded)
Y_pred = lda.predict(X_test_pls)

# 计算准确率
accuracy = accuracy_score(Y_test_encoded, Y_pred)
print(f'准确率: {accuracy}')

# 可视化
plt.figure(figsize=(10, 6))
for i, label in enumerate(le.classes_):
    plt.scatter(X_train_pls[Y_train_encoded == i, 0], X_train_pls[Y_train_encoded == i, 1], label=label)
plt.title('PLS-LDA 训练数据分类结果')
plt.xlabel('PLS 成分 1')
plt.ylabel('PLS 成分 2')
plt.legend()
plt.show()

在这段代码中,我们首先用PLS降维,然后利用LDA进行分类。LabelEncoder用于将类别标签转换为易于LDA处理的数值。最终,我们计算了模型在测试集上的准确率,并通过散点图可视化了训练数据在PLS成分空间中的分类结果。

注意,实际应用时需要根据具体数据集调整PLSRegression中的n_components参数,以及进行适当的数据预处理。

基于R语言的PLS-DA实现

这里给出一个R语言的代码示例

传送门

关于用Python和R语言的反思

想简单、基础科研,只做简单应用,你就用R,做科研你想改进、深入了解计算等你就用Python.个人观点,不代表主流。

PLS-LDA的基本思想和算法原理在不同编程语言中是相同的,无论是在Python还是R语言中实现。不过,它们在具体实现、函数调用和库的使用上有所区别。

Python实现

在Python中,我们通常会用sklearn库中的PLSRegression来进行PLS变换,接着可能会使用LinearDiscriminantAnalysis(同样来自sklearn)进行LDA分类。这要求我们分别进行PLS和LDA的步骤,且需要手动处理如标签编码等步骤。

python 复制代码
from sklearn.cross_decomposition import PLSRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# PLS变换
pls = PLSRegression(n_components=2)
X_train_pls = pls.fit_transform(X_train, Y_train)[0]

# LDA分类
lda = LinearDiscriminantAnalysis()
lda.fit(X_train_pls, Y_train_encoded)

R语言实现

在R语言中,plsda函数(通常来源于mixOmics包或其他统计包)直接提供了一个结合了PLS和LDA的方法。这个函数能够直接接受原始数据和响应变量,然后在指定成分数(ncomp)的基础上执行PLS和LDA的结合分析。

python 复制代码
library(mixOmics)
plsda_model <- plsda(X, Y, ncomp = 2)

在R语言的实现中,plsda函数简化了流程,通过一个函数调用即可完成整个PLS-LDA模型的训练。这样做的好处是,用户无需担心PLS变换和LDA分类之间的接口问题,也更不容易出错,特别是在数据预处理和模型参数调整方面。

便利性:R语言的plsda提供了一种更为直接和便捷的方式来执行PLS-LDA,而在Python中,可能需要更多的步骤来分别完成PLS变换和LDA分类。

灵活性:Python实现提供了更多的灵活性,允许用户自定义每一步的处理过程,包括但不限于数据预处理、模型参数调整等。

尽管实现方式不同,但这两种语言中PLS-LDA的核心算法和目标是一致的:通过PLS进行数据降维和特征提取,然后应用LDA进行有效的分类。用户可以根据自己的需求和背景选择最合适的实现方式。

相关推荐
学Linux的语莫1 小时前
机器学习数据处理
java·算法·机器学习
earthzhang20212 小时前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程
2301_803554523 小时前
C++联合体(Union)详解:与结构体的区别、联系与深度解析
java·c++·算法
sali-tec4 小时前
C# 基于halcon的视觉工作流-章42-手动识别文本
开发语言·人工智能·算法·计算机视觉·c#·ocr
SandySY5 小时前
品三国谈人性
算法·架构
小欣加油5 小时前
leetcode 62 不同路径
c++·算法·leetcode·职场和发展
夏鹏今天学习了吗5 小时前
【LeetCode热题100(38/100)】翻转二叉树
算法·leetcode·职场和发展
夏鹏今天学习了吗5 小时前
【LeetCode热题100(36/100)】二叉树的中序遍历
算法·leetcode·职场和发展
DTS小夏5 小时前
算法社Python基础入门面试题库(新手版·含答案)
python·算法·面试
Mr.Ja5 小时前
【LeetCode热题100】No.11——盛最多水的容器
算法·leetcode·贪心算法·盛水最多的容器