蛍光ペンの交差点[別館]

"どの点に関心をもつべきか ―をわれわれが学びとるのは,もっぱら仮説からだけである"

次元の呪い、あるいは「サクサクメロンパン問題」

超球の体積、すなわち多次元空間における球は、一般的に私たちが観測する3次元の球体の体積とは遥かに異質な性質を示すらしい。 

 

機械学習の有名な教科書によれば、

 Our geometrical intuitions, formed through a life spent in a space of three dimensions, can fail badly when we consider spaces of higher dimensionality.

拙訳: 我々の幾何学に関する直観は、3次元空間の中で過ごした人生の中で形成されたものだが、高次元空間を考えるときには、まるで役立たないことがある。

("パターン認識と機械学習 上", 原書, p.36)

 

... in spaces of high dimensionality, most of the volume of a sphere is concentrated in a thin shell near the surface!

拙訳: ...(中略)... 高次元空間においては、球の体積のほとんどが、球表面近くの薄い「殻」に集中しているのだ!

(同書, p.36)

 

とのことである。一般的には「次元の呪い」と呼ばれる現象だ*1

 

 

 

 

そして、先日この「殻」について、身悶えるほど鮮烈なイメージを与える具体例ツイッター上で観測した。 

 

 

 

 

 

メロンパンの皮。

 

 

確かにメロンパンの皮は、3次元空間では非常に薄っぺらなものでしかない。しかしそのメロンパンの皮の体積はn乗に比例して増加していくため、n次元空間では皮がメロンパンの大半を占めることになる。

 

なんということだ。超球とはメロンパンのことであったのだ。

 

しかし、肝心のこの偉大な事実に関する発見者は、

 

 

 

 

と言ったように、自身の発見がいかに素晴らしく価値のあるものであるか、それに見合った賞賛を受けていない。

 

 

ここでは、@mima_tea氏の発見がいかにヴィヴィッドなものであるかを、R言語による可視化を用いて表現してみたい。作成したコードは記事の末尾に掲載するので、先に出力画像から紹介していく。

 

 

 

まずは、3次元空間において、我々が普段目にしているメロンパンである。

 

 

 

 

 

 

f:id:koshka-j:20150702082142p:plain

 

 

うん。メロンパンだ。

 

 

左図では、茶色がn次元空間(ここではn=3)における皮の体積に、黄色がモチモチ部分の体積に対応するように面積を定めている。体積を面積で表現することで、直観がはたらきやすいように心がけた。3次元空間におけるメロンパンは、非常に美味しそうで、かぶりつけば今にもサクサクという音が耳に聞こえてきそうだ。

 

 

右図は、ヨコ軸が「メロンパンが存在する次元の次元数」、タテ軸が「皮がメロンパン全体に占める割合」を表す。●が左側で表現されたメロンパンが利用しているパラメータであり、ここで次元数が3,皮の割合が0.03なので「3%がサクサク」であると言える。

 

 

 

メロンパンの皮の厚みは、半径に対して1%に設定した。上の図からは、これが一般的なメロンパンの表現になっていることが推察される。以下では、これと同じパラメータを用いて、メロンパンの皮の挙動を調べていく。

 

 

 

 

続いて、30次元空間におけるメロンパンを見てみる。

 

 

 

 

 

f:id:koshka-j:20150702082146p:plain

 

 

 

 

これは…

 

 

 

 

高級なパン屋にいくと、メロンパンの皮部分が厚いクッキー生地で作られており、別々に焼かれて張り付けられていることがある。

 

30次元空間におけるメロンパンは、すなわちそのような高級メロンパンに近くなっていると言える。なんてお得なんだ。単にメロンパンを30次元空間に飛ばすだけで、サクサク感を全体の26%も楽しめる。

 

 

 

 

 

続いて、100次元空間におけるメロンパンを見てみる。

 

 

 

 

 

 

 

f:id:koshka-j:20150702082150p:plain

 

 

 

皮の割合が63%を超え、もはやメロンパンというよりクッキー状態である。
繰り返すが、「皮の厚み」を表す数値は3次元のときから変えていない。

 

半径のわずか1%のままである。それなのに、メロンパン全体に占める割合としては、すでに63%に達してしまっている。高次元空間においては、いかにメロンパンが我々の幾何学的な直観に反する食物になるかが伺いしれるだろう。

 

 

 

そして最後に、500次元空間における500次元メロンパンを見てみよう。

 

 

 

 

 

 

f:id:koshka-j:20150702082154p:plain

 

 

 

 

完全に皮になってしまった…。

これがいわゆる次元の呪い、すなわちサクサクメロンパン問題である。

高次元空間においては、面積が球表面に集まりすぎて、
メロンパンがサクサクになりすぎてしまうのである。 

 

 

おわりに

 

次元の呪いを、メロンパンによって観察することで、高次元空間における面積の挙動について直観を得ることができた。

 

次元の呪いは、MCMCなど近年のサンプリング技術の理解において非常に大事な基礎的事実であるので、このような直感的な説明を提案した@mima_tea氏に尊敬の意を表し、結びの言葉とする。

 

 

いつも心にメロンパン。

 

 

おしまい

 

 

 

使用したソースコード

 

if( require("ggplot2") == FALSE ) install.packages("ggplot2"); library(ggplot2)
dimensions <- 1:700
crisp_height <- .01
crisp_area <- rep(NA, length(dimensions))
#plot(1,1,type="n", xlim=c(min(dimensions),max(dimensions)), ylim=c(0,1))
#abline(h = 1, lty="dashed")
for( D in dimensions ){
#points(D, 1 - (1 - crisp_height)^D, pch="." )
crisp_area[D] <- 1 - (1 - crisp_height)^D
}
theme_set( theme_bw() )
i_dimensions <- c(3, 30, 100, 500)
setwd("~/dev/R/scribble/melon")
for( i_dim in i_dimensions ){
melonpan_plot <-
ggplot() +
geom_rect(aes(xmin = 0, xmax=1, ymin=0, ymax=1-crisp_area[i_dim], fill="chewy")) +
geom_rect(aes(xmin = 0, xmax=1, ymax=1, ymin=1-crisp_area[i_dim], fill="crisp")) +
coord_polar() +
# labs(x=paste0(""i_dim)) +
theme( axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
legend.position = "none") +
scale_fill_manual(values=c("#FFF0B9","#B75500")) +
labs(title=paste("MELONPAN IN ",i_dim, " DIMENSIONS\n",
"( represented in 2 dimensions )")) +
theme( title = element_text(family="Copperplate Gothic Bold"))
current_point <- data.frame(x=dimensions[i_dim], y=crisp_area[i_dim])
curve_plot <-
ggplot(data.frame(x=dimensions, y=crisp_area)) +
geom_line(aes(x=x,y=y)) +
geom_point(data = current_point,
size=4,
aes(x=x,y=y)) +
geom_text(data = current_point,
family="HiraKakuProN-W3",
size=4,
aes(x=x+100,y=y-.03,label=paste0(round(y*100,1),"%がサクサク"))) +
labs(x="Number of Dimensions", y="Ratio of Crisp Area") +
coord_cartesian(xlim=c(1,700)) +
theme( axis.text = element_text(family="Copperplate Gothic Bold"),
axis.title= element_text(family="Copperplate Gothic Bold", size=14)
)
library(gridExtra)
png(paste0("melonpan_in_", i_dim, ".png"), width=900, height=400)
grid.arrange(melonpan_plot, curve_plot, ncol=2,nrow=1)
dev.off()
}

melonpan-like visualization of "curse of dimension ...

 

 

参考文献

 

パターン認識と機械学習 上

パターン認識と機械学習 上

 

 

 

 

質問コーナー

 

しつもん: メロンパンは球ではなく円盤ではないのですか?

こたえ:  君みたいな勘のいいガキは嫌いだよ

*1:1次関数 x と2次関数 x ^2について、 x < 1の部分では直線 x のほうが大きいのに、 x > 1になると急激に放物線x^2の値が直線より大きくなるような変動が、高次元ではより非直感的なレベルで起きるということのようだ。