def testPCAToolsPCA(self): from PyMca5.PyMcaMath.mva.PCATools import numpyPCA x = numpy.array([[0.0, 2.0, 3.0], [3.0, 0.0, -1.0], [4.0, -4.0, 4.0], [4.0, 4.0, 4.0]]) # that corresponds to 4 spectra of 3 channels nSpectra = x.shape[0] # calculate eigenvalues and eigenvectors with numpy tmpArray = numpy.dot(x.T, x)/(nSpectra - 1) numpyEigenvalues, numpyEigenvectors = numpy.linalg.eigh(tmpArray) # sort from higher to lower idx = list(range(numpyEigenvalues.shape[0]-1, -1 , -1)) numpyEigenvalues = numpy.take(numpyEigenvalues, idx) numpyEigenvectors = numpyEigenvectors[:, ::-1].T # now use PyMca # centering has to be false to obtain the same results ncomp = x.shape[1] for force in [True, False]: images, eigenvalues, eigenvectors = numpyPCA(x, ncomponents=ncomp, force=force, center=False, scale=False) self.assertTrue(numpy.allclose(eigenvalues, numpyEigenvalues)) for i in range(ncomp): if (eigenvectors[i,0] >= 0 and numpyEigenvectors[i,0] >=0) or\ (eigenvectors[i,0] <= 0 and numpyEigenvectors[i,0] <=0): # both same sign self.assertTrue(numpy.allclose(eigenvectors[i], numpyEigenvectors[i])) else: self.assertTrue(numpy.allclose(-eigenvectors[i], numpyEigenvectors[i])) # test with a different shape x.shape = 2, 2, -1 ncomp = 3 for force in [True, False]: images, eigenvalues, eigenvectors = numpyPCA(x, ncomponents=ncomp, force=force, center=False, scale=False) self.assertTrue(numpy.allclose(eigenvalues, numpyEigenvalues)) for i in range(ncomp): if (eigenvectors[i,0] >= 0 and numpyEigenvectors[i,0] >=0) or\ (eigenvectors[i,0] <= 0 and numpyEigenvectors[i,0] <=0): # both same sign self.assertTrue(numpy.allclose(eigenvectors[i], numpyEigenvectors[i])) else: self.assertTrue(numpy.allclose(-eigenvectors[i], numpyEigenvectors[i]))
def testPCAToolsMDP(self): from PyMca5.PyMcaMath.mva.PCATools import getCovarianceMatrix, numpyPCA x = numpy.array([[0.0, 2.0, 3.0], [3.0, 0.0, -1.0], [4.0, -4.0, 4.0], [4.0, 4.0, 4.0]]) # use mdp pcaNode = mdp.nodes.PCANode() pcaNode.train(x) pcaNode.stop_training() pcaEigenvectors = pcaNode.v.T # and compare with PyMca ncomp = x.shape[1] for force in [True, False]: images, eigenvalues, eigenvectors = numpyPCA(x, ncomponents=ncomp, force=force, center=True, scale=False) # the eigenvalues must be the same self.assertTrue(numpy.allclose(eigenvalues, pcaNode.d)) # the eigenvectors can be multiplied by -1 for i in range(ncomp): if (eigenvectors[i,0] >= 0 and pcaEigenvectors[i,0] >=0) or\ (eigenvectors[i,0] <= 0 and pcaEigenvectors[i,0] <=0): # both same sign self.assertTrue(numpy.allclose(eigenvectors[i], pcaEigenvectors[i])) else: self.assertTrue(numpy.allclose(-eigenvectors[i], pcaEigenvectors[i]))
def testPCAToolsMDP(self): from PyMca5.PyMcaMath.mva.PCATools import getCovarianceMatrix, numpyPCA x = numpy.array([[0.0, 2.0, 3.0], [3.0, 0.0, -1.0], [4.0, -4.0, 4.0], [4.0, 4.0, 4.0]]) # use mdp pcaNode = mdp.nodes.PCANode() pcaNode.train(x) pcaNode.stop_training() pcaEigenvectors = pcaNode.v.T # and compare with PyMca for force in [True, False]: images, eigenvalues, eigenvectors = numpyPCA(x, ncomponents=x.shape[1], force=force, center=True, scale=False) # the eigenvalues must be the same self.assertTrue(numpy.allclose(eigenvalues, pcaNode.d)) # the eigenvectors can be multiplied by -1 for i in range(x.shape[1]): if (eigenvectors[i,0] >= 0 and pcaEigenvectors[i,0] >=0) or\ (eigenvectors[i,0] <= 0 and pcaEigenvectors[i,0] <=0): # both same sign self.assertTrue(numpy.allclose(eigenvectors[i], pcaEigenvectors[i])) else: self.assertTrue(numpy.allclose(-eigenvectors[i], pcaEigenvectors[i]))
def testPCAToolsPCA(self): from PyMca5.PyMcaMath.mva.PCATools import numpyPCA x = numpy.array([[0.0, 2.0, 3.0], [3.0, 0.0, -1.0], [4.0, -4.0, 4.0], [4.0, 4.0, 4.0]]) # that corresponds to 4 spectra of 3 channels nSpectra = x.shape[0] # calculate eigenvalues and eigenvectors with numpy tmpArray = numpy.dot(x.T, x)/(nSpectra - 1) numpyEigenvalues, numpyEigenvectors = numpy.linalg.eigh(tmpArray) # sort from higher to lower idx = list(range(numpyEigenvalues.shape[0]-1, -1 , -1)) numpyEigenvalues = numpy.take(numpyEigenvalues, idx) numpyEigenvectors = numpyEigenvectors[:, ::-1].T # now use PyMca # centering has to be false to obtain the same results for force in [True, False]: images, eigenvalues, eigenvectors = numpyPCA(x, ncomponents=x.shape[1], force=force, center=False, scale=False) self.assertTrue(numpy.allclose(eigenvalues, numpyEigenvalues)) self.assertTrue(numpy.allclose(eigenvectors, numpyEigenvectors)) # test with a different shape x.shape = 2, 2, -1 for force in [True, False]: images, eigenvalues, eigenvectors = numpyPCA(x, ncomponents=3, force=force, center=False, scale=False) self.assertTrue(numpy.allclose(eigenvalues, numpyEigenvalues)) self.assertTrue(numpy.allclose(eigenvectors, numpyEigenvectors))