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 _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
    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