バイプロットで表示し​たデータの色分けを行​う方法(biplot​,pca)

28 views (last 30 days)
徹也 長島
徹也 長島 on 11 Nov 2022
Commented: 徹也 長島 on 23 Dec 2022
Matlab初心者です。
現在、データのクラスタリングを行い、得られた結果をPCAとバイプロットを用いて図示しようと悪戦苦闘しております。
下記の図にあるように,現在のコードでは全てのデータが赤色になってしまっています。
データをクラスターごとに色分けし,表示する方法がわかりません。
どうか知恵をお貸しいただけますでしょうか。
よろしくお願いいたします。
D=readmatrix("Test.xlsx");
[coeff,score,latent]=pca(D)
[idx,H,sumd]=kmeans(D,3,MaxIter=1000,Display="final",Replicates=5)
vbls = {'Depth','Sample','Ping','sea bottom mean','Length','Height','Perimeter','Area','BAmean','TAmean','Elongation','UNEVENNESS1','UNEVENNESS"','Lectangularity','Fractual demensiton','Circularity'};
figure
biplot(coeff(:,1:3),'scores',score(:,1:3),"VarLabels",vbls)

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 11 Nov 2022
Edited: Atsushi Ueno on 11 Nov 2022
  • 今回の添付データの場合、biplot関数の出力(グラフィックオブジェクト)は下記の様になります。
% h には 1013 個のオブジェクト ハンドルが含まれています
% ・ハンドル h( 1:16) は、16変数の line ハンドルに対応します
% ・ハンドル h(17:32) は、16変数のマーカー ハンドルに対応します
% ・ハンドル h(33:48) は、16変数のテキスト ハンドルに対応します
% ・ハンドル h(49:1012) は、観測値の line ハンドルに対応します
% ・ハンドル h(1013) は、座標軸の line ハンドルに対応します
  • kmeans関数の出力する「クラスター インデックス (idx)」を色付けのネタとして用いましたが、この値(今回の場合1~3)が実行の度に入れ替わってしまう難点があります。
D=readmatrix("Test.xlsx");
[coeff,score,latent]=pca(D);
[idx,H,sumd]=kmeans(D,3,MaxIter=1000,Display="final",Replicates=5);
Replicate 1, 19 iterations, total sum of distances = 10015.7. Replicate 2, 21 iterations, total sum of distances = 10017.1. Replicate 3, 20 iterations, total sum of distances = 10017.1. Replicate 4, 10 iterations, total sum of distances = 10014.8. Replicate 5, 11 iterations, total sum of distances = 10017.1. Best total sum of distances = 10014.8
vbls = {'Depth','Sample','Ping','sea bottom mean','Length','Height','Perimeter','Area','BAmean','TAmean','Elongation','UNEVENNESS1','UNEVENNESS"','Lectangularity','Fractual demensiton','Circularity'};
figure
h = biplot(coeff(:,1:3),'scores',score(:,1:3),"VarLabels",vbls); % 出力hを追記
% ここから下を追加
xlim([-0.1 0.5]); ylim([-0.1 0.5]); zlim([-0.5 0.3]); % 適当に範囲を調整
color = 'rgb'; % 適当な3色を作成
for k = 1:size(D,1)
h(k + size(D,2)*3).MarkerEdgeColor = color(idx(k)); % 各データを赤一色から赤緑青に変更
end
  1 Comment
徹也 長島
徹也 長島 on 23 Dec 2022
ありがとうございます。参考にさせていただきます!

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!