我在http://jeremykun.com/2011/07/27/eigenfaces/关注教程。 我正在尝试使用Jama Linear Algebra软件包在Java中实现此解决方案。
我坚持计算协方差矩阵。我计算了所有的差异,并将它们存储在一个' Matrix'中。但是,我不知道如何将这些变成协方差矩阵。
我如何最好地用Java做这件事?
答案 0 :(得分:1)
你缺少的是
计算方法如下:
乘以差异向量的矩阵(与平均值的偏差)
将结果乘以1 /(N - 1),注意:N - 1得到无偏 来自样本的估计
我创建了this spreadsheet example来说明如何逐步完成。
答案 1 :(得分: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'
}
}
答案 2 :(得分:0)