我的原始 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)
信息来找出哪个点属于一个类别。
这是使用 ObsLabels
的 biplot
选项的解决方法。 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/