・ 相関がある高次元データの様子
・ ガウス分布(正規分布)で作成
・ 可視化してみる
「メロンの皮の呪い」(互いに独立した正規分布の多変量)
https://qiita.com/emikosh/items/f74bf489851f0fb110f2
前回に引き続き、デコポンの皮の呪いも見てみました
前回は、相関がないガウス分布(正規分布)でデータの距離を計算してみましたが、今回は、がんばって、相関があるデータの皮の厚みが変わるか?を可視化してみました
球面化
変数どうしの間に相関があると、当然、ある変数で0に近いところの観測点は、他の変数でも0に近いところにいるわけで、そうそう中身(=中心に近いとこ)がスカスカにならないでしょ、ということでどうなんでしょう?
実際に作ってみました
独立した正規分布の場合と結構違いますねー。最後のほうがあんまり動かなくて、分散だけ大きくなっているのは、相関行列に使ったレーマー(Lehmer)配列の形が、次元が大きくなるとほぼいっしょになっちゃっているからですかね。
そして、円を描いてみると、最初はドーナツ状なんですが、終わりのほうは皮が厚めですね しかも、分散が大きいので中のほうにもけっこう観測点があるという
皮が厚めなので、今回題名をメロンではなく「デコポン」にしておきました!
レーマー配列
さて、今回レーマー配列というものを使いましたが、最初、相関行列なんて簡単につくれるんじゃない?って、あんまり考えてなかったんですね
ところがどっこい、行列を作ってデータを作成する段になって、いきなりエラーに
こう言われまして
相関行列は「半正定値行列」でないといけないよ!
で、なにそれ?半正定値行列ってどうやって作ればいいの?とちょっとwikiを見て、ああ、行列計算!
そりゃそうだ A変数とB変数と相関があって、B変数がC変数とも相関があったら、A変数とC変数も相関がないといけないわよね
めんどいことが(超)嫌いなので、すでにここであきらめモードでしたが、そのまま調べ続けたらレーマー配列というのを使えばいいそうで、それでとりあえず作ってみました
ああ、よかった。
比較的簡単に計算できるみたいですが、今回はサンプルを拝借しました
レーマー行列の中身はこちらで↓
% デコポンの皮(次元の呪い)の可視化
% R2023b Matlab
% with Statistics and Machine Learning Toolbox
clear;
close all;
n = 100;
s = 1000;
rng();
% https://jp.mathworks.com/help/matlab/ref/gallery.html
a = gallery("lehmer", n);
mu = zeros(1, n);
R = mvnrnd(mu, a, s);
% https://jp.mathworks.com/help/stats/gplotmatrix.html#mw_55c0c754-d26e-491e-beac-4ac18cb15a95
gplotmatrix(R(:,1:4),[]) ;
% 原点からの距離の計算
d = zeros(s, 1);
for m = 1:s
d(m) = norm(R(m, :));
end
figure;
c = 0:1:40;
histogram(d, c);
hold on;
md = mean(d);
st = std(d);
ax = gca;
ax.LineWidth = 1;
ax.FontSize = 14;
yL = ax.YLim;
plot([md, md], yL, '-m', 'LineWidth', 1.5);
plot([md - st, md - st], yL, '--m', 'LineWidth', 1.5);
plot([md + st, md + st], yL, '--m', 'LineWidth', 1.5);
% 注:subspace関数には列ベクトルの形で入力する
% 角度が小さすぎるので、+ rand(1,1) * Pi * 2 で見た目は円に
theta = zeros(s,1);
v1 = R(1, :);
for k= 1: s
theta(k) = subspace(R(k,:)', v1') + rand(1,1) * pi * 2 ;
end
X = d .* cos(theta);
Y = d.*sin(theta);
figure;
plot(X,Y, '.');
axis equal;
ylim([-100, 100]);
ax = gca;
ax.LineWidth = 1;
ax.FontSize = 14;
ここでは相関があるデータを使いましたが、実データの場合で「球面化」というのは、データを固有空間に持っていったときに(超)球面上に観測点が乗ってくることです 次元(例えば400個)に比べてデータ数(例えば10個)が少ないときにそうなっちゃうみたいですね 高次元特有の現象ですね