4

我的原件data是一个195x22记录集,其中包含对是否患有帕金森病的人的声音测量。在一个向量中195x1,我有一个status1/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');

点击查看图片

更新(解决方案):

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

有了这张漂亮的图表:

在此处输入图像描述

4

1 回答 1

4

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

biplot 缩放分数以使其适合绘图:它将每个分数除以所有分数的最大绝对值,然后乘以 coefs 的最大系数长度。然后 biplot 根据 coefs 的符号约定更改分数坐标的符号。

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

这是使用ObsLabels选项的解决方法biplotObsLabels为每个观察分配一些用户定义的数据:对于每个点,我们将分配对应于一个status变量的索引(一个简单的递增值)。biplot有了这个,您可以轻松地修改 a - 这里的红点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
于 2013-09-27T15:14:15.993 回答