0

http://jeremykun.com/2011/07/27/eigenfaces/のチュートリアルに従っています。Jama Linear Algebra パッケージを使用して、Java でこのソリューションを実装しようとしています。

共分散行列の計算に行き詰まっています。すべての differenceVectors を計算し、それぞれを「マトリックス」に格納しました。ただし、これらを共分散行列に変換する方法がわかりません。

Javaでこれを行うにはどうすればよいですか?

4

3 に答える 3

1

あなたが欠けているのは

ここに画像の説明を入力

これは次のように計算されます。

ここに画像の説明を入力

これは、次の 2 つのことだけが必要であることを意味します。

  • 差分ベクトルの行列を乗算します (平均からの偏差)

  • 結果に 1 / (N - 1) を掛けます。注: サンプルから偏りのない推定値を得るには N - 1


このスプレッドシートの例を作成して、それを段階的に行う方法を示しました。

于 2014-03-14T11:38:58.857 に答える
0

このようなことを行うことができます (jama をインポートしているマトリックスを処理するため)。実際にはJavaのこの機能に問題があったため、固有顔は以下に実装されています。

private static void evaluateEigenface(int M,int N,Matrix x,double[] average,double[] eigenvalues,Matrix eigenfaces){

        // x is (widthProcessedImage*heightProcessedImage)X(numberProcessedImages);

        Matrix w=new Matrix(M,N,0.0);

        for(int i=0;i<M;i++){
            average[i]=0;
            for(int j=0;j<N;j++){
                average[i]=average[i]+x.get(i,j);
            }
            average[i]=average[i]/((double)N);
            //System.out.println(average[i]);
        }


        for(int i=0;i<M;i++){
            for(int j=0;j<N;j++){
                w.set(i, j, x.get(i,j)-average[i]);
            }
        }

        Matrix auxMat=w.transpose().times(w); // =w'*w

        SingularValueDecomposition SVD =  new SingularValueDecomposition(auxMat);
        double[] mu = SVD.getSingularValues(); // Eigenvalues of w'w
        Matrix d=SVD.getU(); // LeftSingularVectors of w'w => Each column is an eigenvector
        Matrix e=w.times(d); // Eigenvector of ww'

        for(int i=0;i<N;i++)eigenvalues[i]=mu[i];

        double theNorm;
        double[] auxArray=new double[M];
        for(int i=0;i<N;i++){
            for(int j=0;j<M;j++)auxArray[j]=e.get(j,i);
            theNorm=norma2(M,auxArray);
            for(int j=0;j<M;j++)eigenfaces.set(j,i, e.get(j, i)/theNorm); // eigenfaces are the normalized eigenvectors of ww'
        }

    }
于 2014-03-14T10:39:31.900 に答える