PLS-DA分类的实现(基于sklearn)
目录
简单介绍
代码实现
数据集划分
选择因子个数
模型训练并分类
调用函数
简单介绍
(此处取自各处资料)
PLS-DA既可以用来分类,也可以用来降维,与PCA不同的是,PCA是无监督的,PLS-DA是有监督的。与PCA不同,PCA是无监督,PLS是“有监督”模式的偏最小二乘法分析,当样本组间差异大而组内差异小时,无监督分析方法可以很好的区分组间差异。反之样本组间差异不大,无监督的方法就难以区分组间差异。另外如果组间的差异较小,各组的样本量相差较大,样本量大的那组将会主导模型。有监督的分析(PLS-DA)能够很好的解决这些问题。也就是在分析数据时,已知样本的分组关系,这样可以更好的选择区分各组的特征变量,确定样本之间的关系。DA是判别分析,PLS-DA用偏最小二乘回归的方法,在对数据“降维”的同时,建立了回归模型,并对回归结果进行判别分析。
本文主要是基于PLS的分类展开。
代码实现
主要参考了这位大佬的: https://zhuanlan.zhihu.com/p/374412915
数据集划分
首先要把数据集处理成一定的格式,也就是把自变量和因变量搞清楚,做好数据集的分割,然后传回。
def deal_data(path):# 读取自变量和因变量构成的数据矩阵,类别y放最后一列,前面均为xspec = pd.read_excel(path)spec = np.array(spec) # 直接转化为numpy类型x = spec[:, 0:-1] # 前面的列均为自变量y = spec[:,-1]# 先做一个数据集的划分train_X, test_X, train_y, test_y = train_test_split(x, y, test_size=0.2)return train_X, test_X, train_y, test_y
选择因子个数
PLS类似于PCA,是有成分这么一个说法的,不同的成分个数最终得到的效果也不一样,因此我们对于不同的成分个数均进行训练,然后进行交叉验证,观察不同成分个数的表现,从而选择合适的个数。
def accuracy_component(xc, xv, yc, yv, component=8, n_fold=5):# xc表示训练集,xv表示测试集,yc表示训练标签,yv表示测试标签,component表示最多个数,n_fold表示分为几组样本(每次一组作为测试集,交叉验证)k_range = np.linspace(start=1, stop=component, num=component)kf = KFold(n_splits=n_fold, random_state=None, shuffle=True) # n_splits表示要分割为多少个K子集,交叉验证需要accuracy_validation = np.zeros((1, component)) # 用于存储各个成分数的测试平均精准度accuracyaccuracy_train = np.zeros((1, component)) # 用于存储各个成分数的训练平均精准度accuracyfor j in range(component): # j∈[0,component-1],j+1∈[1,component]p = 0acc = 0 # acc表示总的精准度,p表示个数,acc/p平均精确度# 下面是普通训练model_pls = PLSRegression(n_components=j + 1) # 此时选择component个成分yc_labels = pd.get_dummies(yc)model_pls.fit(xc, yc_labels)y_pred = model_pls.predict(xv)y_pred = np.array([np.argmax(i) for i in y_pred])accuracy_train[:, j] = accuracy_score(yv, y_pred) # 这是直接训练的# 下面是交叉验证for train_index, test_index in kf.split(xc): # 进行n_fold轮交叉验证# 划分数据集X_train, X_test = xc[train_index], xc[test_index]y_train, y_test = yc[train_index], yc[test_index]YC_labels = pd.get_dummies(y_train) # 训练数据结果独热编码model_1 = PLSRegression(n_components=j + 1)model_1.fit(X_train, YC_labels)Y_pred = model_1.predict(X_test)Y_pred = np.array([np.argmax(i1) for i1 in Y_pred]) # 独热编码转化成类别变量acc = accuracy_score(y_test, Y_pred) + accp = p + 1accuracy_validation[:, j] = acc / p # 计算j+1个成分的平均精准度# 首先对于每个component数训练一个模型,然后利用测试集得出准确率print('模型训练的准确率')print(accuracy_train)# 然后对样本的训练集进行交叉验证print('交叉验证的平均准确率')print(accuracy_validation)plt.plot(k_range, accuracy_train.T, 'o-', label="Training", color="r")plt.plot(k_range, accuracy_validation.T, 'o-', label="Cross-validation", color="b")plt.xlabel("N components")plt.ylabel("Score")plt.legend(loc="best") # 选取最佳位置标注图注plt.rc('font', family='Times New Roman')plt.rcParams['font.size'] = 10plt.show()return accuracy_validation, accuracy_train
下面是运行效果,因为数据是乱造的所以参数就不用关注了,这样来看的话三到四个因子效果还不错。
模型训练并分类
下面就是选择合适的成分个数进行分类,得到混淆矩阵和一些参数指标。
def PLS_DA(train_X, test_X, train_y, test_y):# 建模model = PLSRegression(n_components=6)train_y = pd.get_dummies(train_y)model.fit(train_X, train_y)# 预测y_pred = model.predict(test_X)# 将预测结果(类别矩阵)转换为数值标签y_pred = np.array([np.argmax(i) for i in y_pred])# 模型评价---混淆矩阵和精度print('测试集混淆矩阵为:\n', confusion_matrix(test_y, y_pred))print('平均分类准确率为:\n', accuracy_score(test_y, y_pred))
运行效果,至少比乱分类的33%正确率要高。
调用函数
以上都是各个组件,最后需要一个主函数调用串联起来,如下, 建议分步调用,也便于问题的发现和处理。
max_component = 8 # 迭代最大成分数
n_fold = 10 # 交叉验证次数
excel_path = './data.xlsx' # 数据集地址
if __name__ == '__main__':train_X, test_X, train_y, test_y = deal_data(excel_path) # 处理数据,返回处理完的训练和测试集,具体情况具体分析# accuracy_component(train_X, test_X, train_y, test_y, max_component, n_fold)PLS_DA(train_X, test_X, train_y, test_y,n_components=3)
相关文章:

PLS-DA分类的实现(基于sklearn)
目录 简单介绍 代码实现 数据集划分 选择因子个数 模型训练并分类 调用函数 简单介绍 (此处取自各处资料) PLS-DA既可以用来分类,也可以用来降维,与PCA不同的是,PCA是无监督的,PLS-DA是有监督的…...

常用hook
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。理解:hook是react提供的函数API官方提供的hook基础hookuseState APIconst [state, setState] useState(initialState); //返回state值 以及更新state的方法 …...

TryHackMe-GoldenEye(boot2root)
GoldenEye 这个房间将是一个有指导的挑战,以破解詹姆斯邦德风格的盒子并获得根。 端口扫描 循例nmap Web枚举 进入80 查看terminal.js 拿去cyberchef解码 拿着这组凭据到/sev-home登录 高清星际大战 POP3枚举 使用刚刚的凭据尝试登录pop3 使用hydra尝试爆破 这…...

Elasticsearch基本安全加上安全的 HTTPS 流量
基本安全加上安全的 HTTPS 流量 在生产环境中,除非您在 HTTP 层启用 TLS,否则某些 Elasticsearch 功能(例如令牌和 API 密钥)将被禁用。这个额外的安全层确保进出集群的所有通信都是安全的。 当您在模式下运行该elasticsearch-ce…...

C语言-程序环境和预处理(2)
文章目录预处理详解1.预定义符号2.#define2.1#define定义的标识符2.2#define定义宏2.3#define替换规则注意事项:2.4#和###的作用##的作用2.5带副作用的宏参数2.6宏和函数的对比宏的优势:宏的劣势:宏和函数的一个对比命名约定3.undef4.条件编译…...

JVM 收集算法 垃圾收集器 元空间 引用
文章目录JVM 收集算法标记-清除算法标记-复制算法标记-整理算法JVM垃圾收集器Serial收集器ParNew收集器Parallel Scavenge /Parallel Old收集器CMS收集器Garbage First(G1)收集器元空间引用强引用软引用弱引用虚引用JVM 收集算法 前面我们了解了整个堆内存实际是以分代收集机制…...

clip精读
开头部分 1. 要点一 从文章题目来看-目的是:使用文本监督得到一个可以迁移的 视觉系统 2.要点二 之前是 fix-ed 的class 有诸多局限性,所以现在用大量不是精细标注的数据来学将更好,利用的语言多样性。——这个方法在 nlp其实广泛的存在&…...

vue 首次加载慢优化
目前使用的是vue2版本 1.路由懒加载(实现按需加载) component: resolve > require([/views/physicalDetail/index], resolve)2.gzip压缩插件(需要运维nginx配合) 第一步,下载compression-webpack-plugin cnpm i c…...
WuThreat身份安全云-TVD每日漏洞情报-2023-03-21
漏洞名称:CairoSVG 文件服务器端请求伪造 漏洞级别:严重 漏洞编号:CVE-2023-27586 相关涉及:CairoSVG 在 2.7.0 版本之前 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-06718 漏洞名称:WP Meta SEO WordPress 授权不当导致任意重定向 漏洞级…...

【Android -- 开发工具】Xshell 6 安装和使用教程
一、简介 Xshell 其实就是一个远程终端工具,它可以将你的个人电脑和你在远端的机器连接起来,通过向 Xshell 输入命令然后他通过网络将命令传送给远端Linux机器然后远端的Linux机器将其运行结果通过网络传回个人电脑。 二、Xshell 6 的安装 首先&#…...

国民技术RTC备份寄存器RTC_BKP
根据手册资料知道RTC_BKP的地址,代码如下 #include "main.h" #include "usart.h"void USART2_Configuration(void) {USART_InitType USART_InitStructure;GPIO_InitType GPIO_InitStructure;GPIO_InitStruct(&GPIO_InitStructure);RCC_Ena…...

resnet网络特征提取过程可视化
我们在训练图片时,是不是要看看具体提取时的每个特征图提取的样子,找了很多,终于功夫不负有心人,找到了,通过修改的代码: resnet代码: import torch import torch.nn as nn from torchvision…...

FPGA打砖块游戏设计(有上板照片)VHDL
这是一款经典打砖块游戏,我们的努力让它更精致更好玩,我们将它取名为打砖块游戏(Flyball),以下是该系统的一些基本功能: 画面简约而经典,色彩绚丽而活泼,动画流畅 玩家顺序挑战3个不同难度的级别,趣味十足 计分功能,卡通字母数字 4条生命值,由生命条显示…...

【Unity入门】3D物体
【Unity入门】3D物体 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)物体移动旋转缩放 (1)物体移动 在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3…...

网络现代化势在必行,VMware 发布软件定义网络 SD-WAN 全新方案
出品 | CSDN云计算 作为计算存储网络基础设施三大件之一,网络一直是 IT 核心技术,并不断向前发展。 数字化转型浪潮下,各行业都在探索创新应用,而数字化创新,也是对 5G 和云边端等网络基础设施提出更高需求,…...
java学习笔记——抽象类
2.1 概述 由来 父类中的方法,被他的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有主体的方法称为抽象方法。java语法规定,包含抽象…...
Redis删除策略
删除策略就是针对已过期数据的处理策略。 针对过期数据要进行删除的时候都有哪些删除策略呢? 1.定时删除2.惰性删除3.定期删除1、立即删除 当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作。 优点:节…...

【新星计划2023】SQL SERVER (01) -- 基础知识
【新星计划2023】SQL SERVER -- 基础知识1. Introduction1.1 Official Website1.2 Conn Tool2. 基础命令2.1 建库建表2.2 Alter2.3 Drop2.3 Big Data -- Postgres3.Awakening1. Introduction 1.1 Official Website 官方文档(小技巧) Officail Website: …...

nginx配置详解
一.nginx常用命令1.Windows(1).查看nginx的版本号nginx -v(2).启动nginxstart nginx(3).快速停止或关闭nginxnginx -s stop(4).正常停止或关闭nginxnginx -s quit(5).配置文件nginx.conf修改重装载命令nginx -s reload2.Linux(1).进入 nginx 目录中cd /usr/local/nginx/sbin(2)…...
关于Java中堆和栈的学习
文章目录1.概述1.1 堆1.2 栈2.堆内存2.1 什么是堆内存?2.2堆内存的特点是什么?2.3new对象在堆中如何分配?3.栈内存3.1什么是栈内存?3.2栈内存的特点3.3栈内存的内存分配机制3.4数据共享4.栈与堆的区别4.1差异4.2相同5. 面试题: java堆和栈的区别**申请方式****申请后系统的…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...
Neo4j 完全指南:从入门到精通
第1章:Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...

OpenHarmony标准系统-HDF框架之I2C驱动开发
文章目录 引言I2C基础知识概念和特性协议,四种信号组合 I2C调试手段硬件软件 HDF框架下的I2C设备驱动案例描述驱动Dispatch驱动读写 总结 引言 I2C基础知识 概念和特性 集成电路总线,由串网12C(1C、12C、Inter-Integrated Circuit BUS)行数据线SDA和串…...