MATLAB实现连续投影算法

news/2025/9/18 9:21:52/文章来源:https://www.cnblogs.com/qz85784989/p/19098082

SPA是一种经典的特征变量选择算法,广泛应用于光谱分析(如近红外、红外光谱)中。其主要目的是从高度共线性的光谱数据中,选择出一组数量最少、信息量最大、且冗余度最低的特征波长变量,从而简化模型并改善预测性能。

一、 算法核心思想

SPA通过一系列的投影操作,从一个初始波长开始,迭代地寻找与之前已选波长向量共线性最小的新波长点。

  1. 初始化: 选择一个初始波长(通常是光谱信号强度最大的点,或者随机选择/手动指定)。
  2. 投影操作: 将剩余的未选波长点向量投影到已选波长向量所张成的子空间的正交补空间上。
  3. 选择最大投影点: 在投影后的向量中,选择投影向量模长最大的那个波长点。模长大意味着该点携带的信息与已选点集的信息冗余度最小。
  4. 迭代: 将新选的点加入已选点集,重复步骤2和3,直到选取了预定数量 K 的波长点。

简单理解:就好比你在已有几个观点的前提下,SPA帮你找一个与现有观点最不重复、最能提供新信息的新观点。


二、 讲解

函数定义:selected_variables = spa(X, K, initial_var)

  • 输入
    • X: 输入数据矩阵,大小为 n samples x p variables(例如,n个样本的光谱,每个光谱有p个波长点)。
    • K: 想要选择的变量(波长)数量。
    • initial_var: (可选)指定的初始变量索引。如果未提供或为0,则自动选择信号范数最大的点作为起点。
  • 输出
    • selected_variables: 一个包含最终选择的 K 个变量索引的向量。
function selected_variables = spa(X, K, initial_var)% SPA - 连续投影算法% 输入:%   X - 数据矩阵 (n x p)%   K - 需要选择的变量数%   initial_var - (可选) 初始变量位置,默认为0(自动选择)% 输出:%   selected_variables - 被选中的变量索引向量[n, p] = size(X); % 获取矩阵大小selected_variables = zeros(1, K); % 初始化输出向量% 步骤 1: 数据标准化(中心化),消除基线影响X_c = X - mean(X, 1);% 步骤 2: 选择初始变量if nargin < 3 || initial_var == 0% 计算每个波长点信号的欧几里得范数(强度)norms = sqrt(sum(X_c.^2, 1));[~, initial_index] = max(norms); % 找到范数最大的那个点的索引selected_variables(1) = initial_index;else% 使用用户指定的初始变量selected_variables(1) = initial_var;end% 初始化工作向量和投影矩阵% 从所有变量索引中移除已选的第一个变量candidate_set = 1:p;candidate_set(selected_variables(1)) = [];% 初始化一个投影向量,开始时为初始变量对应的光谱列x = X_c(:, selected_variables(1));iter = 2; % 从第二个变量开始迭代% 步骤 3: 迭代选择剩余的 K-1 个变量while iter <= K% 3.1 从候选集中提取出所有候选变量的光谱数据X_j = X_c(:, candidate_set);% 3.2 核心操作:正交投影% 计算投影算子 P = I - x*(x'x)^-1*x'% 这个算子可以将任何向量投影到x的正交补空间上P = eye(n) - (x * x') / (x' * x);% 将所有的候选变量向量进行投影PX = P * X_j;% 3.3 计算投影后向量的范数(模长)norms_PX = sqrt(sum(PX.^2, 1));% 3.4 选择投影范数最大的那个候选变量的索引[~, max_index] = max(norms_PX);% 3.5 更新选中变量列表和候选集% 注意:max_index 是 candidate_set 中的索引,不是原始索引selected_index = candidate_set(max_index);selected_variables(iter) = selected_index;% 从候选集中移除已选变量candidate_set(max_index) = [];% 3.6 更新投影向量为最新选中的变量向量,用于下一次迭代x = X_c(:, selected_index);iter = iter + 1;end
end

三、如何使用该函数

以下代码演示如何在一个模拟的光谱数据集上使用SPA函数。

% 示例:使用SPA选择特征波长
clear; clc;% 1. 生成模拟光谱数据
nSamples = 100;
nWavelengths = 500;
X = randn(nSamples, nWavelengths); % 随机噪声作为基线% 模拟几个高斯峰作为有效信号
peak_positions = [100, 200, 300, 450]; % 峰的位置
peak_intensity = [5, 8, 3, 6];         % 峰的强度
for i = 1:length(peak_positions)pos = peak_positions(i);intensity = peak_intensity(i);% 在每个峰位置附近添加信号X = X + intensity * exp(-((1:nWavelengths) - pos).^2 / (2*10^2));
end% 2. 应用SPA算法选择10个特征波长
K = 10;
selected_idx = spa(X, K, 0); % 自动选择初始点% 3. 可视化结果
figure;
% 3.1 绘制平均光谱和被SPA选中的波长点
plot(mean(X, 1), 'b-', 'LineWidth', 1.5);
hold on;
plot(selected_idx, mean(X(:, selected_idx), 1), 'ro', 'MarkerFaceColor', 'r', 'MarkerSize', 8);
title('SPA特征波长选择结果');
xlabel('波长点索引');
ylabel('吸光度/强度');
legend('平均光谱', ['SPA选中的', num2str(K), '个特征波长'], 'Location', 'best');
grid on;
hold off;% 4. 输出选中的波长索引
disp('SPA选中的特征波长索引为:');
disp(selected_idx);

参考代码 连续投影算法 www.youwenfan.com/contentcnh/55071.html

代码解释

  1. 生成数据: 创建了一个带有随机噪声和4个模拟高斯峰的光谱数据集。
  2. 调用SPA: 使用上面编写的 spa 函数从500个波长点中选择10个最重要的。
  3. 可视化: 绘制平均光谱图,并在图上用红色圆圈标记出SPA算法选中的波长点。你会发现,这些点很可能就位于我们事先设置的4个高斯峰及其相关区域附近。
  4. 输出结果: 在命令窗口打印出选中波长的索引号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PS辉光眩光特效插件 BBTools Glow Glare 2 V2.4.3 For Photoshop

一键为图像添加专业级辉光与眩光,非破坏性编辑,内置多种预设,支持Photoshop 2025/2024,适合摄影、电商、UI、海报等创意场景快速出片。 核心亮点 非破坏编辑:生成独立图层,原图零损伤,随时二次调整辉光+眩光双…

内外网文件摆渡工具怎么选的实用指南

内容概要 在现代企业运营中,选择合适的内外网文件摆渡工具是确保数据安全流转的关键第一步。本实用指南从实际业务场景出发,帮助您系统性地评估工具的核心性能,包括安全性、传输效率和操作便捷性等基本要素。例如,…

Python 企业级自动语音识别库全解析

Python 企业级自动语音识别库全解析Python 企业级自动语音识别库全解析 一、综合接口库(统一调用多引擎) SpeechRecognition 特点多引擎支持:作为统一接口,整合 Google Web Speech API、CMU Sphinx、Vosk、云服务 …

SAP 文件上传方式导入上、下限

使用场景:有时需要按照上下限查询数据;直接粘贴一次只能粘贴屏幕可见条数,也没办法通过粘贴板上载(只支持单值)。解决办法:通过文件上传 1.txt文件维护方式。 2.点击文件导入。 注意事项:按照上下限查询,查询效…

使用指定jdk打包maven项目

使用指定jdk打包maven项目要使用指定的 JDK 版本打包 Maven 项目,需要确保 Maven 使用目标 JDK 进行编译、测试和打包。以下是具体实现方法: 方法一:通过 Maven 配置文件指定(推荐) 在项目的 pom.xml 中配置 mave…

深入解析:Model Context Protocol (MCP) 安全风险与攻击方式解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

拓展坞相关问题

拓展坞相关问题 1. 耳机没声音打卡 VMWare 虚拟机 腾讯会议语音暂时解决方式:重新插拔耳机

深入解析:第 9 篇:深入浅出学 Java 语言(JDK8 版)—— 吃透泛型机制,筑牢 Java 类型安全防线

深入解析:第 9 篇:深入浅出学 Java 语言(JDK8 版)—— 吃透泛型机制,筑牢 Java 类型安全防线pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

雷电预警系统:降低雷电灾害风险,保障人员安全与设施稳定运行 - 详解

雷电预警系统:降低雷电灾害风险,保障人员安全与设施稳定运行 - 详解2025-09-18 09:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto…

Beyond Compare5中文破解版下载及安装使用教程

Beyond Compare5中文破解版下载及安装使用教程Beyond Compare5中文版是一款功能强大且极其专业的文件数据对比软件,软件支持对比文本内容、文件目录、文本类型等内容,软件可以有效帮助用户对比文件具体差异参数或者同…

鸿蒙应用开发从入门到实战(八):ArkTS自定义组件语法

ArkUI除系统预置的组件外,还支持自定义组件。使用自定义组件,可使代码的结构更加清晰,并且能提高代码的复用性。**大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续…

剑指offer-31、整数中1出现的次数

题⽬描述 求出 1~13 的整数中1出现的次数,并算出 100~1300 的整数中 1 出现的次数?为此他特别数了⼀下 1~13 中包含 1 的数字有 1、10、11、12、13 因此共出现 6 次,但是对于后⾯问题他就没辙了。 ACMer 希望你们帮…

Centos7非LVM根分区容量不足后扩容,对调硬盘挂载/

Centos7非LVM根分区容量不足后扩容,对调硬盘挂载/背景:用户物理机,物理硬盘对应的根分区容量不足,且非LVM无法热扩容。 思路:加一块或者多块硬盘做lvm,暂时挂载到新路径/newroot;拷贝根分区全部内容到/newroot,…

动态黑名单的运作机制与实时防护策略

在数字化浪潮席卷全球的今天,移动应用已成为我们生活与工作的核心载体。然而,繁荣的背后,黑灰产的阴影如影随形。 群控设备批量注册、模拟器多开脚本薅羊毛、自动化程序模拟用户行为进行欺诈引流等等。这些攻击手段…

【译】让性能民主化:Copilot Profiler Agent 在实际代码中的应用

我们很高兴地宣布,Copilot Profiler Agent 已在 Visual Studio 2026 Insider 中推出,它是一款直接内置在 Visual Studio 中的人工智能性能助手。无需再盯着没完没了的调用树或一长串令人费解的数字,疑惑着“我该从哪…

微服务分布式事务解决方案梳理 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

objectarx项目props文件中判断条件的修改

为了实现多版本编译, 修改了配置名称, 在原有的debug和release后面增加了版本号后缀, 修改后需要修改props文件中的内容, 否则助兴表无法正常导入, 造成项目无法正常编译。 原有的类似如下:<ImportGroup Labe…

效率翻倍新技能:JDK8后的新特性

以下是 JDK 8 至 JDK 21 中最具实用性的新特性整理,涵盖语言特性、工具类增强、性能优化等方向,附代码示例和注释说明: 一、JDK 8(2014):函数式编程与现代化API JDK 8 是 Java 发展的里程碑版本,引入了大量颠覆…

实用指南:《URP管线中后处理效果的创新应用与优化实践》

实用指南:《URP管线中后处理效果的创新应用与优化实践》pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…