def fit(self, X, Y):
X = np.asarray(X)
Y = np.asarray(Y)
assert X.shape[1] == self.num_feat
assert Y.shape[1] == self.num_pred
assert X.shape[0] == Y.shape[0]
# Store output minimum and maximum values
self._output_range = np.max(Y, axis = 0) - np.min(Y, axis = 0)
self._output_max = np.max(Y, axis = 0)
self._output_min = np.min(Y, axis = 0)
# Center and standardize inputs
X = self._center_input(X)
X = self._standardize_input(X)
# Center and standardize outputs
Y = self._center_output(Y)
Y = self._standardize_output(Y)
numio = self.total_io
R = self._covf(np.hstack((X,Y)),self.num_lags)
PHI = np.empty((2*self.num_lags-1,numio**2), dtype = float, order='C')
for ii in xrange(numio):
for jj in xrange(numio):
PHI[:,ii+jj*numio] = np.hstack((R[jj+ii*numio,np.arange(self.num_lags-1,0,-1)], R[ii+jj*numio,:]))
Nxxr = np.arange(self.num_lags-1, 2*(self.num_lags-1)+1,1)
Nxxc = np.arange(self.num_lags-1,-1,-1)
Nxy = np.arange(self.num_lags-1, 2*(self.num_lags-1)+1)
# Solve matrix equations to identify filters
PX = np.empty((self.num_feat*self.num_lags,self.num_feat*self.num_lags), dtype=float, order='C')
for ii in xrange(self.num_feat):
for jj in xrange(self.num_feat):
c_start = ii*self.num_lags
c_end = (ii+1)*self.num_lags
r_start = jj*self.num_lags
r_end = (jj+1)*self.num_lags
PX[r_start:r_end,c_start:c_end] = toeplitz(PHI[Nxxc,ii+(jj)*numio],PHI[Nxxr,ii+(jj)*numio])
PXY = np.empty((self.num_feat*self.num_lags, self.num_pred), dtype=float, order='C')
for ii in xrange(self.num_feat):
for jj in xrange(self.num_feat,self.num_feat+self.num_pred,1):
r_start = ii*self.num_lags
r_end = (ii+1)*self.num_lags
c_ind = jj-self.num_feat
PXY[r_start:r_end,c_ind] = PHI[Nxy,ii+(jj)*numio]
self.H = np.linalg.solve((PX + self.reg_lambda*np.ones_like(PX)), PXY)
评论列表
文章目录