#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
偏最小二乘 PLS _B < 二>
這是第二部分求最佳的預測係數B的代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.