1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

デコポンの皮の呪い(相関がある多次元データ)

Last updated at Posted at 2023-12-05

・ 相関がある高次元データの様子
・ ガウス分布(正規分布)で作成
・ 可視化してみる

「メロンの皮の呪い」(互いに独立した正規分布の多変量)
https://qiita.com/emikosh/items/f74bf489851f0fb110f2

前回に引き続き、デコポンの皮の呪いも見てみました

前回は、相関がないガウス分布(正規分布)でデータの距離を計算してみましたが、今回は、がんばって、相関があるデータの皮の厚みが変わるか?を可視化してみました


球面化

変数どうしの間に相関があると、当然、ある変数で0に近いところの観測点は、他の変数でも0に近いところにいるわけで、そうそう中身(=中心に近いとこ)がスカスカにならないでしょ、ということでどうなんでしょう?


実際に作ってみました

gif movie of distribution of d

独立した正規分布の場合と結構違いますねー。最後のほうがあんまり動かなくて、分散だけ大きくなっているのは、相関行列に使ったレーマー(Lehmer)配列の形が、次元が大きくなるとほぼいっしょになっちゃっているからですかね。


gif movie of ircular image of d

そして、円を描いてみると、最初はドーナツ状なんですが、終わりのほうは皮が厚めですね しかも、分散が大きいので中のほうにもけっこう観測点があるという 

皮が厚めなので、今回題名をメロンではなく「デコポン」にしておきました!

レーマー配列


arry of lehmer

さて、今回レーマー配列というものを使いましたが、最初、相関行列なんて簡単につくれるんじゃない?って、あんまり考えてなかったんですね

ところがどっこい、行列を作ってデータを作成する段になって、いきなりエラーに
こう言われまして 

相関行列は「半正定値行列」でないといけないよ!

で、なにそれ?半正定値行列ってどうやって作ればいいの?とちょっとwikiを見て、ああ、行列計算!

そりゃそうだ A変数とB変数と相関があって、B変数がC変数とも相関があったら、A変数とC変数も相関がないといけないわよね

めんどいことが(超)嫌いなので、すでにここであきらめモードでしたが、そのまま調べ続けたらレーマー配列というのを使えばいいそうで、それでとりあえず作ってみました 

ああ、よかった。

比較的簡単に計算できるみたいですが、今回はサンプルを拝借しました 
レーマー行列の中身はこちらで↓


Decopom.m

% デコポンの皮(次元の呪い)の可視化
% 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個)が少ないときにそうなっちゃうみたいですね 高次元特有の現象ですね

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?