偏最小二乘法算法

合集下载

偏最小二乘方法

偏最小二乘方法
第六章 偏最小二乘方法
偏最小二乘方法(PLS-Partial Least Squares))是近年来发展 起来的一种新的多元统计分析法, 现已成功地应用于分析化学, 如紫外光谱、气相色谱和电分析化学等等。该种方法,在化合 物结构-活性/性质相关性研究中是一种非常有用的手段。如美国 Tripos公司用于化合物三维构效关系研究的CoMFA (Comparative Molecular Field Analysis)方法, 其中,数据统计处 理部分主要是PLS。在PLS方法中用的是替潜变量,其数学基础 是主成分分析。替潜变量的个数一般少于原自变量的个数,所 以PLS特别适用于自变量的个数多于试样个数的情况。在此种 情况下,亦可运用主成分回归方法,但不能够运用一般的多元 回归分析,因为一般多元回归分析要求试样的个数必须多于自 变量的个数。
设矩阵X的阶为I*J,若T的阶与J相等,则主成分回归与 多元线性回归所得结果相同,并不能显示出主成分回归的优 越之处。选取的主成分数一般应该比J 小,而删去那些不重 要的主成分,因为这些主成分所包含的信息主要是噪声,由 此所得的回归方程稳定性较好。 另外,由X所定义的空间可以进一步来说明主成分回归 与多元线性回归的区别。多元线性回归应用了由X的列所定 义的全部空间,而主成分回归所占用的是一子空间。当X的J 列中,有一列可为其它J —1列的线性组合时,则X可用J -1列 的矩阵T来描述,而并不丢失信息。新的矩阵T定义了X的一 个子空间。
2 7 5 4 3 3 Y 9 12 3 6 8 2
运用式(6.3)则可得B矩阵:
0.48 0.71 0.55 B 0.42 0.41 0.24 0.08 0.28 0.05
所用数学模型有效性的量度可用Err:

偏最小二乘回归方法(PLS)

偏最小二乘回归方法(PLS)

偏最小二乘回归方法1 偏最小二乘回归方法(PLS)背景介绍在经济管理、教育学、农业、社会科学、工程技术、医学和生物学中,多元线性回归分析是一种普遍应用的统计分析与预测技术。

多元线性回归中,一般采用最小二乘方法(Ordinary Least Squares :OLS)估计回归系数,以使残差平方和达到最小,但当自变量之间存在多重相关性时,最小二乘估计方法往往失效。

而这种变量之间多重相关性问题在多元线性回归分析中危害非常严重,但又普遍存在。

为消除这种影响,常采用主成分分析(principal Components Analysis :PCA)的方法,但采用主成分分析提取的主成分,虽然能较好地概括自变量系统中的信息,却带进了许多无用的噪声,从而对因变量缺乏解释能力。

最小偏二乘回归方法(Partial Least Squares Regression:PLS)就是应这种实际需要而产生和发展的一种有广泛适用性的多元统计分析方法。

它于1983年由S.Wold和C.Albano等人首次提出并成功地应用在化学领域。

近十年来,偏最小二乘回归方法在理论、方法和应用方面都得到了迅速的发展,己经广泛地应用在许多领域,如生物信息学、机器学习和文本分类等领域。

偏最小二乘回归方法主要的研究焦点是多因变量对多自变量的回归建模,它与普通多元回归方法在思路上的主要区别是它在回归建模过程中采用了信息综合与筛选技术。

它不再是直接考虑因变量集合与自变量集合的回归建模,而是在变量系统中提取若干对系统具有最佳解释能力的新综合变量(又称成分),然后对它们进行回归建模。

偏最小二乘回归可以将建模类型的预测分析方法与非模型式的数据内涵分析方法有机地结合起来,可以同时实现回归建模、数据结构简化(主成分分析)以及两组变量间的相关性分析(典型性关分析),即集多元线性回归分析、典型相关分析和主成分分析的基本功能为一体。

下面将简单地叙述偏最小二乘回归的基本原理。

第十一章 偏最小二乘法

第十一章  偏最小二乘法
t1 X0w1
u1 Y0c1
注意这里t1和u1分别为n维向量,是n个 个案在两组变量的主成分的取值。
2.建立回归方程
分别求X0和Y021 22 w'1X Y0c1 0
则 记
X Y0c1 1w1 0 0 Y0 X0w1 1c1 0
可得
X Y0Y0 X0w1 w1 0
2 1
Y 0 X0 X 0Y0c1 c
' '
2 1 1
可见,w1是矩阵的 X0Y0Y0X0 特征向量,对应 12 。所以w1是对应于矩阵 X0Y0Y0X0 的特征值为 12 的单位特征向量。而另一方面, 最大特征值 ' ' 12 的 c1是对应于 Y 0 X0 X 0Y0 矩阵最大特征值 单位特征向量c1。
求X组变量的第一主成分t1,w1为第一主成分 的系数向量, w1是一个单位向量。 t1=X0w1 求Y组变量的第一主成分t1,c1为第一主成分 的系数向量, c1是一个单位向量。 u1=Y0c1 有Var(t1)=max Var(u1)=max (t1, u1)=max
因此综合起来,在偏最小二乘回归中, 我们要求与的协方差达到最大,既
一、 偏最小二乘回归的建模原理和方法 (一)建模原理
设有 q个因变量{ y1, y2,…, yq}和p个自变量 { x1, x2,…, xp}。为了讨论两组变量之间的关系, 观测了n个样本点。偏最小二乘回归开始与典型 相关分析相同,分别在X与Y中提取出主成分。 设 { t1, t2,…, tr}为{ x1, x2,…, xp}的主成分, { u1, u2,…, ur}为{ y1, y2,…, yq},其中r=min(p,q)。
max X0 w1 , Y0c1 w1 ,c1 w1w1 1 cc 1 11

判别偏最小二乘法

判别偏最小二乘法

判别偏最小二乘法
判别偏最小二乘法是一种常见的分类算法,它是基于最小二乘法的思路而来的。

在分类问题中,我们常常面临的是需要将样本点分为不同的类别,而分类算法的目的就是找到一种合理的方式来实现这一目标。

在判别偏最小二乘法中,我们首先需要将样本点投影到一个低维的子空间中,然后对投影后的样本进行分类。

具体来说,我们可以通过对样本点进行线性变换,将样本点投影到一个低维的子空间中。

然后,在子空间中,我们可以使用最小二乘法来拟合每个类别的数据分布,以此来得到分类决策。

判别偏最小二乘法不仅可以用于二分类问题,还可以扩展到多分类问题中。

同时,它也可以与其他分类算法相结合,用于提高分类的准确率和鲁棒性。

因此,判别偏最小二乘法是机器学习中一个非常重要的算法,值得我们深入学习和研究。

- 1 -。

偏最小二乘法(PLS)简介

偏最小二乘法(PLS)简介

偏最小二乘法(PLS)简介偏最小二乘法(PLS)简介简介偏最小二乘法是一种新型的多元统计数据分析方法,它于1983年由伍德(S.Wold)和阿巴诺(C.Albano)等人首次提出。

近几十年来,它在理论、方法和应用方面都得到了迅速的发展。

偏最小二乘法长期以来,模型式的方法和认识性的方法之间的界限分得十分清楚。

而偏最小二乘法则把它们有机的结合起来了,在一个算法下,可以同时实现回归建模(多元线性回归)、数据结构简化(主成分分析)以及两组变量之间的相关性分析(典型相关分析)。

这是多元统计数据分析中的一个飞跃。

偏最小二乘法在统计应用中的重要性体现在以下几个方面:偏最小二乘法是一种多因变量对多自变量的回归建模方法。

偏最小二乘法可以较好的解决许多以往用普通多元回归无法解决的问题。

偏最小二乘法之所以被称为第二代回归方法,还由于它可以实现多种数据分析方法的综合应用。

主成分回归的主要目的是要提取隐藏在矩阵X中的相关信息,然后用于预测变量Y的值。

这种做法可以保证让我们只使用那些独立变量,噪音将被消除,从而达到改善预测模型质量的目的。

但是,主成分回归仍然有一定的缺陷,当一些有用变量的相关性很小时,我们在选取主成分时就很容易把它们漏掉,使得最终的预测模型可靠性下降,如果我们对每一个成分进行挑选,那样又太困难了。

偏最小二乘回归可以解决这个问题。

它采用对变量X和Y都进行分解的方法,从变量X和Y中同时提取成分(通常称为因子),再将因子按照它们之间的相关性从大到小排列。

现在,我们要建立一个模型,我们只要决定选择几个因子参与建模就可以了基本概念偏最小二乘回归是对多元线性回归模型的一种扩展,在其最简单的形式中,只用一个线性模型来描述独立变量Y与预测变量组X之间的关系:Y = b0 + b1X1 + b2X2 + ... + bpXp在方程中,b0是截距,bi的值是数据点1到p的回归系数。

例如,我们可以认为人的体重是他的身高、性别的函数,并且从各自的样本点中估计出回归系数,之后,我们从测得的身高及性别中可以预测出某人的大致体重。

偏最小二乘法算法

偏最小二乘法算法

偏最小二乘法1.1基本原理偏最小二乘法(PLS)是基于因子分析的多变量校正方法,其数学基础为主成分分析。

但它相对于主成分回归(PCR)更进了一步,两者的区别在于PLS法将浓度矩阵Y和相应的量测响应矩阵X同时进行主成分分解:X二 TP+EY=UQ+F式中T和U分别为X和Y的得分矩阵,而P和Q分别为X和Y的载荷矩阵,E和F分别为运用偏最小二乘法去拟合矩阵X和Y时所引进的误差。

偏最小二乘法和主成分回归很相似,其差别在于用于描述变量Y中因子的同时也用于描述变量X。

为了实现这一点,数学中是以矩阵Y的列去计算矩阵X的因子。

同时,矩阵Y的因子则由矩阵X 的列去预测。

分解得到的T和U矩阵分别是除去了人部分测量误差的响应和浓度的信息。

偏最小二乘法就是利用各列向量相互正交的特征响应矩阵T和特征浓度矩阵U进行回归:U=TB得到回归系数矩阵,又称矢联矩阵E:B=(TT )F U因此,偏最小二乘法的校正步骤包括对矩阵Y和矩阵X的主成分分解以及对矢联矩阵B的计算。

12主成分分析主成分分析的中心目的是将数据降维,以排除众多化学信息共存中相互重叠的信息。

他是将原变量进行转换,即把原变量的线性组合成几个新变量。

同时这些新变量要尽可能多的表征原变量的数据结构特征而不丢失信息。

新变量是一组正交的,即互不相矢的变量。

这种新变量又称为主成分。

如何寻找主成分,在数学上讲,求数据矩阵的主成分就是求解该矩阵的特征值和特征矢量问题。

卞面以多组分混合物的量测光谱来加以说明。

假设有n个样本包含p个组分,在m个波长下测定其光谱数据,根据比尔定律和加和定理有:如果混合物只有一种组分,则该光谱矢量与纯光谱矢量应该是方向一致,而人小不同。

换句话说,光谱A表示在由p个波长构成的p维变量空间的一组点(n个),而这一组点一定在一条通过坐标原点的直线上。

这条直线其实就是纯光谱b。

因此由ni个波长描述的原始数据可以用一条直线,即一个新坐标或新变量来表示。

如果一个混合物由2个组分组成,各组分的纯光谱用bl,b2 表示,则有:<=c i{b: + Ci2bl有上式看出,不管混合物如何变化,其光谱总可以用两个新坐标轴bl,b2来表示。

偏最小二乘法基本知识

偏最小二乘法基本知识

偏最小二乘法(PLS)简介-数理统计偏最小二乘法partial least square method是一种新型的多元统计数据分析方法,它于1983年由伍德(S.Wold)和阿巴诺(C.Albano)等人首次提出。

近几十年来,它在理论、方法和应用方面都得到了迅速的发展。

偏最小二乘法长期以来,模型式的方法和认识性的方法之间的界限分得十分清楚。

而偏最小二乘法则把它们有机的结合起来了,在一个算法下,可以同时实现回归建模(多元线性回归)、数据结构简化(主成分分析)以及两组变量之间的相关性分析(典型相关分析)。

这是多元统计数据分析中的一个飞跃。

偏最小二乘法在统计应用中的重要性体现在以下几个方面:偏最小二乘法是一种多因变量对多自变量的回归建模方法。

偏最小二乘法可以较好的解决许多以往用普通多元回归无法解决的问题。

偏最小二乘法之所以被称为第二代回归方法,还由于它可以实现多种数据分析方法的综合应用。

主成分回归的主要目的是要提取隐藏在矩阵X中的相关信息,然后用于预测变量Y的值。

这种做法可以保证让我们只使用那些独立变量,噪音将被消除,从而达到改善预测模型质量的目的。

但是,主成分回归仍然有一定的缺陷,当一些有用变量的相关性很小时,我们在选取主成分时就很容易把它们漏掉,使得最终的预测模型可靠性下降,如果我们对每一个成分进行挑选,那样又太困难了。

偏最小二乘回归可以解决这个问题。

它采用对变量X和Y都进行分解的方法,从变量X和Y 中同时提取成分(通常称为因子),再将因子按照它们之间的相关性从大到小排列。

现在,我们要建立一个模型,我们只要决定选择几个因子参与建模就可以了基本概念偏最小二乘回归是对多元线性回归模型的一种扩展,在其最简单的形式中,只用一个线性模型来描述独立变量Y与预测变量组X之间的关系:Y= b0 + b1X1 + b2X2 + ... + bpXp在方程中,b0是截距,bi的值是数据点1到p的回归系数。

例如,我们可以认为人的体重是他的身高、性别的函数,并且从各自的样本点中估计出回归系数,之后,我们从测得的身高及性别中可以预测出某人的大致体重。

偏最小二乘法PLS和PLS回归的介绍及其实现方法

偏最小二乘法PLS和PLS回归的介绍及其实现方法

偏最小二乘法PLS和PLS回归的介绍及其实现方法偏最小二乘法(Partial Least Squares,简称PLS)是一种多元统计学方法,常用于建立回归模型和处理多重共线性问题。

它是对线性回归和主成分分析(PCA)的扩展,可以在高维数据集中处理变量之间的关联性,提取重要特征并建立回归模型。

PLS回归可以分为两个主要步骤:PLS分解和回归。

1.PLS分解:PLS分解是将原始的预测变量X和响应变量Y分解为一系列的主成分。

在每个主成分中,PLS根据两者之间的协方差最大化方向来寻找最佳线性组合。

PLS根据以下步骤来获得主成分:1)建立初始权重向量w,通常是随机初始化的;2) 计算X和Y之间的协方差cov(X,Y);3)将w与X与Y的乘积进行中心化,得到新的X'和Y';4)标准化X'和Y',使得它们的标准差为1;5)多次迭代上述步骤,直到达到设定的主成分数目。

2.回归:在PLS分解之后,我们得到了一组主成分,接下来可以使用这些主成分来建立回归模型。

回归模型可以通过以下步骤来构建:1)将X和Y分别表示为主成分的线性组合;2)根据主成分得分对回归系数进行估计;3)使用估计的回归系数将新的X预测为Y。

PLS的实现可以通过以下几种方法:1.标准PLS(NIPALS算法):它是最常见的PLS算法。

它通过递归地估计每个主成分和权重向量来实现PLS分解。

该算法根据数据的方差最大化原则得到主成分。

2.中心化PLS:数据在进行PLS分解之前进行中心化。

中心化可以确保主成分能够捕捉到变量之间的相关性。

3. PLS-DA:PLS-Discriminant Analysis,是PLS在分类问题中的应用。

它通过利用PLS分解找到最佳线性组合,以区分两个或多个不同的分类。

4. PLS-SVC:PLS-Support Vector Classification,是PLS在支持向量机分类中的应用。

它通过PLS寻找最优线性组合,同时最小化分类误差。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

偏最小二乘法 1.1 基本原理偏最小二乘法(PLS )是基于因子分析的多变量校正方法,其数学基础为主成分分析。

但它相对于主成分回归(PCR )更进了一步,两者的区别在于PLS 法将浓度矩阵Y 和相应的量测响应矩阵X 同时进行主成分分解:X=TP+E Y=UQ+F式中T 和U 分别为X 和Y 的得分矩阵,而P 和Q 分别为X 和Y 的载荷矩阵,E 和F 分别为运用偏最小二乘法去拟合矩阵X 和Y 时所引进的误差。

偏最小二乘法和主成分回归很相似,其差别在于用于描述变量Y 中因子的同时也用于描述变量X 。

为了实现这一点,数学中是以矩阵Y 的列去计算矩阵X 的因子。

同时,矩阵Y 的因子则由矩阵X 的列去预测。

分解得到的T 和U 矩阵分别是除去了大部分测量误差的响应和浓度的信息。

偏最小二乘法就是利用各列向量相互正交的特征响应矩阵T 和特征浓度矩阵U 进行回归:U=TB得到回归系数矩阵,又称关联矩阵B :B=(T T T -1)T T U因此,偏最小二乘法的校正步骤包括对矩阵Y 和矩阵X 的主成分分解以及对关联矩阵B 的计算。

1.2主成分分析主成分分析的中心目的是将数据降维,以排除众多化学信息共存中相互重叠的信息。

他是将原变量进行转换,即把原变量的线性组合成几个新变量。

同时这些新变量要尽可能多的表征原变量的数据结构特征而不丢失信息。

新变量是一组正交的,即互不相关的变量。

这种新变量又称为主成分。

如何寻找主成分,在数学上讲,求数据矩阵的主成分就是求解该矩阵的特征值和特征矢量问题。

下面以多组分混合物的量测光谱来加以说明。

假设有n 个样本包含p 个组分,在m 个波长下测定其光谱数据,根据比尔定律和加和定理有:A n×m =C n×pB p×m如果混合物只有一种组分,则该光谱矢量与纯光谱矢量应该是方向一致,而大小不同。

换句话说,光谱A 表示在由p 个波长构成的p 维变量空间的一组点(n 个),而这一组点一定在一条通过坐标原点的直线上。

这条直线其实就是纯光谱b 。

因此由m 个波长描述的原始数据可以用一条直线,即一个新坐标或新变量来表示。

如果一个混合物由2个组分组成,各组分的纯光谱用b1,b2表示,则有:1122T T Ti i i a c b c b =+有上式看出,不管混合物如何变化,其光谱总可以用两个新坐标轴b1,b2来表示。

因此可以推出,如果混合物由p 个组分组成,那么混合物的光谱就可由p 个主成分轴的线性组合表示。

因而现在的问题就变成了如何求解这些主成分轴。

而寻找这些坐标轴的基本原则是使新坐标轴包含原数据的最大方差。

即沿着新坐标轴的方向,使方差达到最大。

而其他方向,使方差达到最小。

从几何角度看,就是变量空间中所有的点到这个新坐标轴的距离最短。

以二维空间的为例说明如何寻找主成分坐标轴。

变量空间的每一个数据点(一个样本)都可以用通过该点与坐标原点的一个矢量x i 表征。

x2x1上图中直角三角形的三个边长分别以a,b,c 表示,那么这n 个点到第一个主成分轴v 1距离的平方和可以通过勾股定理与矢量点积得出:22211()n ni i i i i b c a ===-∑∑因为2||||i i c x =与 11||||||||cos T i i x v x v θ=⋅⋅,所以222111(||||())n nT iii i i b x x v ===-∑∑22111||||()nnT i i i i x x v ===-∑∑21111||||()()nnTT i i i i i x v x x v ===-∑∑2111||||nT T i i x v X Xv ==-∑ min 上式等价于11TT v X Xv max (最大特征值λ)上式中v 1表示第一个主成分轴矢量,即第一个特征矢量,所对应的最大值称为特征值,用λ1表示。

从上面推导看出,寻找主成分轴就是求X 矩阵的协方差矩阵X T X 中的最大特征值(λi )和特征向量(v i )。

下面考虑变量数为m 的一般情况。

在m 为空间中新变量可以表示为:11111221221122221122i i i m im i i i m im im m i m i mm imu v x v x v x u v x v x v x u v x v x v x =+++=+++=+++其中系数矩阵V 为V =1112121221112m m m mmv v v v v v v v v ⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦用u 和x 分别表示新变量和原始矢量,则12i i im u u u u ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦,12i i im x x x x ⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦u V x =⋅上述m 维主成分系数必须满足下面两个条件(1) 正交条件:任意两个主成分u k 、u r ,其系数的乘积之和为0。

11220k r k r km rm v v v v v v +++=(2)归一化条件:对于任一主成分系数的平方和等于1。

222121k k km v v v +++=满足这两个条件的矩阵,称之为正交矩阵。

正交矩阵具有如下性质:1,T T V V I V V -==1.3 矩阵的主成分分解根据特征向量和特征值的定义,1,2,,T T i i i v X Xv i m λ== (*)同时令X 的协方差矩阵为T Z X X =(*)式两边同时左乘v i ,有,1,2,,i i i Zv v i m λ==主成分系数矩阵V 也可写为12(,,,)m V v v v =因此可得{}i ZV V diag λ=⋅其中{}i diag λ表示一个对角矩阵,即对角线元素为i λ,非对角线元素为0的矩阵。

上式两边同时左乘V T ,得{}T i V ZV diag λ=(){}T T T T i V ZV V X XV XV XV diag λ===令T XV =,则上式变为{}T i T T diag λ=将式T XV =右乘1V -得T X TV =上式是矩阵X 的主成分分解的一种表达式,由上式得求解T 和V 的方法1()T T T V T T T X -= 1()T T XV V V -=依据矩阵乘法规则即可获得矩阵V 和T 中每一个矢量的计算公式:/,/T T T Tj j j j j j v t X t t t Xv v t ==根据上面两个公式可以设计主成分分解的迭代法算法如下:(1) 取X 中任意一列作为起始的t 。

(2) 由此t 计算:/TTTv t X t t =(3) 将v T 归一化:/T T Tnew old oldv v v = (4) 计算新的t :/Tt Xv v v =(5) 比较步骤4所得的t 和上一步的t 。

若二者相等(在给定的误差范围内),则按(Tt t λ=)计算特征值,转第六步继续进行;否则返回第二步继续迭代。

(6) 从Y 中减去Tt v ⋅的贡献:TX X t v =-⋅。

返回1,继续运行,直到最后Y 趋近于零。

从理论上讲,在m 空间中,可以获得m 个主成分。

但是在实际应用中一般只取前几个对方差贡献最大的主成分,这样就使高维空间的数据降到低维,如二维或三维空间,非常有益于数据的观察,同时损失的信息量还不会太大。

取前p 个主成分的依据为比率(%)11/p miii i λλ===∑∑一般推荐,比率(%)≥80% 1.4偏最小二乘法算法(1) 矩阵X 和Y 的标准化处理(2) 取Y 中任意一列赋给作为起始的u 对于X 矩阵 (3) w T =u T X/u T u(4) 归一化:/||||T T Tnew old old w w w =(5) 计算新的t :t=Xw/w T w 对于Y 矩阵 (6) q T =t T Y/t T t(7) 归一化:/||||T T Tnew old old q q q =(8) u=Yq/q T q 收敛判据:(9) 将步骤8所得的u 与前一次迭代的结果相比较,若等于(在允许误差范围内),到步骤10,否则返回3。

(10) p T =t T X/t T t(11) 归一化:/||||T T Tnew old old p p p =(12) t new = t old ·|| p old ||(13) /||||T T Tnew old old w w p =计算回归系数b 以用于内部关联: (14) b=u T t/t T t 对于主成分h 计算残差: (15) 1Th h h h E E t p -=-(16) 1Th h h h h F E b t wq -=-之后回到步骤(2),去进行下一主成分的运算,直到残差趋近于零。

未知样品预测(17) 如校正部分,将X 矩阵标准化 (18) h=0,y=0(19) h=h+1,T h h t XW =,T h h h y y b t wq =+,Th h x x t p =-(20) 若h>a(主成分数),到步骤(21)。

否则返回步骤(19)(21) 得到的Y 已经标准化,因此需要按标准化步骤的相反操作,将之复原到原坐标注意的是对预测集进行标准化处理的时,使用的是训练集的均值和标准偏差。

因此,在进行反标准化操作时,使用的也应该是训练集的均值和标准偏差。

1.5 程序框图与程序代码程序框图:用C语言编制的PLS程序源代码:C语言的源程序的各函数和功能如下:data_input(); /*数据的输入*/data_standardization (); /*数据的标准化*/pctest() /*在主成分分解时判断t 的收敛*/ principalcomponent(); /*主成分分解*/factornum(); /*确定必要的主成分分数*/ normaleq(); /*正规方程的建立*/test(int k) /*迭代求解系数矩阵的收敛检验*/ iteration(); /*迭代法求解*/predict(); /*未知样品预测*/bias(); /*计算预测标准偏差*/report(); /*输出结果*/main(argc,argv) /*主函数*/PLS程序源代码#include<stidio.h>#include<math.h>#include<io.h>#include<stdlib.h>#define N 25#define M 11#define L 4#define TN 8#define H 5FILE *infp,*outfp;double train_x[N][M], train_y[N][L];double test_x[TN][M], test_y[TN][L];double avg_x[M],std_x[M];double avg_y[L],std_ y[L];double error_value[TN][L]double u[N],new_u[N];doublesave_p[H][N],save_q[H][L],save_w[H][M],save_d[H];double predictvalue[TN][L],bias[L];void data_input() /*数据的输入*/{ int i,j;for(j=0;j<M;j++)for(i=0;i<N;i++)fscanf(infp,“%lf”,&train_x[i][j]);for(i=0;i<N;i++)for(j=0;j<L;j++)fscanf(infp,“%lf”,&train_y[i][j]);for(j=0;j<M;j++)for(j=0;j<L;j++)new_u[i]+=train_y[i][j]*q[j];new_u[i]/=sq;}mask=pctest();}while(mask);for(j=0;j<L;j++)save_q[ih][j]=q[j];for(st=0,i=0;i<N;i++)st+=t[i]*t[i];for(j=0;j<M;j++){p[j]=0.0;for(i=0;i<N;i++)p[j]+=t[i]*train_x[i][j];p[j]/=st;}for(sp=0,j=0;j<M;j++)sp+=p[j]* p[j];sp=sqrt(sp);for(j=0;j<M;j++){ p[j]/=sp;save_p[ih][j]=p[j];}for(i=0;i<N;i++)t[i]*=sp;for(i=0;i<M;i++){ w[i]*=sp;save_w[ih][i]=w[i];for(i=0;i<TN;i++)fscanf(infp,“%lf”,&test_x[i][j]);for(i=0;i<TN;i++)for(j=0;j<L;j++)fscanf(infp,“%lf”,&test_y[i][j]);fclose(infp);}void data_standardization () /*数据的标准化*/{int i,j;for(j=0;j<M;j++){ avg_x[j]=std_x[j]=0.0;for(i=0;i<N;i++)avg_x[j]+=train_x[i][j];avg_x[j]/=N;for(i=0;i<N;i++)std_x[j]+=pow((train_x[i][j]-avg_x[j]),2); std_x[j]=sqrt(std_x[j])/(N-1);}for(i=0;i<N;i++)for(j=0;j<M;j++)train_x[i][j]= (train_x[i][j]-avg_x[j])/std_x[j]; for(i=0;i<TN;i++)for(j=0;j<M;j++)train_x[i][j]= (train_x[i][j]-avg_x[j])/std_x[j]; for(j=0;j<L;j++){ avg_y[j]=std_y[j]=0.0;for(i=0;i<N;i++)avg_y[j]+=train_y[i][j];avg_y[j]/=N;for(i=0;i<N;i++)std_y[j]+=pow((train_y[i][j]-avg_y[j]),2); std_y[j]=sqrt(std_y[j])/(N-1);}for(i=0;i<N;i++)for(j=0;j<L;j++)train_y[i][j]= (train_y[i][j]-avg_y[j])/std_y[j]; }pctest() /*检验收敛*/{ int i,j;double count=0.0;for(i=0;i<N;i++){ count+=pow((new_u[i]-u[i]),2);}for(st=0,i=0;i<N;i++)st+=t[i]*t[i];for(b=0,i=0;i<N;i++)b+=new_u[i]*t[i];b/=st;save_d[ih]=b;for(i=0;i<N;i++)for(j=0;j<M;j++)train_x[i][j]-=t[i]*p[j];for(i=0;i<N;i++)for(j=0;j<L;j++)train_y[i][j]-=b*t[i]*q[j];ih++;}while(ih<H);}predict() /*计算校正集的浓度*/ {int i,j,k;double pt[TN]for(i=0;i<TN;i++)for(j=0;j<L;j++)predictvalue[i][j]=0.0;for(k=0;k<H;k++){ for(i=0;i<TN;i++){ pt[i]=0.0;for(j=0;j<M;j++)pt[i]+=test_x[i][j]*save_w[k][j];}for(i=0;i<TN;i++)for(j=0;j<L;j++)predictvalue[i][j]+=save_d[k]*pt[i]*save_q[k][j]; for(i=0;i<TN;i++)for(j=0;j<M;j++)test_x[i][j]-=pt[i]*save_p[k][j];}for(i=0;i<TN;i++)for(j=0;j<M;j++)test_x[i][j]-=pt[i]*save_p[k][j];}for(i=0;i<TN;i++)for(j=0;j<L;j++){ predictvalue[i][j]*=std_y[i];predictvalue[i][j]+=avg_y[j];}}statistics() /*计算结果评估*/u[i]=new_u[i];}count=sqrt(count);if(count<1e-12)return 0;elsereturn 1;}calibration() /*模型的建立*/{ int i,j,ih,mask;double su,sw,st,sq,sp,b;double t[N],w[M],p[M],q[L];ih=0;do{ for(i=0;i<N;i++)u[i]=train_y[i][l];do{ for(su=0,i=0;i<N;i++)su+=u[i]*u[i];for(j=0;j<M;j++){ w[j]=0.0;for(i=0;i<N;i++)w[j]+=u[i]*train_x[i][j];w[j]/=su;}for(sw=0,j=0;j<M;j++)sw+=w[j]*w[j];sw=sqrt(sw);for(j=0;j<M;j++)w[j]/=sw;for(sw=0,j=0;j<M;j++)sw+=w[j]*w[j];for(i=0;i<N;i++){ t[i]=0.0;for(j=0;j<M;j++)t[i]+=train_x[i][j]*w[j];t[i]/=sw;}for(st=0,i=0;i<N;i++)st+=t[i]*t[i];for(j=0;j<L;j++){ q[j]=0.0;for(i=0;i<N;i++)q[j]+=t[i]*train_y[i][j];{ int i,j;for(i=0;i<TN;i++)for(j=0;j<L;j++)error_value[i][j]=test_y[i][j]-predictvalue[i][j]; for(j=0;j<L;j++){ bias[j]=0.0;for(i=0;i<TN;i++)bias[j]/=TN;bias[j]=sqrt(bias[j]);}}report() /*输出结果*/{ int i,j;fprintf(outfp,“预测的浓度值为:\n”);for(i=0;i<TN;i++)for(j=0;j<L;j++)fprintf(outfp, “%9.4lf”, predictvalue[i][j]);fprintf(outfp,“\n”);}fprintf(outfp,“预测结果的误差为:\n”);for(i=0;i<TN;i++){for(j=0;j<L;j++)fprintf(outfp, “%9.4lf”, error_value[i][j]);}fprintf(outfp,“\n”);fprintf(outfp,“相对于各组分的校正标准偏差为\n”); for(i=0;i<L;i++)fprintf(outfp, “%10.4lf”, bias[i]);}void main(argc,argv)int argc;char*argv[];{ if(argc!=3){ printf(“you’v forgot enter a filename.\n”);exit(1);if((infp=fopen(argv[1],“r”))==0{ printf(“can’t open data file\n”);q[i]=/st;}for (sq=0, j=0;j<L;j++)sq+=q[j]*q[j];sq=sqrt(sq);for(j=0;j<L;j++)q[j]=/sq;for (sq=0, j=0;j<L;j++)sq+=q[j]*q[j];for(i=0;i<N;i++){ new_u[j]=0.0;exit(1);}if((outfp=fopen(argv[2],“w”)) = = 0){ printf(“can’t open output file\n” ); exit(1);data_input();data_standardization(); calibration();predict();statistics();report();}。

相关文档
最新文档