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

相关推荐
泉崎6 分钟前
11.7比赛总结
数据结构·算法
你好helloworld8 分钟前
滑动窗口最大值
数据结构·算法·leetcode
AI街潜水的八角1 小时前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
白榆maple1 小时前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少1 小时前
数据结构——线性表与链表
数据结构·c++·算法
此生只爱蛋2 小时前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
咕咕吖3 小时前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎3 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
lulu_gh_yu3 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!4 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法