告别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进行有效的分类。用户可以根据自己的需求和背景选择最合适的实现方式。

相关推荐
Mephisto.java17 分钟前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli18 分钟前
滑动窗口->dd爱框框
算法
丶Darling.20 分钟前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52030 分钟前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng199141 分钟前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂1 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知1 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
总裁余(余登武)1 小时前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
Eric.Lee20212 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
huapiaoy2 小时前
Redis中数据类型的使用(hash和list)
redis·算法·哈希算法