PLS入門:
1,兩篇關鍵文章
[1] de Jong, S. "SIMPLS: An Alternative Approach to Partial Least Squares Regression." Chemometrics and Intelligent Laboratory Systems. Vol. 18, 1993, pp. 251–263.
[2] Rosipal, R., and N. Kramer. "Overview and Recent Advances in Partial Least Squares." Subspace, Latent Structure and Feature Selection: Statistical and Optimization Perspectives Workshop (SLSFS 2005), Revised Selected Papers (Lecture Notes in Computer Science 3940). Berlin, Germany: Springer-Verlag, 2006, pp. 34–51.
2,PLS回歸是一種針對多變量的回歸。是線性回歸的最高峰。
最簡單的函數格式為:[XL,YL] = plsregress(X,Y,ncomp)
這個函數意味着把x對y進行回歸,並且選擇ncomp個主成分,在所得的結果當中,xl和y l就是預測的回歸變量的載荷值,相對的來說x是一個n-by-p的矩陣,它代表的是需要預測的變量。他的每一行表示特定樣本的各種各樣的觀察值,它的每一列表示各種各樣的變量。y是一個n乘以m的結局矩陣。在可能的情況下,N應該盡可能的是啞元變量。xl是一個,七乘,以n個主成分的,預測值的載荷,xl里邊,每一排,都代表了一系列的系數,這些系數可以組成一個,線性的組合,也就是ps主成分的線性的組合。
舉一個例子:
汽油在氣缸中正常燃燒時火焰傳播速度為10~20m/s,在爆震燃燒時可達1500~2000m/s。后者會使氣缸溫度劇升,汽油燃燒不完全,機器強烈震動,從而使輸出功率下降,機件受損。與辛烷有同一分子方程式的異辛烷,其震爆現象最少,我們便把其辛烷值定為100。正庚烷一捧就爆,我們規定其的辛烷值為0,這兩種標准燃料以不同的體積比混合起來,可得到各種不同的抗震性等級的混合液,在發動機工作相同條件下,與待測燃料進行對比。抗震性與樣品相等的混合液中所含異辛烷百分數,即為該樣品的辛烷值。汽油辛烷值大,抗震性好,質量也好。 把汽油中不同種類碳氫化合物的百分比,與其辛烷值相乘,加起來便是該種汽油的辛烷值。
在1997年,Kalivas, John H等人在論文 "Two Data Sets of Near Infrared Spectra," Chemometrics and Intelligent Laboratory Systems, v.37 (1997) pp.255-259.當中,描述了一個利用Near Infrared Spectra(近紅外光譜)來分析汽油辛烷值的論文。利用401nm的近紅外光譜,可以對汽油辛烷值。
要測定汽油的辛烷值,如果用震動汽油爆炸的方法,那么需要非常昂貴的設備,而且實驗的重復性還很差。當然,也可以使用一系列的蒸餾方法將各種烷烴直接分開。但是雷德蒸餾測試儀,和其它的蒸餾裝置非常昂貴。因此用相對廉價切穩定的紅外光譜來分析辛烷值就成了一種挑戰。但是紅外光譜成像較為復雜。有200個峰以上。且不同譜峰間停留時間短。因此要從復雜的峰變換中獲得良好的分析,需要采用高級的多元回歸的方法。
在matlab中運行以下代碼:
load spectra
whos NIR octane
運行的結果為:
Name Size Bytes Class Attributes
NIR 60x401 192480 double
octane 60x1 480 double
這表明有60個樣本,每個樣本有401個波峰,而他們的辛烷值(因為預先混合)有480個已知的值。我們需要做的事情,就是利用多元回歸的方法去把這60*401個矩陣和60*1的矩陣進行回歸。回歸完成之后,如果以后有新的某種汽油的紅外光譜數據,就可以方便的通過上述公式計算出它的辛烷值。
[dummy,h] = sort(octane);
oldorder = get(gcf,'DefaultAxesColorOrder');
set(gcf,'DefaultAxesColorOrder',jet(60));
plot3(repmat(1:401,60,1)',repmat(octane(h),1,401)',NIR(h,:)');
set(gcf,'DefaultAxesColorOrder',oldorder);
xlabel('Wavelength Index'); ylabel('Octane'); axis('tight');
grid on