精华内容
下载资源
问答
  • 偏最小二乘法的Matlab源码(2008-09-21 09:31:21) 标签 杂谈? ? 所谓偏最小二乘法就是指在做基于最小二乘法的线性回归分析之前对数据集进行主成分分析降维下面的源码是没有删减的GreenSim团队免费提供您使用转载请...
  • matlab计算偏最小二乘法的程序-matlab计算偏最小二乘法的程序.rar 偏最小二乘法 1建模原理 2计算方法推导 3交叉有效性 附录(源程序)
  • 偏最小二乘法

    2019-10-02 13:19:17
    偏最小二乘法是一种新型的多元统计数据分析方法,它于1983年由伍德(S.Wold)和阿巴诺(C.Albano)等人首提示来的,偏最小二乘法有机的结合起来了,在一个算法下,可以同时实现回归建模(多元线性回归)、数据结构简化...

    偏最小二乘法是一种新型的多元统计数据分析方法,它于1983年由伍德(S.Wold)和阿巴诺(C.Albano)等人首提示来的,偏最小二乘法有机的结合起来了,在一个算法下,可以同时实现回归建模(多元线性回归)、数据结构简化(主成分分析)以及两组变量之间的相关性分析(典型相关分析)。这是多元统计数据分析中的一个飞跃。

    偏最小二乘法在统计应用中的重要性体现在以下几个方面: 偏最小二乘法是一种多因变量对多自变量的回归建模方法。偏最小二乘法可以较好的解决许多以往用普通多元回归无法解决的问题。 偏最小二乘法之所以被称为第二代回归方法,还由于它可以实现多种数据分析方法的综合应用。 主成分回归的主要目的是要提取隐藏在矩阵X中的相关信息,然后用于预测变量Y的值。这种做法可以保证让我们只使用那些独立变量,噪音将被消除,从而达到改善预测模型质量的目的。但是,主成分回归仍然有一定的缺陷,当一些有用变量的相关性很小时,我们在选取主成分时就很容易把它们漏掉,使得最终的预测模型可靠性下降,如果我们对每一个成分进行挑选,那样又太困难了。

    偏最小二乘回归可以解决这个问题。它采用对变量X和Y都进行分解的方法,从变量X和Y中同时提取成分(通常称为因子),再将因子按照它们之间的相关性从大到小排列。现在,我们要建立一个模型,我们只要决定选择几个因子参与建模就可以了

    基本概念

    偏最小二乘回归是对多元线性回归模型的一种扩展,在其最简单的形式中,只用一个线性模型来描述独立变量Y与预测变量组X之间的关系: Y = b0 + b1X1 + b2X2 + ... + bpXp 在方程中,b0是截距,bi的值是数据点1到p的回归系数。

    http://baike.baidu.com/link?url=6l10CQc9K8No55sjs4eY5bWPRckw7Qi5-nPO0ZtdiksodTTe6E4NPam4NsH6mdXwlkrRkAbuaISdrRx5PZ8r0a

    偏最小二乘法是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最佳函数匹配。 用最简的方法求得一些绝对不可知的真值,而令误差平方之和为最小。 通常用于曲线拟合。很多其他的优化问题也可通过最小化能量或最大化熵用最小二乘形式表达。

    基本公式

    偏最小二乘回归≈多元线性回归分析+典型相关分析+主成分分析

    基本特点

    与传统多元线性回归模型相比,偏最小二乘回归的特点是:
    (1)能够在自变量存在严重多重相关性的条件下进行回归建模;
    (2)允许在样本点个数少于变量个数的条件下进行回归建模;
    (3)偏最小二乘回归在最终模型中将包含原有的所有自变量;
    (4)偏最小二乘回归模型更易于辨识系统信息与噪声(甚至一些非随机性的噪声);
    (5)在偏最小二乘回归模型中,每一个自变量回归系数将更容易解释。
    建模方法
    设有q个因变量和p个自变量。为了研究因变量自变量的统计关系,观测了n个样本点,由此构成了自变量与因变量的数据表X和Y。偏最小二乘回归分别在X与Y中提取出t和u,要求:(1)t和u应尽可能大地携带它们各自数据表中的变异信息;(2)t和u的相关程度能够达到最大。在第一个成分被提取后,偏最小二乘回归分别实施X对t的回归以及Y对t的回归。如果回归方程已经达到满意的精度,则算法终止;否则,将利用X被t解释后的残余信息以及Y被t解释后的残余信息进行第二轮的成分提取。如此往复,直到能达到一个较满意的精度为止。若最终对X共提取了多个成分,偏最小二乘回归将通过施行yk对X的这些成分的回归,然后再表达成yk关于原自变量的回归方程

    转载于:https://www.cnblogs.com/Acceptyly/p/3586703.html

    展开全文
  • 摘要偏最小二乘法(partial least squares, PLS)是一种结合了多元线性回归、主成分分析和典型相关分析的线性回归方法。它有效克服了普通最小二乘回归的共线性问题,并且确保了每一个自变量的回归系数对因变量的解释性...

    摘要

    偏最小二乘法(partial least squares, PLS)是一种结合了多元线性回归、主成分分析和典型相关分析的线性回归方法。它有效克服了普通最小二乘回归的共线性问题,并且确保了每一个自变量的回归系数对因变量的解释性。本文主要介绍利用偏最小二乘法搭建多因子选股模型、构建股票组合的方法。

    偏最小二乘法

    偏最小二乘法是在搭建多因子选股模型时,综合多因子得到对股票收益率的最终判断的一种方法。在介绍偏最小二乘法之前,我们先来了解多因子选股模型。

    01

    多因子选股模型

    多因子选股模型的基本思想是找到某些与股票收益率最相关的因子,并根据这些因子构建模型进行预测,寻找出预期收益率最高的投资组合。各种多因子选股模型的核心区别主要体现在两点:1.因子的选取;2.如何综合多因子得到最终判断。本文主要针对第二个区别点进行介绍。

    多因子合成方法本质上就是把多维度的因子聚合成一个分数的过程。这个分数作为横截面上选股的依据。打分很多时候是通过对多因子的加权平均实现的。所以因子合成的问题就转化为了选择权重的问题。一般来说,确定权重的方法可以分为两类,一类由经济逻辑驱动,一类由数据驱动。

    02

    多因子合成方法——经济逻辑驱动

    由经济逻辑驱动的权重的优点是简单直观,通常具有明确的经济含义。比较常见的有:

    (1)  赋予各个因子相同权重。这里假设各个因子具有相同的重要性,因此赋予它们相同的权重。

    (2) 根据各因子的IC均值加权合成。IC即信息系数,表示所选股票的因子值与股票下期收益率的截面相关系数,通过IC值可以判断因子值对下期收益率预测的有效性;

    (3) 根据各因子的IR值加权合成。IR即信息比率,是超额收益的均值与标准差之比,IR=IC均值/IC标准差,代表因子获得稳定超额收益的能力。IR兼顾了因子预测收益率的有效性以及稳定性;

    IC值和IR值反映了因子对股票收益率的预测能力,指标越高预测效果越好,对应因子被赋予的权重也越大。可以说,这些权重的确定来源于我们的先验知识,具有直观的经济含义。

    有关上面几种权重优化方法更详细的介绍可参见我们社区的文章《多因子权重优化方法比较》。

    02

    多因子合成方法——数据驱动

    数据驱动的权重并不是通过先验知识直接确定,而是通过某种算法得到的。通常这些算法都会有一个优化的目标。求权重的过程就是解优化问题的过程。这种方法的优点是能够尽可能反映数据的分布特征,减少主观随意性。但缺点也很明显,不一定每种算法所得到的权重都具有很强的可解释性和明显的经济含义。该方法常见的数学模型有以下几种:

    普通最小二乘法(OLS)

    普通最小二乘法是线性回归方法的一种,其优化目标是最小化预测股票收益率和真实值差的平方和。这里的因子回归系数就是我们上文提到的权重。从数学角度看,假设股票的预期收益率y是自变量(候选因子)x1, x2, ..., xk的线性函数,用方程表示为

    69adba3a771a47b9135e7261a3e69abb.png

    yi是因变量的第i组观测值,xki是第k个自变量的第i个观测值,βkxk的回归系数,εi是第i组观测值的残差项,即OLS通过调整β使各组残差项的平方和最小。

    OLS比较简便、直观,但当参数估计的自变量之间存在线性相关性或称共线性的时候,采用OLS的方法估计参数将会出现病态解。股票数据包含高维度的因子,因子之间往往存在关联,此时就需要通过降维减少因子的个数。

    主成分分析法(PCA)

    主成分分析法是通过降维技术将高维因子转化为少数几个主成分的方法。它的优化目标是在高维数据中找到最大方差的方向,并将数据映射在维度不大于原始数据的新的子空间上。PCA的解法如下:

    1.  对原始d维数据集做标准化;

    2.  构造样本的协方差矩;

    3.  计算协方差矩阵的特征值和相应的特征向量;

    4.  选择与前k个最大特征值对应的特征向量,其中k为新特征空间维度(k<=d);

    5.  通过前k个特征向量构建映射矩阵W;

    6.  通过映射矩阵W将d维的输入数据集X转换到新的k维特征子空间。

    PCA是一种无监督学习方法,在训练过程中并没有用到类标。主成分的选取以最大程度概括自变量(各因子)空间数据的变化信息为准则,没有考虑主成分对因变量(股票收益率)的解释作用。

    偏最小二乘法(PLS)

    偏最小二乘法也是降维方法的一种,它将因子进行线性变换,把原本高维度的因子维度降低。PLS是一种新兴的线性回归方法,是对多元线性回归分析、典型相关分析和主成分分析的结合。其解法如下:

    1.  设XY都已经过标准化;

    2. 设X的第一个主成分为p1,Y的第一个主成分为q1,两者都经过了单位化;

    3.  u1=Xp1,v1=Yq1这一步看起来和CCA是一样的,但是这里的p和q都有主成分的性质,因此有下面4和5的期望条件;

    4.  Var(u1)→max,Var(v1)→max

    5.  Corr(u1,v1)→max

    6.  综合4和5,得到优化目标Cov(u1,v1)=[Var(u1)Var(v1)]1/2Corr(u1,v1)→max.

    PLS对主成分的提取使其能够在自变量存在多重相关性的条件下进行回归建模。同时,PLS要求提取的主成分与因变量相关性最大,这样使每个回归系数都更容易被解释。

    基本思路

    PLS模型通过输入最新的因子值得到对未来股票收益率的预测。在构建组合时,我们把股票的特征输入已经训练好的模型中,模型就会输出每一条样本对应的预期收益率,这个值将作为选股标准。

    01

    数据说明

    本文所使用的原始数据集包含2009年1月至2018年9月每个月月末的横截面数据,字段包括月末日期、股票代码、未来收益率、个股特征(包含停牌状态、ST状态、上市天数)等用于判断是否符合交易条件的特征和EP、ROE等参与训练用于选股的特征。由于本文使用本地数据集,读者如果有复现需要,可以根据文末的代码实例构建一个类似的数据集。

    在输入模型进行训练之前需要先对数据集进行预处理。数据集包含不满足可交易条件的样本,需要将这些样本剔除。被定义为可交易的股票须同时满足以下条件:1)非ST;2)非停牌;3)上市时间超过3个月。

    02

    sklearn 中的PLS模型实现 

    模型训练

    sklearn针对机器学习的流程设计了一套统一的接口,所有模型都遵循同一套接口,具体可参考我们之前的文章《基于随机森林算法构建投资组合》,这里以PLS模型为例:

    model = PLSRegression(n_components= ): 对模型进行初始化,在这个阶段,用户输入所有super parameter。这些参数都只和模型有关,和实际的训练数据无关。不同的模型有不同的参数,对于PLS模型,super parameter是要保留的主成分数量。这些参数固定之后,他们可以接收不同的输入数据,训练出不同的模型。

    model.fit(X_train, y_train):sklearn下所有模型都通过调用fit方法进行训练。统一的接口方便用户使用不同的模型训练同一组数据,如果需要改变模型,只需要修改model这个变量,训练的代码无需改动。另一方面,调用fit方法之后,model对象的内部状态会发生改变,用户使用这个训练后的模型对新数据进行预测。

    model.predict:predict方法也是sklearn规范的一部分,所有模型都可以通过这一接口传入数据,进行预测。PLS模型输出的即是对股票收益率的预测。

    注意,sklearn输出的数据结构多为numpy.array,而我们项目主要处理的数据结构是pandas.Series和pandas.DataFrame。因此我们需要定义以下两个wrapper函数,将sklearn的输出转化为我们所需的数据结构。

    make_model:输入预测日,所有历史数据,创建并训练模型。在实现上,它接受了一些主要super parameter用于创建PLS模型,在内部调用get_training_dataset得到训练集,调用model.fit训练模型。

    make_factor:我们最终的目标是通过PLS模型得到对股票收益率的预测,因此我们定义一个函数,在预测日,根据模型进行预测,将模型的输出作为选股的标准。在实现上,它在内部调用model.predict方法,并将其转换为与我们项目一致的数据结构。

    def make_model_PLS(rebalance_date, data, n_components=1):    model = PLSRegression(n_components=n_components)    X, y = get_training_dataset(rebalance_date, data)    model.fit(X, y)    return model# compute factor valuesdef make_factor(rebalance_date, model, data):    features = get_prediction_dataset(rebalance_date, data)    temp_Series = pd.Series(model.predict(features).ravel(), pd.MultiIndex.from_product([[rebalance_date], features.index], names=['date''symbol']))    return temp_Series

    本文以48个月为窗口进行滚动训练。初始化时需要用掉的样本数一般称为burn in。在我们的例子里,第一个模型需用掉48期,故BURNIN_PERIODS = 48。模型训练一般在换仓日进行,我们先定义一个换仓日列表rebalance_dates用于循环,然后循环训练集以获得48期的选股因子数据。

    BURNIN_PERIODS = 48rebalance_dates = raw_data.index.get_level_values('date').unique()[BURNIN_PERIODS: ]factor_list_PLS = []for date in rebalance_dates:    model = make_model_PLS(date, raw_data, n_components=1)    factor = make_factor(date, model, raw_data)    factor_list_PLS.append(factor)    print('Training PLS model for {}'.format(date))factor_PLS = pd.concat(factor_list_PLS)

    构建目标组合

    PLS模型负责对每一条样本进行预测,得到每个个股的预期收益率。而如何根据这些预期收益率构建目标持仓,是另一个独立的过程。我们这里介绍构建分位数组合的方法 。

    01

    分位数组合

    以下使用的构建分位数(quantile)组合的方法是每一期买入预期收益率位于当前股票池前10%的股票。在这种方法下,每一期的持仓数量会略有不同,随着当期可投资股票的数量变化而变化。这里我们同时计算十个分位数组合,比较它们的收益率。

    在实际操作中,我们使用pd.qcut将股票预期收益率对每个横截面Series按分位数分组,返回每个个股每一天所属的组合,然后我们从分组构建目标组合。

    def make_factor_data(factor, quantiles=10):    quantile_labels = list(range(1, quantiles + 1))    factor_quantile = (factor.groupby(level='date', group_keys=False).apply(pd.qcut, q=quantiles, labels=quantile_labels))    res = pd.concat({'factor': factor, 'factor_quantile': factor_quantile},axis=1)    return resfactor_data_PLS = make_factor_data(factor_PLS, quantiles=10)from collections import OrderedDictdef get_portfolios_from_factor_data(factor_data, quantile):    factor_data = factor_data[factor_data['factor_quantile'] == quantile]        def build_portfolio(df):        # 等权组合, 权重为 1/len(df), index为股票代码---df.index的第二层        return pd.Series(1 / len(df), index=df.index.get_level_values('symbol'))        portfolios = OrderedDict()    for date, df in factor_data.groupby(level='date'):        portfolios[date] = build_portfolio(df)    return portfolios

    02

    计算净值

    计算组合的累计收益,一个简单的算法是:直接将个股的日度收益加权平均算出组合的日度收益,再累乘得到整个组合的累计收益。但这个算法对每一天都采用了相同的权重,相当于每一天都在rebalance。而实际各持仓股票的权重每天都会波动,只有在调仓日才等于目标权重。因此这种算法只能看作实际收益的近似值。

    在这里我们采取更为精确的做法:计算对各持仓股票的累计收益,而不是日度收益进行加权平均。相当于期初将资金按权重分配到每个股票,期末各持仓股票的价值等于权重乘以累计收益,整个组合在期末的价值等于各持仓股票价值之和。但每一次调仓持仓股票及目标权重都可能发生变化,因此需要分别计算每个持仓期的组合净值,最后再将各期净值按时间顺序连接起来。而对净值的连接,相当于用上一时间段最后一天的净值作为初始资金,再投资到下一期。

    以上计算方法可以总结为以下流程:使用net_value作为计算组合净值的主函数,以换仓日期、各换仓日的目标组合、所有个股日度收益为输入,循环调用period_net_value计算各个持仓周期的净值,最后调用merge_period_net_value按照再投资的方式将各个阶段的净值连接为整个回测区间的净值。

    def net_value(rebalance_dates, portfolio_weights, daily_returns):    net_value_list = []    for start, end in zip(rebalance_dates[:-1], rebalance_dates[1:]):        weights = portfolio_weights[start]                # 每个持仓周期为左闭右开区间,以确保一个交易日属于且只属于一个持仓周期        holding_period = (daily_returns.index >= start) & (daily_returns.index < end)        assets_held = weights.index                rtn = daily_returns.loc[holding_period, assets_held].fillna(0)                net_value_list.append(period_net_value(rtn, weights))            res = merge_period_net_value(net_value_list)    return resdef period_net_value(daily_returns, weights):    asset_net_value = (1 + daily_returns).cumprod()    normalized_weights = weights / weights.sum()    portf_net_value = asset_net_value.dot(normalized_weights)    return portf_net_valuedef merge_period_net_value(period_net_values):    net_value_list = []    init_capital = 1    for nv in period_net_values:        nv *= init_capital        net_value_list.append(nv)                # 下一段净值的初始资金是上一段最后一天的值        init_capital = nv.iat[-1]    res = pd.concat(net_value_list)        # 整个回测期第一天的净值一定是1, 第一天的return其实用不到    res.iloc[0] = 1    return res

    然后计算每个组合的净值:

    QUANTILE_GROUPS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]quantile_portf_net_values = OrderedDict()for group in QUANTILE_GROUPS:    portfolio_weights_PLS = get_portfolios_from_factor_data(factor_data_PLS, group)    rebalance_dates = list(portfolio_weights_PLS.keys())    nv = net_value(rebalance_dates, portfolio_weights_PLS, daily_returns)    quantile_portf_net_values[group] = nv
    610a537f4ae5fcd09e1adb6f563eb53f.png

    参考书目

    《多因子权重优化方法比较》.https://www.ricequant.com/community/topic/4559

    《数据降维-主成分分析》.https://blog.csdn.net/ChenVast/article/details/79227630

    王桂增、叶昊.主元分析与偏最小二乘法》.北京:清华大学出版社.2012.

    jiancheng Li. Partial Least Squares. https://lijiancheng0614.github.io

    欢迎点击阅读原文查看研究全部内容

    题图 by Carlos Muza on Unsplash

    Happy Coding

    米筐量化研究平台

    交流|学习|改变

    长按扫码关注我们

    500100b702f8e75e5cf6e868b7f55213.png
    展开全文
  • 偏最小二乘法 Partial Least Squares

    万次阅读 多人点赞 2019-06-24 00:15:58
    本文前部分摘自:偏最小二乘法回归(Partial Least Squares Regression),后半部分原创。 诸如基因组学、转录组学、蛋白组学及代谢组学等高通量数据分析,由于自变量数目大于病例数(未知数大于方程个数),无法...

    本文前部分摘自:偏最小二乘法回归(Partial Least Squares Regression),后半部分原创。

    诸如基因组学、转录组学、蛋白组学及代谢组学等高通量数据分析,由于自变量数目大于病例数(未知数大于方程个数),无法直接使用传统的统计分析模型。比如,线性回归的窘境:如果样例数m相比特征数n少(m<n)或者特征间线性相关时,由于X^{T}X(n*n矩阵)的秩小于特征个数(即X^{T}X不可逆)。因此最小二乘法\theta=(X^{T}X)^{-1}X^{T}\vec{y}就会失效。遇到这种情况,需要先降维处理。有监督的降维方法,除了常用的LASSO,还有一种叫PLS(偏最小二乘法 Partial Least Squares,或称PLSR 偏最小二乘法回归)。PLSR感觉已经把成分分析和回归发挥到极致了。本文将介绍PLS的原理和应用。

    主成分分析 PCA

    本部分摘自:偏最小二乘法回归(Partial Least Squares Regression)

    先回顾下PCA。令X表示样本,含有m个样例[x^{(1)},x^{(2)},...,x^{(m)}],每个样例特征维度为n,x^{(i)}=[x^{(i)}_1,x^{(i)}_2,...,x^{(i)}_n]。假设我们已经做了每个特征均值为0处理。

    如果X的秩小于n,那么X的协方差矩阵 \frac{1}{m}X^{T}X的秩小于n,因此直接使用线性回归的话不能使用最小二乘法来求解出唯一的\theta,我们想使用PCA来使得X^{T}X可逆,这样就可以用最小二乘法来进行回归了,这样的回归称为主元回归(PCR)。

    PCA的一种表示形式:T=XP

    其中X是样本矩阵,P是X的协方差矩阵的特征向量(当然是按照特征值排序后选取的前r个特征向量),T是X在由P形成的新的正交子空间上的投影(也是样本X降维后的新矩阵)。

    PCA的另一种表示:

    X=M_1+M_2+...+M_n=t_1p^T_1+t_2p^T_2+...+t_np^T_n=TP^T(假设X秩为n)

         这个公式其实和上面的表示方式T=XP没什么区别。

          T=XP\rightarrow TP^T=XPP^T\rightarrow X=TP^T(当然我们认为P是n*n的,因此P^T=P^{-1}

         如果P是n*r的,也就是舍弃了特征值较小的特征向量,那么上面的加法式子就变成了

    X=M_1+M_2+...+M_r+E=t_1p^T_1+t_2p^T_2+...+t_rp^T_r+E=TP^T+E

    这里的E是残差矩阵。其实这个式子有着很强的几何意义,p_iX^{T}Xi 大特征值对应的归一化后的特征向量,t_i就是X在p_i上的投影。t_ip^T_i就是X先投影到p_i上,还以原始坐标系得到的X’。下面这个图可以帮助理解:

          

    黑色线条表示原始坐标系,蓝色的点是原始的4个2维的样本点,做完PCA后,得到两个正交的特征向量坐标p_1p_2。绿色点是样本点在p_1上的投影(具有最大方差),红色点是在p_2上的投影。t_1的每个分量是绿色点在p_1上的截距,t_2是红色点在p_2上的截距。t_ip^T_i中的每个分量都可以看做是方向为p_i,截距为t_i相应分量大小的向量,如那个p_1上的橘色箭头。t_ip^T_i就得到了X在p_i的所有投影向量,由于p_1p_2正交,因此t_1p^T_1+t_2p^T_2就相当于每个点的橘色箭头的加和,可想而知,得到了原始样本点。

    如果舍弃了一些特征向量如p_2,那么通过t_1p^T_1只能还原出原始点的部分信息(得到的绿色点,丢失了蓝色点在另一维度上的信息)。另外,P有个名字叫做loading矩阵,T叫做score矩阵。

     

    PLSR思想及步骤

    本部分摘自:偏最小二乘法回归(Partial Least Squares Regression)

    我们还需要回味一下CCA来引出PLSR。在CCA中,我们将X和Y分别投影到直线得到u和v,然后计算u和v的Pearson系数(也就是Corr(u,v)),认为相关度越大越好。形式化表示:

          

    其中a和b就是要求的投影方向。

    想想CCA的缺点:对特征的处理方式比较粗糙,用的是线性回归来表示u和x的关系,u也是x在某条线上的投影,因此会存在线性回归的一些缺点。我们想把PCA的成分提取技术引入CCA,使得u和v尽可能携带样本的最主要信息。还有一个更重要的问题,CCA是寻找X和Y投影后u和v的关系,显然不能通过该关系来还原出X和Y,也就是找不到X到Y的直接映射。这也是使用CCA预测时大多配上KNN的原因。

    而PLSR更加聪明,同时兼顾PCA和CCA,并且解决了X和Y的映射问题。看PCA Revisited的那张图,假设对于CCA,X的投影直线是p_1,那么CCA只考虑了X的绿色点与Y在某条直线上投影结果的相关性,丢弃了X和Y在其他维度上的信息,因此不存在X和Y的映射。而PLSR会在CCA的基础上再做一步,由于原始蓝色点可以认为是绿色点和红色点的叠加,因此先使用X的绿色点t_1对Y做回归( Y=t_1r^T_1+F,样子有点怪,两边都乘以r_1就明白了,这里的Y类似于线性回归里的xt_1类似y ),然后用X的红色点t_2对Y的剩余部分F做回归( 得到r_2F=t_2r^T_2+F^' )。这样Y就是两部分回归的叠加。当新来一个x时,投影一下得到其绿色点t_1和红色点t_2,然后通过r就可以还原出Y,实现了X到Y的映射。当然这只是几何上的思想描述,跟下面的细节有些出入。

         下面正式介绍PLSR:

         1) 设X和Y都已经过标准化(包括减均值、除标准差等)。

         2) 设X的第一个主成分为p_1,Y的第一个主成分为q_1,两者都经过了单位化。(这里的主成分并不是通过PCA得出的主成分)

         3) u_1=Xp_1v_1=Yq_1,这一步看起来和CCA是一样的,但是这里的p和q都有主成分的性质,因此有下面4)和5)的期望条件。

         4) Var(u_1)\rightarrow max, Var(v_1)\rightarrow max,即在主成分上的投影,我们期望是方差最大化。

         5) Corr(u_1,v_1)\rightarrow max,这个跟CCA的思路一致。

         6) 综合4)和5),得到优化目标 Cov(u_1,v_1)=\sqrt{Var(u_1)Var(v_1)}Corr(u_1,v_1)\rightarrow max,即协方差最大化。

         形式化一点:

          

         看起来比CCA还要简单一些,其实不然,CCA做完一次优化问题就完了。但这里的clip_image054[7]clip_image082[1]对PLSR来说只是一个主成分,还有其他成分呢,那些信息也要计算的。

         先看该优化问题的求解吧:引入拉格朗日乘子

          

    因此p_1就是对称阵X^TYY^TX的最大特征值对应的单位特征向量,q_1就是Y^TXX^TY最大特征值对应的单位特征向量。

         可见p_1q_1是投影方差最大和两者相关性最大上的权衡,而CCA只是相关性上最大化。

         求得了p_1q_1,即可得到

          

    这里得到的clip_image122clip_image124类似于上图中的绿色点,只是在绿色点上找到了X和Y的关系。如果就此结束,会出现与CCA一样的不能由X到Y映射的问题。

         利用我们在PCA Revisited里面的第二种表达形式,我们可以继续做下去,建立回归方程:

          

         这里的c和d不同于p和q,但是它们之间有一定联系,待会证明。E和G是残差矩阵。

         我们进行PLSR的下面几个步骤:

          

          

          

          

    由上述步骤可知,虽然PLS多次迭代映射分解,但是最终组合起来,仍然是一个Y与X的线性回归Y=XB+F!将每次迭代过程中的映射变换的参数进行线性运算可以得到最终模型的参数B和F。

    上述步骤中,矩阵C即为载荷矩阵(即通过c_i可计算出每个样本在第 i 个成分的得分)。

     

    PLS结果的解读

    (本部分查阅资料后总结)

    通过PLS分析,可以得到PLS-VIP值和PLS-BETA值,可用于筛选变量(PLS-VIP最常使用)。

    PLS-VIP

    PLS-VIP指的是Variable Importance in Projection,最先在 3D QSAR in Drug Design: Theory Methods and Applications 这本书中提出(可惜这本书很贵,看不到相应的描述)。第 j 个变量的VIP值计算方法如下:

          

    其中,p表示最初总共有p个变量参与分析;h表示最终总共进行了h次迭代计算(总共获得了h个维度);w_{jk}表示第k次迭代时(第k个维度),变量 j 进行映射时所采用的权重(即协方差矩阵中的系数),反应的是变量 j 对第k次映射结果X_k的解释程度;\hat{c}^2t_k^{'}t_k表示第k次映射的结果X_k 对 Y_k 的解释程度( 注:X_k是自变量X第k次的映射结果,Y_k是因变量Y在第k次迭代时被解释的部分 )。

    由于所有变量的VIP值的平方和等于1,所以往往将1作为VIP判定的界值:一般认为VIP小于1的变量对模型解释程度很低。

    PLS-BETA

    PLS-BETA值的是PLS最终回归模型中各个变量的系数。上一部分的推导结果可知,本质上最终的模型仍然是Y与X的线性回归Y=XB+F,这里的B即为系数向量。线性回归模型的系数越大往往预示着这个变量越重要(前提是各个变量已经标准化处理)。PLS-BETA 在许多文献里写作 Cov(t, Xi),即得分矩阵与自变量矩阵的的协方差。

    Correlation Coefficient

    Correlation Coefficient 指的是样品得分与变量之间的相关性(即预测的Y与每个变量x_i之间的相关性r),简称Corr.Coeffs,这其实是对PLS-BETA的补充。相关性越好,则说明该变量越重要。这个相关性还可以计算显著性p值(同理,PLS-BETA也可以计算p值),相关性r的界值没有规定,一般根据其对应的p值取0.05作为界值。

    Corr.Coeffs在许多文献里也写作 Corr(t, Xi),即得分矩阵与自变量矩阵的的相关系数。根据协方差与相关系数的数学关系可知:Corr(t, Xi) = Cov(t, Xi) / (St * Sxi)。

    V-Plot

    同时参照VIPCorr.Coeffs筛选变量,是常用的策略。由于大多数情况下,VIP值和Corr.Coeffs值相关性较好,且VIP恒正而Corr.Coeffs可正可负,因此可视化的图类似于V形,被称为V-Plot。

    S-Plot

    同时参照PLS-BETACorr.Coeffs筛选变量,也是常用的策略。由于PLS-BETACorr.Coeffs同正同负,因此可视化的图中所有的点全部分布在第一和第三象限,类似于S形,被称为S-Plot。

    S-Plot 详细的解读,可以参考原始论文:Visualization of GC/TOF-MS-Based Metabolomics Data for Identification of Biochemically Interesting Compounds Using OPLS Class Models

          

    原始论文部分截图如下:

          

    Loading Plot 与 Score Plot

    先回顾下PCA的 loading plot (可以参考:PCA - Loadings and Scores)。所谓 loading(载荷),指的是坐标映射的系数(权重),也就是原始变量与主成分之间的变换系数。对于每个主成分,都有一个载荷向量 (w_1,w_2,...,w_n),其中 w_i 表示 原始变量 x_i 的单位长度映射到该主成分坐标上所得值。若选择前两个主成分的载荷向量(为2*n的载荷矩阵),则可以绘制二维的 loading plot,其含义就是前两个主成分构成的二维坐标空间与原始变量构成的高维坐标空间之间的对应关系。可以看出,loading plot 是针对原始变量而言。

    PCA的二维 score plot 的含义是 以这两个主成分作为自变量绘制二维坐标系,各个样本的坐标值是多少。可以看出 score plot是针对样本而言。

    常常将 loading plot 和 score plot 叠加在同一张图里,此时称为 bi-plot (如下图,图片出处不详)。

          

    PLS 分析中,loading plot 和 score plot 的含义与PCA中一致,只是需注意 loading 不仅有 X loading,还有 Y loading。一般用w表示 X loading,用c表示 Y loading (比如 k分类时若选取2个主成分,则为2*k的矩阵),将二者叠加在同一张图(叠加不涉及任何计算,就是简单叠加),此时的 loading plot 又称为 w*c 图(参考自SIMCA-P中对w*c 图的解释)。另外,PLS的 score plot 中的坐标轴常用 t 表示,而不是 PC表示,但表达的是同一个意思,只是因为,在模型推导时,我们常常使用 t 矩阵表示 X 映射后的各个主成分。

          

    图片来源:Plasma Amino Acid Profile in Patients with Aortic Dissection

    这部分理解还可以参考:

    成分分析中biplot函数

    样本得分图和自变量的载荷图如何出现在一张图上

     

    PLS模型评价

    (本部分查阅资料后总结)

    拟合效果

    评价PLS-DA 模型拟合效果使用R2X、R2Y和Q2Y这三个指标,这些指标越接近1 表示PLS-DA 模型拟合数据效果越好。其中,R2X 和R2Y 分别表示PLSDA分类模型所能够解释X 和Y 矩阵信息的百分比,Q2Y 则为通过交叉验证计算得出,用以评价PLS-DA模型的预测能力,Q2Y 越大代表模型预测效果较好。

    Q2和R2从计算上来看其实一模一样,只是采用的样本不一样,公式都是 1 - RSS/TSS(Q2中一般把RSS改写为PRESS,即 predicted residual error sum of squares)。R2是对 参与拟合的样本 计算残差,因此体现的是“拟合能力”;Q2是对 交叉验证中未参与拟合的样本 计算残差,因此体现的是“预测能力”。由于R2进行计算时,拟合后残差肯定不会变大,所以R2的取值在0-1之间;Q2中残差可能会比初始状态的残差更大,因此Q2甚至有可能为负数。另外,对于每个自变量都可以计算对应的R2和Q2。

    从《Multi- and Megavariate Data Analysis Basic Principles and Applications》书中截取的公式如下(这本书比较权威):

          

    完整的原文如下:

          

    随着加入模型的变量增加(模型变复杂),R2会增加或进入平台期,但Q2可能会下降(Q2下降说明过拟合了),回想一下测试集和训练集的学习曲线可知。我们需要找一个平衡,其实也就是“方差variance”和“偏差bias”的平衡

          

    PCA分析中R2X >0.4为好(PCA中只有R2X,即最终纳入的几个成分累计对原始变量的还原程度 [或者说解释程度] );PLS-DA 和 OPLS-DA分析中,R2X 这个参数不重要了,主要是R2Y 和Q2,这两个值>0.5 为好,越接近1越好。我们经常看到PLS-DA中有个Q2(cum),是指建模后模型的预测能力(即最终得到线性模型Y=XB+F的预测能力),以大于0.5为宜,越接近1越好,cum 表示累积的意思,在公式中涉及到单自变量Q2的累乘运算,但其实就是模型整体的Q2。

    是否过拟合

    可靠的解读,需要进行permutation test(置换检验)判断模型是否过拟合。一般需检验模型的Q2值和R2值。对于Q2,要求置换检验结果的在y轴上的截距小于0,方可认为模型没有过拟合。这种标准相对严格,可能是考虑到:置换检验中标签打乱的比例和拟合/预测能力成正比例函数时(过原点坐标),过拟合情况正好消失(仅保留了该有的拟合能力),若稍微存在一定过拟合,则截距会在原点之上。但是,也有另一种宽松的标准,只要能推测出“只有极少数(5%)置换模拟的Q2值比当前Q2值大”,则认为没有过拟合(ropls包中采用的是这种宽松的方式,给出置换检验的p值进行判断)。

    关于这个问题,笔者后来在《Multi- and Megavariate Data Analysis Basic Principles and Applications》书中得到了说法:根据经验来看,R2截距应小于0.3,Q2截距应小于0.05。

          

          

    置换检验的基本原理:将真实分类结果(标签)屏蔽,重新随机赋予分类结果(标签),再进行建模。如果真实建模的Q2和随机标签建模的Q2接近,则说明模型过拟合。具体原理请参考其他资料。置换检验可视化的图,横坐标表示的是置换后的标签与真实标签的相似性(有多少比例的样本未打乱重新赋予标签)。
          

     

    PLS-DA

    PLS本质上是线性回归,若遇到分类任务,需要将因变量进行dummy处理(哑变量化),此时便称为PLS-DA。为了与PLS-DA区分,普通的PLS又称为PLSR。

    笔者有个疑惑,对于二分类问题,直接使用PLSR进行处理是否合理?之前在SVM中也遇到过相似的疑惑:普通的二分类问题,用SVR处理是否合理?笔者之前的一些任务中,发现二分类中可以使用SVR替代SVM。但是解决这些疑惑还需要重新解读PLS-DA及SVR的原理,以及进行一些模拟数据的测试。

    根据笔者的经验,将连续性因变量问题转为分类问题,可以仿照 Logistic,在原先回归的基础上再加一个连接函数(如Logistic 中的连接函数为logit 函数 [ 其反函数是 sigmoid 函数 ] ),将问题转为广义线性回归的任务。PLS 与 PLS-DA 之间的转换,为什么不采用这种技巧呢?

    PLS 常用R工具包:ropls、pls、plsdepot 及 mixOmics;常用的python工具包:sklearn.cross_decomposition 中的 PLSRegression。

    ropls包使用比较简单,可以跟着提供的案例进行学习。

    pls 包是最基础的工具包,里面有封装了各种求解 PLS 的算法,其中的 CPPLS 算法可以解决多个因变量的问题及分类问题(分类问题常常使用哑变量法,被转换为多因变量问题)。但是 pls 包不能直接计算 vip 值,需要自己手动编写计算程序。

    plsdepot 包也是值得推荐的工具包,里面同样封装了很多PLS 相关的算法。其中,plsreg1 可以处理普通的PLS任务,而plsreg2可以处理多个因变量的问题(也就可以处理分类问题)。另外,pslreg2 可以计算 vip 值,并且还计算了Q2等结果。

    mixOmics 是另一个不错的工具,可以直接计算 PLS 和 PLS-DA等问题。mixOmics 中的vip方法可以计算 vip 值

     

    一个题外话——哑变量技巧

    对于存在分类变量的问题,我们第一步就是对变量进行dummy处理。对于自变量的哑变量化与因变量的哑变量化,有一些细微的区别。

    对于类别数为 k 的分类自变量,我们会设置(k-1)个哑变量:g_1,g_2,...,g_{k-1}。哑变量的编码规则为:对于参照类别(又称类别0,可以人为定义一个类别作为计算的参照值,等价于连续性变量中的0值),我们将各个哑变量都赋值为0,即: g_1=0,g_2=0,...,g_{k-1}=0;对于其他类别,我们为每个类别选择一个哑变量,并将相应的哑变量赋值为1 而其他哑变量赋值 0,比如类别1可以这样赋值:g_1=1,g_2=0,...,g_{k-1}=0 。这么处理是为了在结果解读时,能够为每个哑变量找到“参照值”。

    对于类别数为 k 的分类因变量,我们会设置 k 个哑变量:g_1,g_2,...,g_{k} 。为每个类别选择一个哑变量,并将相应的哑变量赋值为1 而其他哑变量赋值为 0。这种处理技巧很常见,理解也比较简单。比如 Logistic 的 softmax 函数也是采用哑变量的形式处理多分类问题。

     

    OPLS及OPLS-DA

    (本部分出处忘记了)

    OPLS-DA是PLS-DA的扩展,即首先使用正交信号校正技术,将X矩阵信息分解成与Y相关和不相关的两类信息,然后过滤掉与分类无关的信息,相关的信息主要集中在第一个预测成分。Trygg et al. (2002)认为该方法可以在不降低模型预测能力的前提下,有效减少模型的复杂性和增强模型的解释能力。与PLS-DA模型相同,可以用R2X、R2Y、Q2和OPLS-DA得分图来评价模型的分类效果。目前一般认为,在二分类问题中,OPLS-DA可以作为首选分析方法(代谢组学中更多人使用OPLS,而不是PLS)。

     

    PLS的一些思考

    PLS与LASSO的对比

    (本部分原创)

    PLS和LASSO,从本质上来讲,都是线性回归模型!只是说,这二者在进行回归建模时,顺便进行了特征降维。

    在完成降维后,二者重新构建模型,得到的其实就是一个简单的线性回归模型。而在变量选择(降维)的过程中,两者采用的策略不同,PLS采用的是成分分解分析的思路,而LASSO采用的是惩罚约束策略。

    至于具体哪种方法更好,很难说。在实际数据分析时,两种方法都可以进行尝试,最后选择效果更好的方法即可。

    在应对共线性(collinearity)问题上,两者的表现如何呢?由于LASSO的原则是使模型尽可能简单,也就会尽可能消除共线性;但是PLS关注的是各个变量对Y的解释,会保留共线性的变量。2005年有篇论文(Performance of some variable selection methods when multicollinearity is present)对此进行了验证,结论里提到“The PLS-VIP method performed excellently in identifying relevant predictors and outperformed the other methods. It was also found that a model with good fitness performance may not guarantee good variable selection performance. Thus, for the purpose of selecting relevant process variables, process engineers must be careful when using model performance such as RMSE, R-squares, etc.”  该论文作者提出,在选择变量时,尽量避免使用R2等评价指标,而应该直接使用上述结果解读部分的方法。

     

    PLS与GBDT的对比

    理解了PLS的原理后,很容易发现PLS的思路很像集成学习Boosting,最典型比如GBDT(Gradient Boosting Decision Tree)。二者的思想都是先尽量拟合,然后一步步拟合残差部分,最后将各次的拟合集成。

    朴素的思想:PLS和GBDT的拟合策略背后,都蕴含着一种由简入繁的思想,先拟合大致轮廓,再逐步拟合细节。

    贪心的思想:局部最优化,PLS与GBDT都是考虑当前的最优拟合决策,这是典型的贪心拟合策略。贪心的解未必是全局最优解。

    PLS与GBDT的不同:PLS本质上还是线性模型,GBDT可以是非线性的。PLS的生物学解释性较强,GBTD建立的模型未必能很好地解释(决策树类的模型关注决策条件的信息熵,往往会忽视变量的生物学解释;线性模型可以保留生物学线性关系,但无法考虑到潜在的交互作用 [除非添加交互项] )。

     

    参考资料

    偏最小二乘法回归(Partial Least Squares Regression)

    N.L. Afanador, et al. Use of the bootstrap and permutation methods for a more robust variable importance in the projection metric for partial least squares regression. Analytica Chimica Acta. 2013

    Il-Gyo Chong, et al. Performance of some variable selection methods when multicollinearity is present. Chemometrics and Intelligent Laboratory Systems. 2005

    代谢组学数据分析的统计学方法综述

    PCA - Loadings and Scores

     

    展开全文
  • 偏最小二乘法算法

    2018-07-23 12:52:10
    偏最小二乘法是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最佳函数匹配。 用最简的方法求得一些绝对不可知的真值,而令误差平方之和为最小。 很多其他的优化问题也可通过最小化能量或最大化熵用最小...
  • 通过半核偏最小二乘法进行面部幻觉
  • errs =[]for i inrange(len(y_predict)): e= (y_predict[i]-y_test[i])**2errs.append(e)returnsum(errs)#偏最小二乘法的实现部分。 x_train, x_test, y_train, y_test = train_test_split(RON,A,test_size=0.5) #...

    #-*- coding: utf-8 -*-

    #看来这个程序适合的是python2版本的。来源:https://blog.csdn.net/li_huifei/article/details/78467689#这个目前也可以用了,主要还是在第60行的数据转换,,,不太清楚怎样去做装换。主要是因为数据类型不清楚,所以用了最笨的方法,不知道结果正不正确。????【这个是错误的】#PLSR3经过摸索,第68行,还是因为数据结构类型不对,之后把array类型的数组转换成了list,,,这样方便在外面套一个[],,之后运行没有问题,但是结果的正确与否,还有待验证。

    #导入库的部分

    importcsvfrom sklearn importpreprocessingfrom sklearn.cross_validation importtrain_test_splitfrom sklearn.decomposition importRandomizedPCAfrom sklearn.cross_decomposition import PLSRegression #偏最小二乘法的实现, 在这里是可以跳进 PLSRegression 里面的

    importnumpy as npimportmathimportmatplotlib.pyplot as plt#导入数据的部分

    A = np.loadtxt('A.csv',delimiter=',') #读入数据 这里的A就是y的矩阵 #读了这么多的数据???哪个是x,,哪个又是y呢???

    print(A.shape)

    RON= np.loadtxt('RON.csv',delimiter=',') #这里的RON就是x的矩阵

    print(RON.shape)#暂且在这里设置全局变量吧。

    x_train_st_i=[]#定义全局函数的部分。

    def error(y_predict,y_test): #定义计算误差平方和函数,,,传入的是估算出的值,和测试值,,这里仅仅是用来定义的,方便后面的调用。

    errs =[]for i inrange(len(y_predict)):

    e= (y_predict[i]-y_test[i])**2errs.append(e)returnsum(errs)#偏最小二乘法的实现部分。

    x_train, x_test, y_train, y_test = train_test_split(RON,A,test_size=0.5) #划分训练集测试集,,,这个是一个库函数?? ,,,,这里能够看出是A和RON进行建模的。

    x_train_st = preprocessing.scale(x_train) #数据标准化,这个是内置函数

    y_train_st = preprocessing.scale(y_train) #数据标准化,,这一句是我仿照上面的一句改写的。

    n_components = 0 #这个应该是保存主成分的个数。

    while n_components

    n_components=n_components+1 #在第一遍的时候n_components是1,第二遍循环的时候是2,,,第n遍循环是n,,最大是x的列数,也就是特征的个数,

    pls2 = PLSRegression(n_components=n_components) #计算SS (SS这个是全建模 , PRESS是减去一个进行建模,,,,在python里建模很简单,设置好参数,调用一下函数就能建模了)

    #这个不是偏最小二乘法吗???,,这里是循环计算主成分的个数,直到达到满意的精度。

    pls2.fit(x_train_st, y_train) #fit也是一个函数,,,两个参数,第一个参数是训练集,第二个参数是目标。

    y_predict0 = pls2.predict(x_train_st) #predict也是一个内置的函数,,,,这个是不是用建好的模型去做预测,,,,把参数训练集输入进去,得到的是预测的值。

    SS = error(y_predict0,y_train) #这里是预测的值和真正的值之间的误差大小。

    y_predict1 = [] #这是创建了一个新的变量。根据名字的意思,根据模型得到的y的预测值,实际上这个模型是留一法建立的模型。

    for i in range(x_train_st.shape[0]): #计算PRESS,,,,这个是x_train_st的行数

    n_components1 = n_components #但是我不明白,为什么这里还要加1,主成分不可能是0个吧,所以就从1开始了。

    x_train_st1 = np.delete(x_train_st,i,0) #这里的0是行,1是列,,这个应该是删除第i行,,,这里是标准化的数组。留一法的实现

    y_train_st1 = np.delete(y_train,i,0) #这个也是删除第i行,这里都是经过标准化的(但这个x是经过标准化的,y却没有用标准化的数据)。,,这个没有用到过,是不是这里写错了??

    pls2 = PLSRegression(n_components=n_components1) #偏最小二乘法参数的设置,,,这里面一般有5个参数,,但这里只传入了主成分的个数。

    #参数1:n_components:int ,(default 2) ,,要保留的主成分数量,默认为2

    #参数2:scale:boolean,(default True),,是否归一化数据,默认为是

    #参数3:max_iter: an integer,(default 500),,使用NIPALS时的最大迭代次数

    #参数4:tol: non-negative real(default 1e-06),,迭代截止条件

    #参数5:copy: Boolean,(default True),,

    pls2.fit(x_train_st1, y_train_st1) #这里是根据前面设置好的参数建模过程,这里的建模过程是不是不太对(这里x是归一化的,y并没有用归一化的),应该都是用归一化的才行呀。???

    #这里主要是进行了数据格式的转换,因为做预测要传进的是矩阵【格式很重要】

    x_train_st_i=[] #用之前要进行清空,这个很重要。用一个参数之前要进行清空。

    x_train_st_list=x_train_st[i].tolist()

    x_train_st_i.append(x_train_st_list)print ('the x_train_st is',x_train_st_i) #输出一下变量,查看格式是否正确,因为下面的predict函数需要用[[1,1,1,1,1,1]] 这种格式的数据

    y_predict11= pls2.predict(x_train_st_i) #预测函数,给定之前留一法没有用到的样本,进行建模,预测对应的y值。????可是已经删除了不是吗??? ZHE这句出了一点问题????就是数据格式有问题,需要在最外面在加一个[]

    y_predict1.append(y_predict11)#把所有的y值组成一个数组,便于计算误差。,这个也是y的预测值,用它来算出另一个误差。

    PRESS = error(y_predict1,y_train) #可能错误:https://blog.csdn.net/little_bobo/article/details/78861578

    Qh = 1-float(PRESS/SS)if Qh<0.0985: #判断精度 模型达到精度要求,可以停止主成分的提取了。

    plt.figure(1)

    plt.scatter(y_predict0,y_train)#画了一个图,这个图是预测值,与测量值的图???

    plt.figure(2)

    plt.scatter(y_predict1,y_train)print ('the Qh is',Qh)print ('the PRESS is',PRESS)print ('the SS is',SS)break #达到了上面的精度,就可以停止while的迭代了

    #这下面就没有看懂了。

    print ('n_components is',n_components+1) #这里为什么要加1???,,,难道因为计数是从0开始的??

    SECs =[]

    errors=[]

    e= 100

    for i in range(10): #循环测试

    #print i

    x_train, x_test, y_train, y_test = train_test_split( RON,A, test_size=0.5) #划分训练集与测试集,这个是一个内置的函数。

    x_test_st = preprocessing.scale(x_test) #数据标准化

    y_predict = pls2.predict(x_test_st) #进行预测

    SECs.append(np.sqrt(error(y_predict,y_test)/(y_test.shape[0]-1)))

    errors.append(float(error(y_predict,y_test)))if SECs[-1]

    y_predict_min=y_predict

    y_test_min=y_testprint ('the prediced value is' ,y_predict.T) #画图,打印结果

    print ('the true value is',y_test)print ('the mean error is',float(np.mean(errors)))print ("the mean SEC is",float(np.mean(SECs)))

    plt.figure(3)

    plt.scatter(y_predict_min,y_test_min)

    展开全文
  • If you elect r package pls,http://cran.r-project.org/web/packages/pls/index.htmldata(yarn)## Default methods:yarn.pcr yarn.pls yarn.cppls ## Alternative methods:yarn.oscorespls method = "oscorespls")y...
  • 偏最小二乘法回归分析处理光谱数据,并用交叉验证对此模型进行验证
  • 偏最小二乘法的原理与实现近几年来,机器学习在各个领域都有不错的表现,在生物信息领域也有相关的应用。然而,在诸如基因组学、转录组学、蛋白组学以及代谢组学等高通量数据的一大特点是特征量多、样本数少。以转录...
  • errs =[]for i inrange(len(y_predict)): e= (y_predict[i]-y_test[i])**2errs.append(e)returnsum(errs)#偏最小二乘法的实现部分。 x_train, x_test, y_train, y_test = train_test_split(RON,A,test_size=0.5) #...
  • 这是基于遗传算法的偏最小二乘法在材料方面的应用,文中详细介绍了遗传算法和偏最小二乘法的如何应用。
  • 使用修正的核偏最小二乘法进行多元数据建模
  • 融合模型树的偏最小二乘法的中医药分析研究
  • 偏最小二乘法Matlab源代码,自己编写
  • 线性及非线性偏最小二乘法在近红外预测木材密度中的应用研究,张鸿富,李耀翔,本文研究了基于近红外光谱技术的木材密度预测。分别运用基于高斯核变换的非线性偏最小二乘法和传统线性偏最小二乘法建立密度预测
  • 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些...
  • 基于特征子集相关度和偏最小二乘法的特征选择策略
  • matlab开发-偏最小二乘法和判别分析法。使用PLS进行判别分析的教程和工具。
  • 偏最小二乘法PLS(matlab自带代码)

    千次阅读 2020-08-25 22:43:05
    偏最小二乘法(NIPALS经典实现--未简化) 偏最小二乘法 基本性质推导 偏最小二乘法(SIMPLS---未简化) 前面讲了许多PLS的性质,这里介绍一下PLS的matlab自带的PLS代码,对PLS有一个全面的认识 function ...
  • 一个偏最小二乘法的应用实例,希望能对读者有帮助
  • 该书主要介绍了偏最小二乘法的原理及实例分析,对统计分析非常有用,原理描述清楚

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 775
精华内容 310
关键字:

偏最小二乘法