偏最小二乘 PLS _B < 二>

這是第二部分求最佳的預測係數B的代碼
#encoding:utf-8

# 導入numpy包
import numpy as np

#定義一個PLS的類
class  PLS(object): 
    def comput(self,pc,x,y):
        
        #最初始 的X,Y
        self.X = x
        self.Y = y
        
        # 獲取數據X的樣本數和緯度
        m, n = self.X.shape
        
        self.T = np.zeros((m, pc))#生成一個存放T的矩陣,後面用來存放數據
        self.W = np.zeros((n, pc))#生成一個存放W的矩陣
        self.P = np.zeros((n, pc))#生成一個存放P的矩陣
        self.Q = np.zeros((self.Y.shape[1], pc))#生成一個存放Q的矩陣
        self.U = np.zeros((m, pc))#生成一個存放U的矩陣
        B = np.zeros((n, pc))#生成一個存放B的矩陣
        
        
        for i in range(pc): # 控制循環次數,選取幾個主成分,循環幾次
#             u=np.array(np.mat(self.Y[:, [0]]))
            if i==0:
                u=np.mat(self.Y[:, 0]).T# 將y的一列給u
            else:
                u=np.mat(self.Y[:, 0])
            mz=True
            while mz:
                #進行六步驟的迭代,一般的PLS論文上寫的很清楚,這就不重複了
                w=np.dot(self.X.T,u)
                w=np.true_divide(w,np.sqrt(np.dot(w.T,w)))
                t=np.dot(self.X,w)
                q=np.true_divide(np.dot(self.Y.T,t),np.dot(t.T,t))
            
                unew=np.true_divide(np.dot(self.Y,q),np.sqrt(q.T*q))
                diff =np.dot((u-unew).T,(u-unew))
                if diff<2.2204*10**(-16):# 訓練到一個合適的精度
                    mz=False
                else:
                    u=unew

            p=np.true_divide(np.dot(self.X.T,t),np.dot(t.T,t))
            
            self.X=self.X-np.dot(t,p.T)  # 將X, Y的殘差作爲 X, Y繼續提取潛在變量
            self.Y=self.Y-np.dot(t,q.T)
            
            self.W[:, i] = w.T.ravel()# 將前面提取的成分存儲到前面定義的矩陣當中
            self.T[:, i] = t.T.ravel()
            self.P[:, i] = p.T.ravel()
            self.U[:, i] = unew.T.ravel()
            self.Q[:, i] = q.T.ravel()
            
            b1=self.W[:,0:i+1]   # 後面的幾部是求得B的值
            b2=np.linalg.inv(np.dot(self.P[:,0:i+1].T,self.W[:,0:i+1]))
            b3=self.Q[:,0:i+1].T
            b = np.dot(np.dot(b1,b2),b3)
            B[:, i] = b.ravel()

        return B



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章