偏最小二乘回歸及python代碼

原理

偏最小二乘回歸的思想是將 Y = [ y1, y2, ... , yn ] 椎椰,X = [ x1, x2, ... , xn ]


進(jìn)行線性表示 Y = XBpls + F

步驟

1. 將 X 和 Y 進(jìn)行標(biāo)準(zhǔn)化

設(shè) X 標(biāo)準(zhǔn)化后的矩陣為 E0痹换, Y 標(biāo)準(zhǔn)化后的矩陣為 F0

2. 求解第一個(gè)成分

設(shè) E0 和 F0 的第一成分為 t1u1。這一步的目的是使得 E0 和 F0 的第一成分之間的相關(guān)性達(dá)到最大嗤练,方便用 E0 的第一成分 t1 線性表示 F0



其中式子 5-9 是典型的特征值分解式,因此可求得權(quán)重向量 w1停巷,c1

那么 E0 和 F0 的第一個(gè)成分 t1胖眷,u1 定義如下:


因此

3. 建立第一個(gè)成分與 E0 和 F0 之間的關(guān)系


根據(jù)最小二乘法原理求解系數(shù)得:


4. 計(jì)算殘差矩陣

由式子 5-11 有:


如果殘差矩陣 E1F1 沒有滿足閾值范圍厌杜,則利用 E1F1 代替 E0F0 繼續(xù)進(jìn)行分解奉呛,重復(fù)步驟 2 - 4
因此有( E1F1E2F2 的關(guān)系):

繼續(xù)對(duì)殘差矩陣 E1F1 進(jìn)行分解藤滥,進(jìn)一步降低殘差

一般地有


其中:

  1. E0 代表決策變量 X 標(biāo)準(zhǔn)化后的矩陣竭恬,F(xiàn)0 代表響應(yīng)變量 F 標(biāo)準(zhǔn)化后的矩陣
  2. E1-i袱箱,F(xiàn)1-i 代表殘差矩陣境析,參考式子 5-13 到 5-16

5. 重構(gòu) X,Y 和成分 t 的關(guān)系

以下的 X咆槽,Y 原始數(shù)據(jù)矩陣默認(rèn)為標(biāo)準(zhǔn)化后的:
因此經(jīng)過多次分解以后:

6. 重構(gòu) X 與 Y 之間的關(guān)系

以下的 X陈轿,Y 原始數(shù)據(jù)矩陣默認(rèn)為標(biāo)準(zhǔn)化后的:
首先理解偏最小二乘的外部結(jié)構(gòu)和內(nèi)部結(jié)構(gòu):


聯(lián)立以上各式有:

假設(shè)每個(gè)成分 t 與 X 的關(guān)系為:



即:


整理得到 X 與 Y 之間的關(guān)系



得證

理解 t 與 u 之間的關(guān)系

t 與 u 之間滿足相關(guān)性最大,這樣可以用 t 替代 u 來線性表示 Y

代碼

import numpy as np

# 設(shè)決策變量 X = { x1, x2, x3 }罗晕,響應(yīng)變量 Y = { y1, y2, y3 }
x1=[191,189,193,162,189,182,211,167,176,154,169,166,154,247,193,202,176,157,156,138]
x2=[36,37,38,35,35,36,38,34,31,33,34,33,34,46,36,37,37,32,33,33]
x3=[50,52,58,62,46,56,56,60,74,56,50,52,64,50,46,62,54,52,54,68]
y1=[5,2,12,12,13,4,8,6,15,17,17,13,14,1,6,12,4,11,15,2]
y2=[162,110,101,105,155,101,101,125,200,251,120,210,215,50,70,210,60,230,225,110]
y3=[60,60,101,37,58,42,38,40,40,250,38,115,105,50,31,120,25,80,73,43]


data_raw=np.array([x1,x2,x3,y1,y2,y3])
data_raw=data_raw.T # 輸入原始數(shù)據(jù)济欢,行數(shù)為樣本數(shù),列數(shù)為特征數(shù)
# 數(shù)據(jù)標(biāo)準(zhǔn)化
num=np.size(data_raw,0) # 樣本個(gè)數(shù)
mu=np.mean(data_raw,axis=0) # 按列求均值
sig=(np.std(data_raw,axis=0)) # 按列求標(biāo)準(zhǔn)差
data=(data_raw-mu)/sig # 標(biāo)準(zhǔn)化小渊,按列減去均值除以標(biāo)準(zhǔn)差
# 提取自變量和因變量數(shù)據(jù)

n=3 # 自變量個(gè)數(shù)
m=3 # 因變量個(gè)數(shù)
x0=data_raw[:,0:n] # 原始的自變量數(shù)據(jù)
y0=data_raw[:,n:n+m] # 原始的變量數(shù)據(jù)
e0=data[:,0:n] # 標(biāo)準(zhǔn)化后的自變量數(shù)據(jù)
f0=data[:,n:n+m] # 標(biāo)準(zhǔn)化后的因變量數(shù)據(jù)

chg=np.eye(n) # w 到 w* 變換矩陣的初始化

w=np.empty((n,0)) # 初始化投影軸矩陣
w_star=np.empty((n, 0)) # w* 矩陣初始化
t=np.empty((num, 0)) # 得分矩陣初始化
ss=np.empty(0) # 或者ss=[],誤差平方和初始化
press=[] # 預(yù)測(cè)誤差平方和初始化
Q_h2=np.zeros(n) # 有效性判斷條件值初始化
print(Q_h2)

for i in range(n):
    matrix=e0.T@f0@f0.T@e0 # 構(gòu)造矩陣E'FF'E
    val,vec=np.linalg.eig(matrix) # 計(jì)算特征值和特征向量
    index=np.argsort(val)[::-1] # 獲取特征值從大到小排序前的索引
    val_sort=val[index] # 特征值由大到小排序
    vec_sort=vec[:,index] # 特征向量按照特征值的順序排列
    w=np.append(w,vec_sort[:,0][:,np.newaxis],axis=1) # 儲(chǔ)存最大特征向量
    w_star=np.append(w_star,chg@w[:,i][:,np.newaxis],axis=1) # 計(jì)算 w* 的取值
    t=np.append(t,e0@w[:,i][:,np.newaxis],axis=1) # 計(jì)算投影
    alpha=e0.T@t[:,i][:,np.newaxis]/(t[:,i]@t[:,i]) # 計(jì)算自變量和主成分之間的回歸系數(shù)
    chg=chg@(np.eye(n)-(w[:,i][:,np.newaxis]@alpha.T)) # 計(jì)算 w 到 w*的變換矩陣
    e1=e0-t[:,i][:,np.newaxis]@alpha.T # 計(jì)算殘差矩陣
    e0=e1 # 更新殘差矩陣


    beta=np.linalg.pinv(t)@f0 #求回歸方程的系數(shù)茫叭,數(shù)據(jù)標(biāo)準(zhǔn)化酬屉,沒有常數(shù)項(xiàng)
    res=np.array(f0-t@beta) #求殘差
    ss=np.append(ss,np.sum(res**2))#殘差平方和
    #-----求解殘差平方和press
    press_i=[] #初始化誤差平方和矩陣
    for j in range(num):
        t_inter=t[:,0:i+1]
        f_inter=f0
        t_inter_del=t_inter[j,:] #把舍去的第 j 個(gè)樣本點(diǎn)保存起來,自變量
        f_inter_del=f_inter[j,:] #把舍去的第 j 個(gè)樣本點(diǎn)保存起來,因變量
        t_inter= np.delete(t_inter,j,axis=0) #刪除自變量第 j 個(gè)觀測(cè)值
        f_inter= np.delete(f_inter,j,axis=0) #刪除因變量第 j 個(gè)觀測(cè)值
        t_inter=np.append(t_inter,np.ones((num-1,1)),axis=1)
        beta1=np.linalg.pinv(t_inter)@f_inter # 求回歸分析的系數(shù),這里帶有常數(shù)項(xiàng)
        res=f_inter_del-t_inter_del[:,np.newaxis].T@beta1[0:len(beta1)-1,:]-beta1[len(beta1)-1,:] #計(jì)算殘差
        res=np.array(res)
        press_i.append(np.sum(res**2)) #殘差平方和揍愁,并存儲(chǔ)
    press.append(np.sum(press_i)) #預(yù)測(cè)誤差平方和

    Q_h2[0]=1
    if i>0:
        Q_h2[i]=1-press[i]/ss[i-1]
    if Q_h2[i]<0.0975:
        print('提出的成分個(gè)數(shù) r=',i+1)
        break


beta_Y_t=np.linalg.pinv(t)@f0 #求Y*關(guān)于t的回歸系數(shù)
beta_Y_X=w_star@beta_Y_t#求Y*關(guān)于X*的回歸系數(shù)
mu_x=mu[0:n] #提取自變量的均值
mu_y=mu[n:n+m] #提取因變量的均值
sig_x=sig[0:n] #提取自變量的標(biāo)準(zhǔn)差
sig_y=sig[n:n+m] #提取因變量的標(biāo)準(zhǔn)差
ch0=mu_y-mu_x[:,np.newaxis].T/sig_x[:,np.newaxis].T@beta_Y_X*sig_y[:,np.newaxis].T#算原始數(shù)據(jù)回歸方程的常數(shù)項(xiàng)
beta_target=np.empty((n,0)) #回歸方程的系數(shù)矩陣初始化

for i in range(m):
    a=beta_Y_X[:,i][:,np.newaxis]/sig_x[:,np.newaxis]*sig_y[i]#計(jì)算原始數(shù)據(jù)回歸方程的系數(shù)
    beta_target=np.append(beta_target,a,axis=1)
target=np.concatenate([ch0,beta_target],axis=0) #回歸方程的系數(shù)呐萨,每一列是一個(gè)方程,每一列的第一個(gè)數(shù)是常數(shù)項(xiàng)

print(target)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莽囤,一起剝皮案震驚了整個(gè)濱河市谬擦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朽缎,老刑警劉巖惨远,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異话肖,居然都是意外死亡北秽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門最筒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贺氓,“玉大人,你說我怎么就攤上這事床蜘≌夼啵” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵邢锯,是天一觀的道長(zhǎng)扬蕊。 經(jīng)常有香客問我,道長(zhǎng)弹囚,這世上最難降的妖魔是什么厨相? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上蛮穿,老公的妹妹穿的比我還像新娘庶骄。我一直安慰自己,他們只是感情好践磅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布单刁。 她就那樣靜靜地躺著,像睡著了一般府适。 火紅的嫁衣襯著肌膚如雪羔飞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天檐春,我揣著相機(jī)與錄音逻淌,去河邊找鬼。 笑死疟暖,一個(gè)胖子當(dāng)著我的面吹牛卡儒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俐巴,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼骨望,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了欣舵?” 一聲冷哼從身側(cè)響起擎鸠,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缘圈,沒想到半個(gè)月后劣光,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡准验,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年赎线,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糊饱。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垂寥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出另锋,到底是詐尸還是另有隱情滞项,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布夭坪,位于F島的核電站文判,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏室梅。R本人自食惡果不足惜戏仓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一疚宇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赏殃,春花似錦敷待、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抗蠢,卻和暖如春举哟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迅矛。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工妨猩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秽褒。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓册赛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親震嫉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容