偏最小二乘法(PLS)的实现方式的很多,在理解优化版的PLS代码之前,有必要理解最原始的PLS思想。网上关于PLS的资料已是浩如烟海,但看完总觉得在理解上差一些,没有比较好的代码可以一步一步跟踪。本文的目的是力求实现一遍最原始的PLS算法NIPALS,推导其中的过程并给出matlab实现。看PLS代码时,总是头痛于代码表述和原理有些出入,我希望自己的代码能将两者统一起来,方便大家理解。

这个PLS虽小,但是算小算法里的集大成者。我们可以看到其中PCA,SVD,CCA,LS等算法的影子。“今晚是首次独家大揭露。为了让大家能够看得清楚,我们一连五晚不断地重复、重复再重复整个的解剖过程,务求让大家能够重复、重复再重复地看个仔细。”


偏最小二乘法原理

对于给定Y,X,采用偏最小二乘法建立其Y,X之间的关系,其实现过程如下

1.将X,Y 标准化,分别得到E,F

2.计算投影轴w,v,使得Conv(E*w,F*v)最大

由于E和F已经标准化,其协方差为

拉格朗日乘子法

对v,w求偏导数

上面两式分别乘以 wT,vT 得到

 带入

同理可以得到

​​​​​​​

由于在奇异分解SVD和PCA那两章我们已经讨论过这种情况,

w 是矩阵最大特征值对应的向量,,因此只需要计算w就足够了。

3 计算个投影得分向量t = E*w ,u =F*v

有些郁闷,t居然不是由w展开,作为E中提取的第一个矩阵形式的成分。显然w并非E的特征向量,它并不能保证由它展开矩阵提取到最多的成分。但是,w和p确实存在一定的关系

再观察一下p的意义

w是F'E最大特征值对应的特征向量, 将自相关协方差矩阵E'E投到w上,确实不好理解。姑且就看看p是怎么求得的吧

p将t粘到E列空间中,希望两者差距越小越好,根据最小二乘法,E将各列分别投影到 t的单位向量上,使得误差最小,各列的投影长度构成了p

4 计算残差

用E*,F*代替 E,F,跳到第2步,继续求t,p,r。一般而言,迭代次数不多于X的秩。PLS有一个根据残差自动停止的算法,这里为了简化程序,暂时不研究,后续再展开

5 建模

可以证明,w和t都两两正交,这里暂时不展开。从上式,我们可以知道,要建立模型,只需要求出t,p,r,其余无关的不需要计算

最终我们要建立X,y的模型,对上式进行整理

求得系数

这里,已经建立了标准化后的F和E的关系,可以通过简单的转换,变成标准化前的参数


代码实战

代码改自参考条目1中的代码,但基本重新实现了一遍

下面,用一个实例去解释这段代码运行过程。

function [beta] = myplsregress1(X,Y,ncomp)
%{Input:X,Y --------输入ncomp-------潜在因子,提取的成分数量output:beta---------模型系数中间变量解释E,F----------X,Y标准后的数据w  ----------E的投影轴t  ----------E的得分p------------E的回归系数r -----------F的回归系数chg----------残差变换矩阵z = chg*w-----用于计算得分t = E*z大写代表矩阵,小写代表向量同时也约定,W代表由w的矩阵
%}
[E,MU_x,SIGMA_x]=zscore(X); [F,MU_y,SIGMA_y] = zscore(Y); %数据标准化,变量记做 E和 F
n=size(X,2);m=size(Y,2); %n 是自变量的个数,m 是因变量的个数
num=size(X,1);%求样本点的个数
chg=eye(n); %残差转换矩阵
for i=1:ncompmatrix=E'*F*F'*E;[U1,S1,V1]=svd(matrix);w=V1(:,1); %提出最大特征值对应的特征向量Z(:,i)=chg*w; %计算zt=E*w; %计算成分 tp=E'*t/(t'*t); r= F'*t/(t'*t); R(:,i) = r;chg=chg*(eye(n)-w*p'); %计算残差矩阵的变换矩阵E=E-t*p';              %可以直接用chg变换阵F = F-t*r';
end
B = Z*R';
%系数变换
for i=1:mb =    MU_y(1,i)-sum(B(:,i)'.*MU_x./SIGMA_x)*SIGMA_y(1,i);coeff = B(:,i)'./SIGMA_x*SIGMA_y(1,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 ,'r');
beta = myplsregress1(NIR,octane,10);
myplsfit= [ones(size(NIR,1),1) NIR]*beta;
plot(myplsfit ,'b');

效果上和matlab自带的plsregress接近,但肯定会有差别,后续的小目标是实现一个和matlab自带plsregress一样的版本,最终还是实现数种简化版本的PLS以及相应过程的推导。

PLS潜在变量构造的几何解释

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

参考:

【建模应用】PLS偏最小二乘回归原理与应用 - pigcv - 博客园

《数学建模算法与引用》

偏最小二乘法(NIPALS经典实现--未简化)相关推荐

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

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

  2. 偏最小二乘法 Partial Least square

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. python偏最小二乘法回归分析_偏最小二乘回归(PLSR)- 2 标准算法(NIPALS)

    1 NIPALS 算法 Step1:对原始数据X和Y进行中心化,得到X0和Y0.从Y0中选择一列作为u1,一般选择方差最大的那一列. 注:这是为了后面计算方便,如计算协方差时,对于标准化后的数据,其样 ...

最新文章

  1. 分布式为什么一定要有高可用的分布式锁?一线大厂必看!
  2. 10分钟精通SharePoint - SharePoint升级
  3. 线索二叉树(c/c++)
  4. ModifyStyle函数的用法
  5. python 就业需求分析_python的就业前景如何?
  6. 监听以太网(三) Packet32数据结构说明
  7. 你可以保持沉默,但你所说的一切都将成为呈堂证供——浅谈Azure WORM保护
  8. python如何在文本内排序_在python中对文本文件中的项进行排序
  9. matlab 中使用 GPU 加速运算
  10. android ExpandableListView
  11. 【渝粤教育】国家开放大学2018年春季 0076-22T工商行政管理法 参考试题
  12. 利用java网络通信技术实现一个迷你QQ
  13. ODAC安装配置与使用详解
  14. 基于matlab的脑瘤mr图像处理_基于电势能改进的区域生长脑肿瘤图像分割
  15. 计算机wap怎么制作表格,如何在电脑上制作简单的表格?
  16. CH552-HID 键盘 鼠标
  17. 前端面试题集锦——JavaScript
  18. C语言经典分油问题,分油问题C语言
  19. 推荐六款必备好用的画图工具
  20. Scala中拆分操作partition、grouped、groupBy和sliding函数

热门文章

  1. Chromium OS并行运行Linux chroot运行Linux
  2. 【Struts】ActionForm
  3. Local-DPP论文阅读笔记
  4. torch.distributed多卡/多GPU/分布式DPP(二)—torch.distributed.all_reduce(reduce_mean)barrier控制进程执行顺序seed随机种子
  5. TFTPD32不能传输数据的解决与尝试
  6. 前端,自定义印章效果
  7. 形态学空间格局分析(MSPA)—ArcGIS结合Guidos软件
  8. Auto病毒,落雪病毒,威金病毒,U盘病毒,魔波病毒,arp病毒,QQ病毒,熊猫烧香病毒,rose病毒清除方法
  9. dreamweaver php网站模板,用DreamWeaver模板工具批量制作网页
  10. HttpClient4 基本操作