Exemplo n.º 1
0
        /// <summary>
        /// Returns a sorted list of EigenObjects sorted by their corresponding comparator implemention (eigenvalue in our case)
        /// </summary>
        /// <param name="Decomposition">Decomposition after solving the GEVP</param>
        /// <returns></returns>
        private List <EigenObject> GetSortedEigenObjects(IEigenvalueDecomposition Decomposition)
        {
            List <EigenObject> Res          = new List <EigenObject>();
            IMatrix            Eigenvectors = Decomposition.EigenvectorMatrix;

            for (int j = 0; j < Eigenvectors.Columns; j++)
            {
                EigenObject Eigen       = new EigenObject();
                double[]    eigenvector = new double[Eigenvectors.Rows];
                double      magnitude   = 0.0;
                double      eigenvalue  = Decomposition.RealEigenvalues[j];
                for (int i = 0; i < Eigenvectors.Rows; i++)
                {
                    eigenvector[i] = Eigenvectors[i, j];
                    magnitude     += Eigenvectors[i, j] * Eigenvectors[i, j];
                }
                magnitude         = Math.Sqrt(magnitude);
                Eigen.Magnitude   = magnitude;
                Eigen.Eigenvalue  = eigenvalue;
                Eigen.Eigenvector = eigenvector;
                Res.Add(Eigen);
            }
            Res.Sort();
            return(Res);
        }
Exemplo n.º 2
0
        public void Train(int newDim)
        {
            CalculateMeansForAllClasses();
            meanImage = CalculateMean(this.FaceList); //Mean image of all data
            SW        = CalculateWithinclassScatter();
            IMatrix SB  = CalculateBetweenclassScatter();
            IMatrix Res = SW.Inverse.Multiply(SB);
            IEigenvalueDecomposition Decomposition = Res.GetEigenvalueDecomposition();
            List <EigenObject>       Eigens        = GetSortedEigenObjects(Decomposition);

            Console.WriteLine(Eigens.Count);
            WMatrix         = GetLDABase(Eigens, newDim);               //The weighted matrix
            ProjectedMatrix = WMatrix.Transpose().Multiply(DataMatrix); //Projected samples
            ComputeLDAProjectionForList(this.FaceList);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Trains the PCA Classifier with the data in the given folder
        /// </summary>
        /// <param name="NewDimensionality"> Desired new vector space dimension</param>
        public void Train(int NewDimensionality)
        {
            LoadImageMatrix();
            if (ImagesAsMatrix == null)
            {
                throw new Exception("Images were not loaded to Matrix correctly");
            }
            IMatrix Adjusted   = MeanAdjust(this.ImagesAsMatrix);
            IMatrix Covariance = CalculateCovarianceMatrix(Adjusted);
            IEigenvalueDecomposition Decomposition = Covariance.GetEigenvalueDecomposition(); //Eigenvalues are sorted, they are stack column-wise

            EigenVectors = GetDesiredCountEigenvector(Decomposition, NewDimensionality);
            EigenTransformationMatrix = ImagesAsMatrix.Multiply(EigenVectors);
            EigenTransformationMatrix = NormalizeByColumn(EigenTransformationMatrix);
            PopulateEigenFaceList();
            CalculateProjectedImages(this.DataSet); //Calculating the projection of all images in the new basis space
            this.IsTrained = true;
        }
Exemplo n.º 4
0
        //-------------------------------------------------

        //---------------------ComputeEigenValues-------------------
        private void ComputeEigenValuesEigenVectors()
        {
            int i, j;
            int n = ImageList.Count; //Total number of images
            Evals = new double[n]; //One EigenVal per Img
            IMatrix Evecs = new Matrix(n, n);
            IEigenvalueDecomposition eigen = Cov.GetEigenvalueDecomposition();
            Evecs = eigen.EigenvectorMatrix;
            Evals = eigen.RealEigenvalues;
            //---Copy the Eigen values and vectors in EvEvec objects
            //---for easier sorting by Eigen values.
            double[] evcTemp = new double[n];
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                    evcTemp[j] = Evecs[j, i];
                EVList.Add(new EvEvec(Evals[i], evcTemp, n));
            }
            EVList.Sort(); // sorts, highest Eigen value in pos. 0
        }
Exemplo n.º 5
0
        /// <summary>
        /// After solving the GEVP, we have N eigenvectors forming the new basis. Retrieves the numEigenVectors (e.g. 20) eigenvectors corresponding
        /// to the highest eigenvalues.
        /// </summary>
        /// <param name="Decomposition"> Decompositon of GEVP</param>
        /// <param name="numEigenVectors"> Desire subset of most significant eigen vectors</param>
        /// <returns></returns>
        public IMatrix GetDesiredCountEigenvector(IEigenvalueDecomposition Decomposition, int numEigenVectors)
        {
            double[] eigenVector      = new double[Decomposition.EigenvectorMatrix.Rows];
            int      eigenvaluesCount = Decomposition.RealEigenvalues.Length;
            IMatrix  Res = new Matrix(Decomposition.EigenvectorMatrix.Rows, numEigenVectors);
            int      k   = 0;

            for (int j = eigenvaluesCount - 1; j > eigenvaluesCount - numEigenVectors - 1; j--)
            {
                double sum = 0.0;
                for (int i = 0; i < eigenVector.Length; i++)
                {
                    eigenVector[i] = Decomposition.EigenvectorMatrix[i, j];
                    sum           += eigenVector[i] * eigenVector[i];
                    Res[i, k]      = Decomposition.EigenvectorMatrix[i, j];
                }
                k++;
                EigenVectorList.Add(eigenVector);
            }
            return(Res);
        }
Exemplo n.º 6
0
    public static void Main(String[] args)
    {
        IMatrix A = new Matrix(3, 3);

        A[0, 0] = 2.0; A[0, 1] = 1.0; A[0, 2] = 2.0;
        A[1, 0] = 1.0; A[1, 1] = 4.0; A[1, 2] = 0.0;
        A[2, 0] = 2.0; A[2, 1] = 0.0; A[2, 2] = 8.0;

        Console.WriteLine("A = ");
        Console.WriteLine(A.ToString());

        Console.WriteLine("A.Determinant = " + A.Determinant);
        Console.WriteLine("A.Trace = " + A.Trace);
        Console.WriteLine("A.Norm1 = " + A.Norm1);
        Console.WriteLine("A.NormInfinite = " + A.InfinityNorm);
        Console.WriteLine("A.NormFrobenius = " + A.FrobeniusNorm);

        ISingularValueDecomposition svg = A.GetSingularValueDecomposition();

        Console.WriteLine("A.Norm2 = " + svg.Norm2);
        Console.WriteLine("A.Condition = " + svg.Condition);
        Console.WriteLine("A.Rank = " + svg.Rank);
        Console.WriteLine();

        Console.WriteLine("A.Transpose = ");
        Console.WriteLine(A.Transpose().ToString());

        Console.WriteLine("A.Inverse = ");
        Console.WriteLine(A.Inverse.ToString());

        IMatrix I = A.Multiply(A.Inverse);

        Console.WriteLine("I = A * A.Inverse = ");
        Console.WriteLine(I.ToString());

        IMatrix B = new Matrix(3, 3);

        Console.WriteLine("B = ");
        B[0, 0] = 2.0; B[0, 1] = 0.0; B[0, 2] = 0.0;
        B[1, 0] = 1.0; B[1, 1] = 0.0; B[1, 2] = 0.0;
        B[2, 0] = 2.0; B[2, 1] = 0.0; B[2, 2] = 0.0;

        Console.WriteLine(B.ToString());

        IMatrix X = A.Solve(B);

        Console.WriteLine("A.Solve(B)");
        Console.WriteLine(X.ToString());

        IMatrix T = A.Multiply(X);

        Console.WriteLine("A * A.Solve(B) = B = ");
        Console.WriteLine(T.ToString());

        Console.WriteLine("A = V * D * V");

        IEigenvalueDecomposition eigen = A.GetEigenvalueDecomposition();

        Console.WriteLine("D = ");
        Console.WriteLine(eigen.DiagonalMatrix.ToString());

        Console.WriteLine("lambda = ");
        foreach (double eigenvalue in eigen.RealEigenvalues)
        {
            Console.WriteLine(eigenvalue);
        }
        Console.WriteLine();

        Console.WriteLine("V = ");
        Console.WriteLine(eigen.EigenvectorMatrix);

        Console.WriteLine("V * D * V' = ");
        Console.WriteLine(eigen.EigenvectorMatrix.Multiply(eigen.DiagonalMatrix).Multiply(eigen.EigenvectorMatrix.Transpose()));

        Console.WriteLine("A * V = ");
        Console.WriteLine(A.Multiply(eigen.EigenvectorMatrix));

        Console.WriteLine("V * D = ");
        Console.WriteLine(eigen.EigenvectorMatrix.Multiply(eigen.DiagonalMatrix));
    }