1.偏最小二乘法(NIPALS经典实现--未简化)

2.偏最小二乘法 基本性质推导

3.OLS,PCA,CCA,PLS和CR的关系总结及几何解释

前面两篇文章,实现了PLS最原始的NIPALS算法,并对PLS的基本性质做了一些推导,对PLS总算有一个基本认识。但是,那些只是开胃小菜,最多只能算站在PLS的大门口,还没迈进去。这篇文章对SIMPLS算法进行实现和讨论,达到迈入半只脚的境界。


原始的NIPALS算法可谓啰嗦,反复迭代,对E和F的成分提了又提,完了,还有对系数做一个反标准化,完全不理会别人受得了受不了。当然,NIPALS也有优化版本,比如F的成分提取完全是多余,我们都知道通过投影轴w,我们已经可以推出q,v,r,隐隐中,又许多可以优化的地方。比如说F的成分有必要提取吗?答案是没有必要

以后,再实现优化的NIPALS再做详细讨论。言归正传,目前先对SIMPLS开刀

看了SIMPLS的参考文献,描述的符号总是不同,就是相同,代表的含义已经不同,看了总是有一种精神分裂的感觉。这里按照软件设计的开闭原则,尽量保留之前的所有变量意义不变,看看SIMPLS算法到底搞了什么飞机。

首先,看一下SIMPLS的计算方式,先看看它的非简化版本。

假定E,F已经中心化

SIMPLS的目标函数以及约束

SIMPLE不再直接计算E,F的残差阵,直接计算从协方差矩阵S = E'T里面提取信息。投影轴w,v是正交的,就这一点,是否计算残差E,F是没有意义的,关键是S矩阵必须要调整,否则,无法保证w和v的正交性,提取结果的有效性。那么如何保持正交性呢。先看一下约束,这几项和NIPALS看上去并没什么差别,事实上,对NIPALS而言,这些约束只是它的一个结果,并非前提。w,v正交比较容易理解,先看看要满足最后一项需要具备什么条件。

j>i,也就是说后续的wj对pi正交。对于

从PLS的性质推导里面可以看到,之间并没有必然的正交关系,所以,需要对进行调整

分为正交部分和投影到的部分,,最后只保留(零空间)

被称为投影矩阵,事实上,我们要找与正交的部分

w是S的左奇异矩阵中的向量,w与v的关系是

因此,只要令S按照和P的正交方向分解下去即可,就能保证上述的几点约束。P矩阵对我来说一直有点尴尬,它并不等于W,以至于难以去解释它的几何意义。这里就暂时看成W的一个加强版吧。

从几何意义上来说,这个过程是将S进行空间上的分解,分为与P正交的部分和P上的投影,正交部分作为残差。为什么选择P呢,因为P算是S的特征向量W的近亲,能尽可能多提取到S中的成分,符合PLS的思路。为什么P不能直接用W表示呢,让人看着实在揪心,后续文章再揭晓。步子不能太大,会扯着0.

总结一下SIMPLS原始版本的计算过程,E,F已经经过中心化

上代码

function [beta,W] = myplsregress_simpls1(X,Y,ncomp)
%{Input:X,Y --------输入ncomp-------潜在因子,提取的成分数量output:beta---------模型系数中间变量解释E,F----------X,Y中心化后的数据w  ----------E的投影轴t  ----------E的得分p------------E的回归系数,载荷大写代表矩阵,小写代表向量同时也约定,W代表由w的矩阵
%}
MU_x = mean(X);
MU_y = mean(Y);
%数据标准化,变量记做 E和 F
E = bsxfun(@minus,X,MU_x);
F = bsxfun(@minus,Y,MU_y);
S = E'*F;
Si = S;
n=size(X,2);m=size(Y,2); %n 是自变量的个数,m 是因变量的个数
for i=1:ncomp[U1,S1,V1]=svd(Si);   w=U1(:,1);t = E*w;p = E'*t/(t'*t);W(:,i) = w;T(:,i) = t;P(:,i) = p;Si = S-P*inv(P'*P)*P'*S;
end
B = W*pinv(T)*F;
%系数变换
for i=1:mb =    MU_y(1,i)-sum(B(:,i)'.*MU_x);coeff = B(:,i)';beta(:,i) =[b coeff]';
end
end

测试代码

load spectra
[xl,yl,xs,ys,beta,pctvar,mse] = plsregress(NIR,octane,10);
plot(octane,'g');hold on;
plsfit = [ones(size(NIR,1),1) NIR]*beta;
plot(plsfit,'or');
[beta,W,P,T] = myplsregress_simpls1(NIR,octane,10);
myplsfit= [ones(size(NIR,1),1) NIR]*beta;
plot(myplsfit,'*b');
legend('original','plsregress','myplsregress-simpls1')

跟matlab自带的plsregress算法结果基本重合,这个也很正常,它默认就是用simpls,后续会扒一扒它的simpls实现过程,不过先将SIMPLS算法再进一步完善一下,加入解释比列等等,再跟matlab的simpls对比一下,后面想再讨论一下SIMPLS和NIPALS的差异。另外得吐槽一下,虽然代码写得丑,但我还是说一下,csdn的代码段就不能支持一下matlab的高亮显示,好让我无需鼓足勇气就能把代码传上来。

PS:我用C已经有十多年的时间,自从开始研究数据科学以来,我已经基本放弃C了,当年为了将一个稀疏版的pls从R语言转为C,那代码写了几天,调了一个多星期,从此对C这样的语言痛心疾首。现在也没有必须用到C的工作,所以对于我来说,Life is short, get far away from C。

偏最小二乘法(SIMPLS---未简化)相关推荐

  1. 偏最小二乘法 Partial Least square

    最小二乘法:http://baike.so.com/doc/723226.html 偏最小二乘法(Partial Least square) http://blog.sciencenet.cn/blo ...

  2. 偏最小二乘法中的权值w和载荷p

    先介绍一下奇异值分解,也称为谱分解 A=UΣVTA = U\Sigma V^T A=UΣVT 这里UUU称为左奇异向量,VVV称为右奇异向量,Σ\SigmaΣ为奇异矩阵. 奇异值分解常常用来做低秩逼近 ...

  3. H.264视频质量评价算法(基于偏最小二乘法回归)

    Zhiyuan Shi等人(这是中国人写的,但是我没看见中文论文,厦门大学的)在论文<Research on Quality Assessment Metric Based on H.264/A ...

  4. 回归预测 | MATLAB实现PLS(偏最小二乘法)和PCR(主成分回归)多输入单输出

    回归预测 | MATLAB实现PLS(偏最小二乘法)和PCR(主成分回归)多输入单输出 目录 回归预测 | MATLAB实现PLS(偏最小二乘法)和PCR(主成分回归)多输入单输出 预测效果 基本介绍 ...

  5. Matlab中的偏最小二乘法(PLS)回归模型,离群点检测和变量选择

    全文下载:http://tecdat.cn/?p=22319 本文建立偏最小二乘法(PLS)回归(PLSR)模型,以及预测性能评估.为了建立一个可靠的模型,我们还实现了一些常用的离群点检测和变量选择方 ...

  6. 关系模式最小依赖集怎么求_偏最小二乘法的原理与实现

    偏最小二乘法的原理与实现 近几年来,机器学习在各个领域都有不错的表现,在生物信息领域也有相关的应用.然而,在诸如基因组学.转录组学.蛋白组学以及代谢组学等高通量数据的一大特点是特征量多.样本数少. 以 ...

  7. 【四足机器人支撑腿反作用力规划】未简化的动力学模型规划反作用力 +运动学模型雅可比+虚功原理规划关节扭矩方法

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录 前言 一.基于动力学模型的工作空间控制框图 二.原理推导 三.缺点 前言 ...

  8. 最小二乘模型 matlab程序,我提供给大家一个偏最小二乘法的代码

    下面是一个偏最小二乘法的完整代码,就是结果不尽如人意,望高人指点一二! 实测数据矩阵: X = [ 30 405 1.5 47.5 40 435 3.0 45.0 50 465 1.0 42.5 60 ...

  9. matlab pls rmsecv,偏最小二乘法PLS回归NIPALS算法及Matlab程序及例子.doc

    偏最小二乘法PLS回归NIPALS算法及Matlab程序及例子 偏最小二乘法PLS回归NIPALS算法的Matlab程序及例子 function [T,P,W,Wstar,U,b,C,B_pls,.. ...

  10. PLS回归 (OLS)最小二乘法 PCA) 偏最小二乘法 (PLS) SIMPLS算法 20200723

最新文章

  1. Windows下Node.js开发入门(1)
  2. 为什么我的开发方式如此愚蠢?
  3. 滴滴数据挖掘竞赛题目
  4. 计算机视觉测试数据集 dataset
  5. mysql数据库入门教程(7):库和表的管理
  6. 解决升级 Office 2010 之后 Outlook 提示“无法打开 Microsoft Outlook”
  7. java中套接字,如何在java中获得一个开放的套接字?
  8. Dijkstra迪杰斯特拉算法 C++实现
  9. Thinkphp 配置不用输入index.php
  10. 快速写出matlab的GUI程序
  11. 斐波那契数列(递归和非递归实现)
  12. 端口打流互通功能测试
  13. css手册.chm + W3CSchool.chm下载
  14. 解决出租屋网络故障的步骤及最佳组网方案
  15. Combating Web Spam with TrustRank的实验
  16. 小小的蜗牛有大大的梦想
  17. 9宫格 java_java实现9宫格及九宫格求解的程序.docx
  18. opencv cv2.inpaint()的代码与理论
  19. 用Python 操作 Excel,这篇文章别错过了!(超全总结)
  20. 儒猿秒杀季!微服务限流熔断技术源码剖析与架构设计

热门文章

  1. 批处理当前文件夹下所有文件和子文件夹中的文件
  2. Eviews操作笔记自用(横截面数据)
  3. 窃取ClientKey
  4. 威金病毒完全解决方案篇
  5. 如何设计网页模板才简洁美观?
  6. ThinkPad Z61t系统重装
  7. python list 添加噪声_在python中为信号添加噪声
  8. java 安卓 物联网_面向物联网的Android应用开发与实践
  9. 使用VBA通过Excel生产Word报告
  10. android框架xUtils使用介绍