作为光谱分析的重要环节,如何从冗余、复杂的变量中选取特征变量直接决定了预测模型的性能,在实际特征选择过程中,通常从两方面考虑特征选择的合理性:一是对目标变量y的解释性,二是不同自变量x间的冗余性,前者是考虑变量自身或变量组合的预测性能,后者考虑变量间的冗余问题,如何在保证对模型性能的同时减少变量冗余对于提高模型精度、降低过拟合风险和提高模型泛化性十分重要。
本周分享连续投影算法(successive projections algorithm,SPA),SPA算法2001年发表在Chemometrics and Intelligent Laboratory Systems期刊上,该算法原理简单,适用性较强,目前还有很多研究应用该方法进行分析。我们首先简单分析一下SPA的分析原理和关键步骤,然后给出代码,最后应用一个实例数据进行分析测试,完整代码及答疑在交流群,不在此展示。
1. SPA算法
SPA是一种前向迭代搜索方法,即从一个波长开始,然后在每次迭代中加入一个新变量,直至所选变量数达到设定值N。SPA的目的是选择光谱信息最少冗余的波长以解决共线性问题,其实现步骤可表示如下:

注意:对于波段数和起始位置的选择问题,可以通过对比不同参数的结果进行分析。
2. 代码分析
function [SelectedW] = SPA(SpecCal,Winitial,totN)% SpecCal 光谱矩阵(行为样品,列为波段)% Winitial 起始波段% totN 选择的波段总数% SelectedW 最终选择的波段[NoSp,Novab] = size(SpecCal);Varibs = 1:Novab;SelectedW = ones(1,totN);Specj = SpecCal;Specn = SpecCal(:,Winitial);SelectedW(1) = Winitial;for n = 1:totN-1 %待确定变量数的循环litW =SelectedW(1:n);Jnotsel = setdiff(Varibs,litW); %确定未映射变量APSpecj = zeros(1,length(Jnotsel));PSpecj = zeros(NoSp,Novab);stP = 1;for j = Jnotsel %未确定变量的循环PSpecj(:,j) = Specj(:,j) - (Specj(:,j)'*Specn)*Specn*(Specn'*Specn)^(-1);APSpecj(stP) = norm(PSpecj(:,j));stP = stP+1;endSelectedW(n+1) = Jnotsel(APSpecj==max(APSpecj));Specn = SpecCal(:,SelectedW(n+1));Specj = PSpecj;endend
3. 实例分析
此处以某油掺假比例预测数据为例,光谱数据为39x256,波长范围为897-2124 nm,选择SNV进行预处理,所得光谱数据为:

图1 原始与SNV光谱
SPA选择的特征变量(前60)分布为:

图2 SPA选择特征分布
分析发现,所选变量主要集中在1780nm左右,而在其他两个峰没有选择特征变量,主要原因是特征选择过程属于无监督过程,仅从自变量分布进行分析,未建立有效的预测模型。基于上述模型所建模型的预测结果为:


图3 SPA-PLS分析结果
实验分析结果表明,SPA-PLS模型的训练集和预测集精度相近,相比于原始数据集(0.96,0.93,LVs=4),SPA能够有效提高模型性能,但是相比于CARS,性能提升有限,主要原因是该方法特征选择过程为无监督过程,选择的变量最大化解释了自变量空间,未建立预测模型,因此变量解释能力有限。
欢迎加入光谱分析交流群或添加个人微信(lyqhcxx060111)。

我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful
对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking
我有这样的HTML代码:Label1Value1Label2Value2...我的代码不起作用。doc.css("first").eachdo|item|label=item.css("dt")value=item.css("dd")end显示所有首先标记,然后标记标签,我需要“标签:值” 最佳答案 首先,您的HTML应该有和中的元素:Label1Value1Label2Value2...但这不会改变您解析它的方式。你想找到s并遍历它们,然后在每个你可以使用next_element得到;像这样:doc=Nokogiri::HTML(