1. 介绍
    1. 定义
    2. 起源
    3. 优点
    4. 缺点
    5. 应用领域
  2. 相关
  3. 解法
  4. 实现
    1. Python
    2. R
  5. 应用
  6. 参考

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

介绍

定义

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

  输入:\(n \times m\)的预测矩阵\(X\)\(n \times p\)的响应矩阵\(Y\)

  输出:\(X\)\(Y\)的投影(分数)矩阵\(T, U \in \mathbb{R}^{n \times l}\)

  目标:最大化\(\operatorname{corr}(T, U)\)

  \(X = T P ^ T + E\), \(Y = U Q ^ T + F\),其中正交''加载''矩阵\(P \in \mathbb{R}^{m \times l}, Q \in \mathbb{R}^{p \times l}\),假设是独立同分布的随机正态变量的错误项\(E\)\(F\)

起源

  来源于瑞典统计学家Herman Wold,然后由他的儿子Svante Wold发展。2

优点

  用最简的方法求值

  1. 能够在自变量存在严重多重相关性的条件下进行回归建模;

  2. 允许在样本点个数少于变量个数的条件下进行回归建模;

  3. 偏最小二乘回归在最终模型中将包含原有的所有自变量;

  4. 偏最小二乘回归模型更易于辨识系统信息与噪声(甚至一些非随机性的噪声);

  5. 在偏最小二乘回归模型中,每一个自变量的回归系数将更容易解释。

缺点

  TODO

应用领域

  社会科学,化学计量学,生物信息学,sensometrics,神经科学,人类学

相关

  • 特征提取
  • 数据挖掘
  • 机器学习
  • 回归分析
  • 典型相关
  • Deming regression
  • 多线性子空间学习
  • 主成分分析
  • 总平方和

解法

  1. \(X\)\(Y\)都已经过标准化(包括减均值、除标准差等) 。
  2. \(X\)的第一个主成分为\(p_1\)\(Y\)的第一个主成分为\(q_1\),两者都经过了单位化(这里的主成分并不是通过PCA得出的主成分)
  3. \(u_1 = X_{p_1}, v_1 = Y_{q_1}这一步看起来和CCA是一样 的,但是这里的\)p\(和\)q$都有主成分的性质,因此有下面4和5的期望条件。
  4. \(Var(u_1) \to max, Var(v_1) \to max\),即在主成分上的投影,我们期望是方差最大化。
  5. \(Corr(u_1, v_1) \to max\)这个跟CCA的思路一致。
  6. 综合4和5,得到优化目标\(Cov(u_1, v_1) = \sqrt{Var(u_1)Var(v_1)}Corr(u_1, v_1) \to max\)

形式化一点:

\(\max \left\langle X_{p_1}, Y_{q_1} \right\rangle\)

\(s.t. \lVert p_1 \rVert = 1, \lVert q_1 \rVert = 1\)

求解:

引入拉格朗日乘子

\(\mathcal{L} = p_1^T X^T Y q_1 - \frac{\lambda}{2} (p_1^T p_1 - 1) - \frac{\theta}{2} (q_1^T q_1 - 1)\)

分别对\(p_1, q_1\)求偏导,得

TODO...

实现

Python

  • Scikit-Learn

    sklearn.cross_decomposition.PLSRegression

    http://scikit-learn.org/stable/modules/generated/sklearn.cross_decomposition.PLSRegression.html

    • plsr_example.py

      1
      2
      3
      4
      5
      6
      from sklearn.cross_decomposition import PLSRegression
      X = [[0.0, 0.0, 1.0], [1.0, 0.0, 0.0], [1.0, 1.0, 1.0], [0.4, 1.0, 0.8], [0.1, 0.1, 0.1]]
      Y = [[0, 0, 1], [1, 0, 0], [1, 1, 1], [0, 1, 1], [0, 0, 0]]
      pls2 = PLSRegression(n_components=3)
      pls2.fit(X, Y)
      Y_pred = pls2.predict(X)

    • output

      1
      2
      3
      4
      5
      >>> Y_pred
      array([[ 0.26087869, 0.15302213],
      [ 0.60667302, 0.45634164],
      [ 6.46856199, 6.48931562],
      [ 11.7638863 , 12.00132061]])

    sklearn.cross_decomposition.PLSCanonical

    http://scikit-learn.org/stable/modules/generated/sklearn.cross_decomposition.PLSCanonical.html

    • plsc_example.py

      1
      2
      3
      4
      5
      6
      from sklearn.cross_decomposition import PLSCanonical
      X = [[0., 0., 1.], [1.,0.,0.], [2.,2.,2.], [2.,5.,4.]]
      Y = [[0.1, -0.2], [0.9, 1.1], [6.2, 5.9], [11.9, 12.3]]
      plsca = PLSCanonical(n_components=2)
      plsca.fit(X, Y)
      X_c, Y_c = plsca.transform(X, Y)

    • output

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      >>> X_c
      array([[-1.39700475, 0.1179672 ],
      [-1.19678754, -0.17050027],
      [ 0.56032252, 0.0991593 ],
      [ 2.03346977, -0.04662624]])
      >>> Y_c
      array([[-1.22601804, 0.01674181],
      [-0.9602955 , -0.04216316],
      [ 0.32491535, 0.04379 ],
      [ 1.86139819, -0.01836865]])

R

  • pls

应用

  TODO

参考


  1. http://baike.baidu.com/view/1378714.htm↩︎

  2. https://zh.wikipedia.org/wiki/%E5%81%8F%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E5%9B%9E%E5%BD%92↩︎