この記事では,散布図とそこから連想される9つの図を紹介します.
皆さんの知識として,あるいは思考を豊かにする一助として,お役に立てれば幸いです.
プログラム言語は,MATLABです.以下のプログラムで図の作成をしています.
rng('default');
for i = 1 : 3
x = rand(20,1); y = rand(20,1);
// ---図の描画処理---
end
2次元平面上にランダムに分布する点群を利用して図を作成します.図を3パターン作成し,掲載します.
図毎に,描画するMATLABプログラムと結果の図を掲載します.
scatter(x,y,'r','filled');
点群から考えられる,最も基本的な図です.赤点がデータ点を表します.
以降の図でも,これらの点は必ず描画します.
G = graph(ones(20));
plot(G,'XData',x,'YData',y,'NodeLabel',{});
全ての点を線で結んだ図です.
[~,C] = pdist2([x,y],[x,y],'euclidean','Smallest',2);
G = digraph(C(1,:),C(2,:));
plot(G,'XData',x,'YData',y,'NodeLabel',{});
上は各点の最近傍点,下は各点の第二近傍点までを表す図です.
派生形として,無向グラフ,距離の重み付きグラフが考えられます.
この記事では,ユークリッド空間,ユークリッド距離のみ考えます.
プログラムは,MathWorks社のページを参考にしました.
点の数が少ない場合は,Dynamic Programmingの利用をお勧めします.
巡回セールスマン問題の解です.NP困難であり,点の数が多くなると厳密解の獲得が困難です.
[X,Y] = meshgrid(0:0.01:1);
[~,C] = kmeans([x,y],5,'MaxIter',1000);
idx = kmeans([X(:),Y(:)],5,'MaxIter',0,'Start',C);
gscatter(X(:),Y(:),idx);
scatter(C(:,1),C(:,2),'k');
クラスタリングの代表として,k-meansを利用して空間を5つに分割した結果を載せています.
派生形として.分割数を変更した図,距離の閾値で分割した図が考えられます.
voronoi(x,y);
ボロノイ図です.点の数だけ空間を分割します.
triplot(delaunayTriangulation(x,y));
ドロネー図です.ドロネー三角形分割図など,表記ゆれがあります.
k = convhull(x,y);
plot(x(k),y(k));
凸包です.輪ゴムで締めた形と言われたりします.
k = boundary(x,y);
plot(x(k),y(k));
縮小係数というパラメータが存在します.既定値は0.5で,その値を0.3,0.8にすると以下の結果が得られます.
上の図は,縮小係数を0.3に小さくしたため,境界内部の面積が大きくなります.
下の図は,縮小係数を0.8に大きくしたため,境界内部の面積が小さくなります.
plot(alphaShape(x,y));
アルファ半径というパラメータが存在します.既定値は,すべての点を囲むアルファ形状を生成する最小値です.その値を0.5倍,1.5倍にすると以下の結果が得られます.
上の図は,アルファ半径を0.5倍したため,緑色の面積が小さくなります.
下の図は,アルファ半径を1.5倍したため,緑色の面積が大きくなります.
アルファシェイプ,アルファ形状,α-shapeなど,表記ゆれがあります.
この記事では,散布図とそこから連想される9つの図を紹介しました.9つの図は,グラフネットワークの図,クラスタリングの図,計算幾何学の図など細かく分けられることが多いです.分野を横断する形で,これらの図をまとめて紹介することは価値があると思い,記事を執筆しました.皆さんにとって価値ある記事になることを願っています.
最後に,アルファシェイプに関する日本語の参考文献を1つ紹介します.9つの図の中でアルファシェイプが最も知名度が低く,日本語の資料が少ないので参考になると思います.図3-5は,アルファシェイプが関係する図です.図19と付録は,アルファシェイプのことだけ書いてあります.
以上です.