巨大行列の固有ベクトル, 爆発とクレーターのサイズ (2014/05/30)


spam filter repair

なんかいろいろ壊れてて動かなくなってたので直したのです.

まず, トークナイザの mecab が知らんまに utf-8 で動くようになってて, (そういやだいぶまえからそうだったかもしれん) チャンクになってないデータがベイジアンフィルタに突っ込まれてた. それから, 学習コマンドが, シェルの仕様が変わったのか何か知らんけど, 関数か$1とかにアクセスできなくなってて, 学習も動いてなかった.

要するに何も動いてなかったわけです. ぎゃははh!

ということで, 直しました. ヒーヒー

何か変だなと思ったらすぐ調べないといかんね.

巨大行列の固有ベクトル

固有ベクトルとは何であり, 何に有用であるか, みたいなところは今回は自明なものとしてざっくり省略します. データの件数が増大すれば, それに応じて行列のサイズも巨大化するので, 何も考えずにやってると計算がすぐに動かなくなってしまう.

ところで, その巨大なデータがそのまま意味そのものであり, そこから一切省略したりまとめたり何か抽出することは不可能でありダメである, という場合は少なくて, 実際には何かの形に圧縮したり省略できる. それが分析結果であったり, あるいは名前がついてナンタラ抽出だったりする. そこで対偶をとってみよう. 分析に値するデータであるならば, ちっこく潰すことができる, ということになる.

ようするに, 「なんだ. これまじめに全部計算することないよ」ということだ.

今回紹介する手口は, その巨大な m*m の正方行列が, じつは細長い(m*nとしよう)行列の積だった場合である. 行の数(m)のほうが列の数よりもずっと大きいという場合です. ではさっそく始めよう.

m*mの大きな行列 \(X_0\) が \(X_0= X_1 X_1^t\) として m*n (m > n)の縦に細長い行列 \(X_1\) の積だとする. 目的は, m*m 行列 \(X_0\) の固有ベクトルである.

積の順番を入れ替えて得られる n*n の小さい行列 \(X_1^t X_1\) を \(X_2\) とする. \(X_2\) の固有ベクトルの組を \(u\) とする. u の次元はmに比べてかなり小さい自然数 n なのでこの計算は簡単にできる.

m次ベクトル \(v = X_1 u\) の転置積 \(v v^t\) をかんがえる. \(v^t = u^tX_1^t \) なので \(vv^t = X_1 uu^t X_1^t \)である.

u は固有ベクトルなので積 \(uu^t\) は単位行列なので, この積は結局 \(X_0\) である.

また, \(X_0v = X_1X_1^tX_1u = X_1X_2u\) であるが, \(u\)は \(X_2\) の固有ベクトルなので, \(X_2u=\lambda u\) だから \(X_1X_2u = \lambda X_1u\) であり, \(v\) の定義よりこれは \(\lambda v\) である.

つまり, \(v\) は \(X_0\) の固有ベクトルであり, その固有値も\(\lambda\) で等しい

まとめると, 大きいm次正方行列\(X_0\)が細長いm*n行列\(X_1\)の積であるとき, \(X_0\)の固有ベクトルを計算するためには \(X_1\)を転置した積である \(n*n\)次の小さい行列 \(X_2\) の固有ベクトル\(u\)を計算すれば十分であり, 巨大m*m行列の固有ベクトルは, \(u\)と\(X_1\)の積によって得られ, 固有値はそのまま使いまわせる.

線形代数としてはさっぱり自明だけど, これが実際の計算上もってる意味はほとんど魔法なので, クソでかい行列がでてきたときは, 思い出してやってください. 役に立つかもです.

参考文献: opencvの顔認識のドキュメント

爆発とクレーターのサイズ

爆発でできるクレーターのサイズをあらかじめ知る方法は無いだろうか?

youtube などで, 時々IED(即席地雷)を戦車で踏み潰すことで起爆して無力化する動画をみかける. 爆発の威力が十分に小さければ, 余計な手間をかけない良い方法にも思われ, また戦車の素晴らしさも実感できてなかなか悪くないように見えるが, 爆発の威力が十分に大きかった場合はこの限りではない.

最悪, あとにばかでかいクレーターだけが残りました, という事になりかねない.

踏み潰す方は当然そんなことは判っているわけで, つまり, 何らかの目星をつける方法があるはずだ, ということになる.

そこで検索してみると,

これらの記事が見つかった.

爆発のエネルギーを E とすると, クレーターの直径との関係は E の3乗根の定数倍になる. というのは, 爆発のエネルギーが, 地面をむにーっと押しのけてへこませるのに使われるわけだが, そのために必要な力は単位面積あたりだいたい同じなので, 必要な仕事は表面積を半径方向に積分したもの, すなわち体積に比例するからである.

そこで, この定数を計算してみよう. TNT爆薬1トンあたりの係数は, Wikipedia の爆発クレーターの項目によれば, 390mの爆発クレーターが104キロトンなので

(/ 390 (expt 104000 0.33))
8.618736535656703

一方月面クレーター「ジョルダーノ ブルーノ」の場合はTNT換算率をかけて

(/ 20000 (expt (/ 100000000000 4.18) 0.33))
7.516543387160334

よく一致してますな.

つまりTNTが1トンあっても8mかそこらのクレーターができて終わり, って事です. 地面が液状化する圧力が出せても戦車の装甲を液状化する(つまり破壊する)のは無理だと思われるし, 1トンのTNTは80cm角もあるので, 車に隠すのは不可能ということで, まぁ車爆弾程度のものは戦車で踏み潰して全然かまわない, という事になるのかね.

また, たとえなんたらウルチタンみたいなすごい物質を爆発物として使ったとしても, クレーターの寸法はエネルギーの三乗根なので, できる穴ぼこの寸法はたいして変わらない.


記事リストへ