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

相关推荐
cmpxr_12 分钟前
【C】数组名、函数名的特殊
c语言·算法
KAU的云实验台22 分钟前
【算法精解】AIR期刊算法IAGWO:引入速度概念与逆多元二次权重,可应对高维/工程问题(附Matlab源码)
开发语言·算法·matlab
会编程的土豆29 分钟前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
大熊背1 小时前
如何利用Lv值实现三级降帧
算法·自动曝光·lv·isppipeline
大尚来也2 小时前
驾驭并发:.NET多线程编程的挑战与破局之道
java·前端·算法
向阳而生,一路生花2 小时前
深入浅出 JDK7 HashMap 源码分析
算法·哈希算法
君义_noip2 小时前
信息学奥赛一本通 4150:【GESP2509七级】⾦币收集 | 洛谷 P14078 [GESP202509 七级] 金币收集
c++·算法·gesp·信息学奥赛·csp-s
摸个小yu2 小时前
【力扣LeetCode热题h100】链表、二叉树
算法·leetcode·链表
汀、人工智能2 小时前
[特殊字符] 第93课:太平洋大西洋水流问题
数据结构·算法·数据库架构·图论·bfs·太平洋大西洋水流问题
ZPC82103 小时前
rviz2 仿真控制器与真实机器人切换
人工智能·算法·机器人