为什么LDA中的特征向量和特征值会变成零?

27

我希望在OpenCV中实现快速PLDA(概率线性判别分析)。在此,链接已经使用 Matlab Python 实现了快速PLDA。PLDA的一部分是LDA。我已经编写了以下代码来在OpenCV中实现LDA:

int LDA_dim = 120;

// Load data

FileStorage fs("newStorageFile.yml", FileStorage::READ);

// Read data

Mat train_data, train_labels;

fs["train_data"] >> train_data;
fs["train_labels"] >> train_labels;

// LDA

if (LDA_dim > 0)
{
    LDA lda(LDA_dim);
    lda.compute(train_data, train_labels);          // compute eigenvectors

    Mat eigenvectors = lda.eigenvectors();
}

我已将上述链接中介绍的数据库从 .mat 转换为 .yml。结果是 newStorageFile.yml,我在这里上传了它。 train_data 具有 650 行和 600 列,而 train_labels 具有 650 行和 1 列。 我不知道为什么特征向量和特征值会变成零!!?请帮我修复这段代码。

最好带上将数据从 .mat 转换为 .yml 的代码:

function matlab2opencv( variable, fileName, flag)

[rows cols] = size(variable);

% Beware of Matlab's linear indexing
variable = variable';

% Write mode as default
if ( ~exist('flag','var') )
    flag = 'w'; 
end

if ( ~exist(fileName,'file') || flag == 'w' )
    % New file or write mode specified 
    file = fopen( fileName, 'w');
    fprintf( file, '%%YAML:1.0\n');
else
    % Append mode
    file = fopen( fileName, 'a');
end

% Write variable header
fprintf( file, '    %s: !!opencv-matrix\n', inputname(1));
fprintf( file, '        rows: %d\n', rows);
fprintf( file, '        cols: %d\n', cols);
fprintf( file, '        dt: f\n');
fprintf( file, '        data: [ ');

% Write variable data
for i=1:rows*cols
    fprintf( file, '%.6f', variable(i));
    if (i == rows*cols), break, end
    fprintf( file, ', ');
    if mod(i+1,4) == 0
        fprintf( file, '\n            ');
    end
end

fprintf( file, ']\n');

fclose(file);

编辑1)我已经尝试过一些我自己生成的示例使用LDA:

Mat train_data = (Mat_<double>(3, 3) << 25, 45, 44, 403, 607, 494, 2900, 5900, 2200);
    Mat train_labels = (Mat_<int>(3, 1) << 1, 2, 3 );

    LDA lda(LDA_dim);

    lda.compute(train_data, train_labels);          // compute eigenvectors
    Mat_<double> eigenvectors = lda.eigenvectors();
    Mat_<double> eigenvalues = lda.eigenvalues();
    cout << eigenvectors << endl << eigenvalues;

但是我得到了相同的结果:特征值和特征向量都变成了零: 特征向量和特征值


1
@bytefish,既然您在OpenCV中开发了LDA,我想您可以帮助我... - Saeid
你找到这个问题的解决方案了吗?我在这里遇到了同样的问题,我保存了lda.yml文件,但是当我打开文件时,所有向量都是0.0。 - Amir
@Amir,不,我已经改变了我的算法!! - Saeid
3
首先,数学上特征向量不能为零(特征值可以为零)。其次,特征向量和特征值是定义在方阵上的。对于非方阵,奇异值会被用来定义。你展示了三个向量 (0,0)、(1,0) 和 (0,1),以及两个特征值 0 和 0。 - Jose Maria
1个回答

1
由于浮点数不精确,特征值接近于零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接