1. 程式人生 > >Partial Least Squares Regression 偏最小二乘法迴歸

Partial Least Squares Regression 偏最小二乘法迴歸

介紹

定義

  偏最小二乘迴歸 ≈ 多元線性迴歸分析 + 典型相關分析 + 主成分分析

  輸入:n×m的預測矩陣Xn×p的響應矩陣Y
  輸出:XY的投影(分數)矩陣T,URn×l
  目標:最大化corr(T,U)
  X=TPT+E, Y=UQT+F,其中正交”載入”矩陣PRm×l,QRp×l,假設是獨立同分布的隨機正態變數的錯誤項EF

起源

  來源於瑞典統計學家Herman Wold,然後由他的兒子Svante Wold發展。

優點

  用最簡的方法求值
1. 能夠在自變數存在嚴重多重相關性的條件下進行迴歸建模;
2. 允許在樣本點個數少於變數個數的條件下進行迴歸建模;
3. 偏最小二乘迴歸在最終模型中將包含原有的所有自變數;
4. 偏最小二乘迴歸模型更易於辨識系統資訊與噪聲(甚至一些非隨機性的噪聲);
5. 在偏最小二乘迴歸模型中,每一個自變數的迴歸係數將更容易解釋。

缺點

  TODO

應用領域

  社會科學,化學計量學,生物資訊學,sensometrics,神經科學,人類學

相關

  • 特徵提取
  • 資料探勘
  • 機器學習
  • 迴歸分析
  • 典型相關
  • Deming regression
  • 多線性子空間學習
  • 主成分分析
  • 總平方和

解法

  1. XY都已經過標準化(包括減均值、除標準差等) 。
  2. X的第一個主成分為p1Y的第一個主成分為q1,兩者都經過了單位化(這裡的主成分並不是通過PCA得出的主成分)
  3. u1=Xp1,v1=Yq1CCApq$都有主成分的性質,因此有下面4和5的期望條件。
  4. Var(u1)ma
    x,Var(v1)max
    ,即在主成分上的投影,我們期望是方差最大化。
  5. Corr(u1,v1)max這個跟CCA的思路一致。
  6. 綜合4和5,得到優化目標Cov(u1,v1)=Var(u1)Var(v1)Corr(u1,v1)max

形式化一點:
maxXp1,Yq1
s.t.p1=1,q1=1

求解:
引入拉格朗日乘子
\mathcal{L} = p_1^TX^TYq_1 - \frac{\lambda}{2} (p_1^Tp_1 - 1) - \frac(\theta}{2} (q_1^Tq_1 - 1)
分別對p1,q1求偏導,得
\frac{}

實現

Python

    • plsr_example.py
      python
      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
        text
        >>> Y_pred
        array([[ 0.26087869, 0.15302213],
        [ 0.60667302, 0.45634164],
        [ 6.46856199, 6.48931562],
        [ 11.7638863 , 12.00132061]])
    • plsc_example.py
      python
      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
        text
        >>> 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

參考