我正在使用 Matlab 命令fitcdiscr来实现具有 379 个功能和 8 个类的 LDA。我想获得每个特征的全局权重,以研究它们对预测的影响。如何从 ClassificationDiscriminant 对象的 Coeffs 字段中的成对(对于每对类)系数中获得它?
问问题
304 次
1 回答
1
看起来fitcdiscr
不输出特征值或特征向量。
我不会在这里解释什么是特征向量和特征值,因为网上有很多文档。但基本上产生的特征向量将确定最大化每个类之间距离的轴。
我写了一个最小的(受这篇优秀文章的启发)示例,输出它们:
% We load the fisheriris dataset
load fisheriris
feature = meas; % 150x4 array
class = species; % 150x1 cell
% Extract unique class and the corresponding index for each feature.
[ucl,~,idc] = unique(class);
% Number of parameter and number of class
np = size(meas,2);
nc = length(ucl);
% Mean by class
MBC = splitapply(@mean,feature,idc);
% Compute the Within class Scatter Matrix WSM
WSM = zeros(np);
for ii = 1:nc
FM = feature(idc==ii,:)-MBC(ii,:);
WSM = WSM + FM.'*FM;
end
WSM
% Compute the Between class Scatter Matrix
BSM = zeros(np);
GPC = accumarray(idc,ones(size(classe)));
for ii = 1:nc
BSM = BSM + GPC(ii)*((MBC(ii,:)-mean(feature)).'*(MBC(ii,:)-mean(feature)));
end
BSM
% Now we compute the eigenvalues and the eigenvectors
[eig_vec,eig_val] = eig(inv(WSM)*BSM)
% Compute the new feature:
new_feature = feature*eig_vec
和:
eig_vec =
[-0.2087 -0.0065 0.7666 -0.4924 % -> feature 1
-0.3862 -0.5866 -0.0839 0.4417 % -> feature 2
0.5540 0.2526 -0.0291 0.2875 % -> feature 3
0.7074 -0.7695 -0.6359 -0.5699] % -> feature 4
% So the first new feature is a linear combination of
% -0.2087*feature1 + -0.3862*feature2 + 0.5540*feature3 + 0.7074*feature4
eig_val =
[ 32.1919 % eigen value of the new feature 1
0.2854 % eigen value of the new feature 2
0.0000 % eigen value of the new feature 3
-0.0000] % eigen value of the new feature 4
在这种情况下,我们有 4 个特征,这是这 4 个特征的直方图(1 类 = 1 种颜色):
如果我们想区分不同的类,我们看到特征 3 和 4 非常好,但并不完美。
现在,在 LDA 之后,我们有了这些新功能:
我们看到几乎所有的信息都收集在第一个新功能(新功能 1)中。所有其他功能都非常无用,因此只保留new feature 1
并删除另一个。我们现在有一个 1D 数据集而不是 4D 数据集。
于 2020-11-03T15:11:10.600 回答