PCA Biplot-Matlab

时间:2019-07-04 17:03:44

标签: matlab pca

根据答案 Unable to create an array from a tableColoring The Dots in biPlot Chart我写了下面的代码。 如何更改图例以显示clusters = Tb.class(虹膜种类),如何凸包每个组?

代码:

clc;
clear;
close all;

Tb = webread('https://datahub.io/machine-learning/iris/r/iris.csv');
clusters = Tb.class;

X = [Tb.sepallength Tb.sepalwidth   Tb.petallength  Tb.petalwidth ];

Z = zscore(X); % Standardized data
[coefs,score] = pca(Z);

vbls = {'sepallength','sepalwidth','petallength','petalwidth'}; 
h=biplot(coefs(:,1:2),'Scores',score(:,1:2),'VarLabels',vbls);

hID = get(h, 'tag'); 
% Isolate handles to scatter points
hPt = h(strcmp(hID,'obsmarker')); 
% Identify cluster groups
grp = findgroups(clusters);    %r2015b or later - leave comment if you need an alternative
grp(isnan(grp)) = max(grp(~isnan(grp)))+1; 
grpID = 1:max(grp); 
% assign colors and legend display name
clrMap = lines(length(unique(grp)));   % using 'lines' colormap
for i = 1:max(grp)
    set(hPt(grp==i), 'Color', clrMap(i,:), 'DisplayName', sprintf('Cluster %d', grpID(i)))
end
% add legend to identify cluster
[~, unqIdx] = unique(grp);
legend(hPt(unqIdx)) 

1 个答案:

答案 0 :(得分:0)

1)对于传奇,您可以按如下方式简单地使用群集名称:

$("body").mousemove(function(e) {
    console.log('position of ghost image: ' + e.pageX + ', ' + e.pageY;
})

2)对于凸包部分,您可以使用2D正态分布的unqClusters = unique(clusters); for i = 1:max(grp) % Original legend showing "Cluster n" %set(hPt(grp==i), 'Color', clrMap(i,:), 'DisplayName', sprintf('Cluster %d', grpID(i))) % New legend showing the flower class name set(hPt(grp==i), 'Color', clrMap(i,:), 'DisplayName', sprintf('%s', unqClusters{i})) end

这是一个适用于前两个原始PC得分的代码,您需要适应contour函数执行的标准化

代码实际上遍历每个群集,计算前两个PC值的均值和协方差,并将这些值用作2D正态分布的参数,其2D正态分布的PDF是在网格上计算的。最后,选择一个选定的2D PDF级别值进行绘图,这将导致一个椭圆形覆盖簇中的大多数点。

bitplot

将生成以下图形: Points With Ellipses