Up

次元の呪いデモプログラム

 

次元の呪い(The curse of dimensionality)と呼ばれている高次元空間における現象があるが、デモ用プログラムを分布、および距離Pythonで作成してみた。

 

確率分布

 

一様分布する点の配置が、次元を上げていくと壁に近いものが増加するという現象が指摘されている。この現象を確認するために、次元数の空間において点の各座標値が独立に一様分布に従うようにサンプリングを行った。いずれかの座標値が壁から0.1以内、すなわちまたはのとき、壁に近いと見なし、その比率を数えるプログラムを以下のように作成した。

import numpy as np

import numpy.random as nr

import matplotlib.pyplot as plt

 

def check(v):

    ck = 0

    for t in v:

        if t < 0.1 or t > 0.9:

            ck = 1

    return ck

 

n = 10000

p_ck = []

p_model = []

d_range = [1, 2, 3, 5, 10, 25, 50]

for d in d_range:

    data = nr.rand(n, d)

    counts = np.array([check(v) for v in data])

    p_ck.append(counts.mean())

    print(d,  p_ck[-1])

    p_model.append(1.0 - 0.8**d)

   

plt.plot(d_range, p_ck, 'b-', linewidth = 2, label = 'Simulation')

plt.plot(d_range, p_model, 'g--', linewidth = 3, label = 'Model')

plt.xlabel('Number of Dimensions', fontsize = 14)

plt.ylabel('Prob. of being near-wall', fontsize = 14)

plt.legend(loc = 'lower right', fontsize = 16)

plt.show()

 

実行すると図1の結果を得る。

図1

 

横軸が次元数、縦軸が点の位置が壁に近い確率である。シミュレーションは点を一様乱数により発生して、壁に近いものの比率を数えたものであるが、モデルは以下のように導かれる。

点が壁の近くにある確率は、まず点が壁から離れた位置にある確率を求めて、その補事象の確率として求める。

点が壁から離れている確率は、各次元については

である。各次元の座標値が独立であるので、点が壁から離れている、すなわち各次元において端点から離れている確率の積

で与えられる。これより、点が壁の近くにある確率は

で与えられる。

 

距 離

 

2点をランダムにとったとき、その距離は次元が高くなると増大する傾向にある。この現象を確認するために、次元数の空間において2点およびの各座標値およびが独立に一様分布に従うようにサンプリングを行った。サンプリングされた2点の距離および距離の2乗を求め、それぞれの平均値を算出し、グラフを描くプログラムを以下のように作成した。

import numpy as np

import numpy.random as nr

import matplotlib.pyplot as plt

 

n = 1000000

d_range = [1, 2, 3, 5, 10, 25, 50]

d_sqr_model = []

d_sqr_ck = []

d_sqrt = []

for d in d_range:

    data1 = nr.rand(n, d)

    data2 = nr.rand(n, d)

    sqr_m = ((data1 - data2) ** 2).sum(axis = 1).mean()

    d_sqr_ck.append(sqr_m)

    d_sqr_model.append(d/6)

    sqrt_m = ((((data1 - data2) ** 2).sum(axis = 1)) ** 0.5).mean()

    d_sqrt.append(sqrt_m)

    print(d, sqr_m, sqrt_m)

 

plt.plot(d_range, d_sqr_model, 'b-', label = 'Dist**2-Model')

plt.plot(d_range, d_sqr_ck, 'g--', linewidth = 3, label = 'Dist**2-Simulation')

plt.plot(d_range, d_sqrt, 'm-', label = 'Dist.-Simulation')

plt.xlabel('Number of Dimensions', fontsize = 14)

plt.ylabel('Dist. or Dist.**2', fontsize = 14)

plt.legend(loc = 'upper left', fontsize = 16)

plt.show()   

 

このプログラムを実行すると、図2のグラフが表示される。

図2

 

図2におけるモデルの値は、以下のように計算される。

2点間の距離の2乗は

で与えられる。点の座標値はランダムに独立に採られているので、はお互いに独立である。

座標値は独立に一様分布から採られているので、

である。これより、

を得る。

 

Up