def _calcProjectionVector(self, dataX, dataY): import scipy.linalg SigmaXX = calcCovarianceMatrix(dataX, dataX) SigmaYY = calcCovarianceMatrix(dataY, dataY) SigmaXY = calcCovarianceMatrix(dataX, dataY) leftMatrix = SigmaXY * SigmaYY.I * SigmaXY.T rightMatrix = SigmaXX eigenValues, eigenVectors = scipy.linalg.eig(leftMatrix, rightMatrix) maxEigenValueIndex = np.where(eigenValues == max(eigenValues)) maxEigenVector = eigenVectors[maxEigenValueIndex] return maxEigenVector/np.linalg.norm(maxEigenVector)
def _removeThirdVariable(self, framesInLabel): Xti = self.Xt[framesInLabel] Ytkmi = self.Ytkm[framesInLabel] Xtkmi = self.Xtkm[framesInLabel] SigmaXtiXtkmi = calcCovarianceMatrix(Xti, Xtkmi) SigmaYtkmiXtkmi = calcCovarianceMatrix(Ytkmi, Xtkmi) SigmaXtkmiXtkmi = calcCovarianceMatrix(Xtkmi, Xtkmi) #逆行列が計算出来ないことがあるので、正則化する #詳しくは Yamashita et al. Causal Flow を参照 regularized_eta = 0.00001 AHat = SigmaXtiXtkmi * (SigmaXtkmiXtkmi + regularized_eta * np.matrix(np.identity(SigmaXtkmiXtkmi.shape[0]))).I BHat = SigmaYtkmiXtkmi * (SigmaXtkmiXtkmi + regularized_eta * np.matrix(np.identity(SigmaXtkmiXtkmi.shape[0]))).I # AHat = SigmaXtiXtkmi * SigmaXtkmiXtkmi.I # BHat = SigmaYtkmiXtkmi * SigmaXtkmiXtkmi.I XtDash = self.Xt - self.Xtkm * AHat.T #TODO 式がちゃんとあっているか確認すべき YtkmDash = self.Ytkm - self.Xtkm * BHat.T return XtDash, YtkmDash