我的原始 data 是一个 195x22 记录集,其中包含对患有或未患有帕金森病的人的声音测量。在向量 195x1 中,我有一个 status 要么是 1/0。

现在,我已经执行了 PCA 并且我做了一个 biplot ,结果很好。问题是我无法从我的散点图来源中分辨出病人或健康人的哪些点(我无法将它与 status 联系起来)。我希望我的散点图在健康(状态 = 0)和生病(状态 = 1)时有一个红点和绿色。

我该怎么做?我的双标代码是:

biplot(coeff(:,1:2), ...
    'Scores', score(:,1:2), ...
    'VarLabels', Labels, ...
    'markersize', 15 ...
);
xlabel('Bi-Plot: Standardized Data');
xlabel('PCA1');
ylabel('PCA2');

Click to view image

更新(解决方案):

解决方案的灵感来自@Magla,代码可以在这里看到:http://pastebin.com/KHUj3DnA

有了这个漂亮的图表:

最佳答案

biplot 中的主成分分数(红点)不是 pca 函数返回的分数。正如帮助所述,



因此,您不能轻松地使用 (X,Y) 信息来找出哪个点属于一个类别。

这是使用 ObsLabelsbiplot 选项的解决方法。 ObsLabels 为每个观察分配一些用户定义的数据:对于每个点,我们将分配对应于 status 变量的索引(一个简单的递增值)。有了这个,您可以轻松修改 biplot 的红点 - 此处 marker 设置为方形和红色/绿色。

下图

由这段代码产生

%some data
load carsmall
x = [Acceleration Displacement Horsepower MPG Weight]; x = x(all(~isnan(x),2),:);
[coefs,score] = pca(zscore(x));

%the status vector (here zero or one)
class_pt = round(rand(size(score,1),1));

vbls = {'Accel','Disp','HP','MPG','Wgt'};

figure('Color', 'w');
hbi = biplot(coefs(:,1:2),'scores',score(:,1:2),'varlabels',vbls,...
    'ObsLabels',num2str((1:size(score,1))'));

for ii = 1:length(hbi)
    userdata = get(hbi(ii), 'UserData');
    if ~isempty(userdata)
        if class_pt(userdata) == 0
            set(hbi(ii), 'Color', 'g', 'Marker', 's');

        elseif class_pt(userdata) == 1
            set(hbi(ii), 'Color', 'r', 'Marker', 's');
        end

    end
end

关于matlab - 在 Matlab 中配置 biplot 以区分散点图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19052317/

10-12 21:56