【问题标题】:How to display the similarity between classes?如何显示类之间的相似度?
【发布时间】:2016-03-04 01:44:25
【问题描述】:

我有两位作家的手写样本。我正在使用特征提取器从两者中提取特征。

我想显示类之间的相似性。以显示两者的相同程度以及分类器正确分类它们的难度。

我已经阅读了使用 PCA 来证明这一点的论文。我尝试使用 PCA,但我认为我没有正确实现这一点。我用它来显示相似度。

[COEFF,SCORE] = princomp(features_extracted);
plot(COEFF,'.')

但是对于每个班级和每个样本,我都会得到完全相同的情节。我的意思是它们应该相似而不是完全相同。我做错了什么?

【问题讨论】:

  • 每个班级有多少功能?使用 PCA,您可以将特征空间转换为新的“pca”空间。您正在绘制的是用于将特征转换为新特征空间的系数,而不是转换后的特征。请记住,PCA 是一种无监督方法,它只是在数据中找到方差最大的向量,仅此而已。这可能表明可分离性,但可能不是。要获得实际转换后的特征,请使用transformed = features_extracted * COEFF
  • 然后你可以将前两个特征之间的关系绘制为scatter(transformed(:, 1), transformed(: 2))。另外,请记住,features_extracted 中的数据应该是高斯分布的,具有零均值、单位方差(如果不是完美的高斯分布也可以,但它必须是零均值、单位方差每个特征的差异)。
  • 最后,确保features_extracted 的格式设置为每一行是一个观察,每一列是一个特征。
  • 但是,请记住,当您只有两个样本时,PCA 并不是一个真正合适的工具。
  • 虽然我可能误解了你的数据——如果你能给我们一些更多的细节会很有帮助。您显然有两个类,但每个类有多少样本,每个样本有多少特征?

标签: matlab classification correlation pca


【解决方案1】:

每个类只有 10 个样本和 4000 多个特征,您将很难展示任何重要的东西。

尽管如此,以下代码将计算 PCA 并显示前两个主成分(包含“最多”方差的成分)之间的关系。

% Truly indistinguishable data
dummy_data = randn(20, 4000);

% Uncomment this to make the data distinguishable
%dummy_data(1:10, :) = dummy_data(1:10, :) - 0.5;

% Normalise the data - this isn't technically required for the dummy data
% above, but is included for completeness.
dummy_data_normalised = dummy_data;
for f = 1:size(a, 2)
    dummy_data_normalised(:, f) = dummy_data_normalised(:, f) - nanmean(dummy_data_normalised(:, f));
    dummy_data_normalised(:, f) = dummy_data_normalised(:, f) / nanstd(dummy_data_normalised(:, f));
end

% Generate vector of 10 0's and 10 1's
class_labels = reshape(repmat([0 1], 10, 1), 20, 1);

% Perform PCA
pca_coeffs = pca(dummy_data_normalised);

% Calculate transformed data
dummy_data_pca = dummy_data_normalised * pca_coeffs;

figure;
hold on;

for class = unique(class_labels)'
    % Plot first two components of first class
    scatter(dummy_data_pca(class_labels == class, 1), dummy_data_pca(class_labels == class, 2), 'filled')
end

legend(strcat({'Class '},int2str(unique(class_labels)))')

对于无法区分的数据,这将显示类似于以下的散点图:

显然不可能在两个类之间画出分隔边界。

如果您取消注释第五行以使数据可区分,则绘图将改为如下所示:

但是,重复我在评论中所写的内容,PCA 并不一定会找到提供最佳分离的组件。它是一种无监督方法,只找到方差最大的分量。在某些应用中,这也是提供良好分离的组件。每个类只有 10 个样本,您将无法证明任何具有统计意义的东西。另请查看this question,了解有关 PCA 和每类样本数量的更多详细信息。

编辑:这也自然扩展到拥有更多类:

numer_of_classes = 10;
samples_per_class = 20;

% Truly indistinguishable data
dummy_data = randn(numer_of_classes * samples_per_class, 4000);

% Make the data distinguishable
for i = 1:numer_of_classes
    ixd = (((i - 1) * samples_per_class) + 1):(i * samples_per_class);
    dummy_data(ixd, :) = dummy_data(ixd, :) - (0.5 * (i - 1));
end

% Normalise the data
dummy_data_normalised = dummy_data;
for f = 1:size(a, 2)
    dummy_data_normalised(:, f) = dummy_data_normalised(:, f) - nanmean(dummy_data_normalised(:, f));
    dummy_data_normalised(:, f) = dummy_data_normalised(:, f) / nanstd(dummy_data_normalised(:, f));
end

% Generate vector of classes (1 to numer_of_classes)
class_labels = reshape(repmat(1:numer_of_classes, samples_per_class, 1), numer_of_classes * samples_per_class, 1);

% Perform PCA
pca_coeffs = pca(dummy_data_normalised);

% Calculate transformed data
dummy_data_pca = dummy_data_normalised * pca_coeffs;

figure;
hold on;

for class = unique(class_labels)'
    % Plot first two components of first class
    scatter(dummy_data_pca(class_labels == class, 1), dummy_data_pca(class_labels == class, 2), 'filled')
end

legend(strcat({'Class '},int2str(unique(class_labels)))')

【讨论】:

  • 非常感谢您提供如此详细的回复。
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 2011-08-27
  • 2016-05-29
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多