地球物理をやる学科に居るので、地震も学んでいるのですが、ふと思いついたので地震計の観測した波形を音に見立ててWAVファイルにしてみました。
気象庁の強震波形(平成23年(2011年)東北地方太平洋沖地震)のページから、福島県郡山市朝日の、震度6のデータです。なんだか、雷みたいな音がしますね!
ソースコードはこちらです。PythonでCSV読んでWAVに書いているだけですが、一応使い方のサンプルとしては使えるのではないでしょうか。
百合は崇高な何かじゃなくて、もっと素朴な、あまりに素朴すぎて人類には忘れられてしまう、そういう何かだと考えている
地球物理をやる学科に居るので、地震も学んでいるのですが、ふと思いついたので地震計の観測した波形を音に見立ててWAVファイルにしてみました。
気象庁の強震波形(平成23年(2011年)東北地方太平洋沖地震)のページから、福島県郡山市朝日の、震度6のデータです。なんだか、雷みたいな音がしますね!
ソースコードはこちらです。PythonでCSV読んでWAVに書いているだけですが、一応使い方のサンプルとしては使えるのではないでしょうか。
最近友人に薦められて、今日が最終回らしい「凪のあすから」を見ています。今6話なのですが、恋愛関係が大変複雑です。「深夜の昼ドラ? アニメ『凪のあすから』の人物相関図つくったよ」というページがあったので、引用しますと、こんな感じ。
うーん、グラフ理論って感じだ。そう思ってからピクシブの非公式カップリングのページを見てしまうと、もはや隣接行列か何かにしか見えなくなってきた…。
隣接行列…グラフ理論…はっ!ページランク求めようページランク!
というわけで、今まで一回ぐらいやってみようと思っていた、ページランクの計算を実際にやってみました。こちらの「Google の秘密 – PageRank 徹底解説」を参考にしました。人間をページに見立てて、好意をリンクに見立てます。
昔私が読んだ本だと、
というのを読んだ気がします。つまり、貰ったページランク=あげたページランク=そのページのページランクという等式が成り立つということです。
元の論文にもそんな図が載っています。
Lawrence Page, Sergey Brin, Rajeev Motwani, Terry Winograd, ‘The PageRank Citation Ranking: Bringing Order to the Web’, 1998,
http://www-db.stanford.edu/~backrub/pageranksub.ps
これをグラフ理論と確率過程の話で表現すると、こうなります。
これがホントに元の話と一緒なのか?ということなのですが、
なので、もらうページランク=あげるページランクという関係は確かに成り立ちます。
実際にもとめてみましょう。まずは、鍵となるページ遷移確率表を用意します。さっきの表を見ながら、ひーくんからまなかへ遷移する確率は1…みたいな感じで行列を作るとこうなります。一応、今回は友情は無視して恋愛関係だけ考えます。
M = ひーくん ちさき まなか 要 さゆ 美海 つむぐ あかり 至 みをり ←好き ↓好かれる 0.00000 1.00000 0.00000 0.00000 0.00000 1.00000 0.10000 0.00000 0.00000 0.00000 ひーくん 0.00000 0.00000 0.00000 1.00000 0.00000 0.00000 0.10000 0.00000 0.00000 0.00000 ちさき 1.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.10000 0.00000 0.00000 0.00000 まなか 0.00000 0.00000 0.00000 0.00000 1.00000 0.00000 0.10000 0.00000 0.00000 0.00000 要 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.10000 0.00000 0.00000 0.00000 さゆ 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.10000 0.00000 0.00000 0.00000 美海 0.00000 0.00000 1.00000 0.00000 0.00000 0.00000 0.10000 0.00000 0.00000 0.00000 つむぐ 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.10000 0.00000 0.50000 0.00000 あかり 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.10000 1.00000 0.00000 1.00000 至 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.10000 0.00000 0.50000 0.00000 みをり
普通、ページには複数のリンクがありますが、このアニメだと思い人が二人以上居るのは不倫と勘違いされて殴られた至だけです。
あと6話時点ではつむぐは誰も好きではないので、つむぐの行が全部0になるはずなのですが、そうしてしまうとページランクが求まりません2。
これを元論文ではdangling pageと呼んでいます。元論文では「あんまり重要じゃないから削除して計算しています」と無視してしまっているのですが、つむぐくんを無視するのはかわいそう(?)なのと、仮につむぐくんを消してしまうと今度はまなかがdangling pageになって…となって最終的に大人組しか居なくなってしまうので、次に紹介するrandom surferモデルに習って、みんなを平等に好きなことにしました。
元の定義通り、「あるページからスタートしてリンクをたどり続けた時に、それぞれのページに居る確率が一定になってくる」まで遷移させ続けます。
たとえば、ひーくんからはじめましょう。はじめはひーくんに居ると仮定しているので、ひーくんに居る確率は1で、他みんな確率0とします。
1回リンクをたどると、グラフを見るとひーくんはまなかが好きなので、まなかの確率が1になるはず。
これを我々が先ほど作った行列を使って計算しようとするなら、先ほどの行列Mに、ひーくんを1としたベクトルPを掛ければよいです。
octaveでやるとこんな感じです。
octave:95> M=[ 0 1 0 0 0 1 1/10 0 0 0 ; 0 0 0 1 0 0 1/10 0 0 0; 1 0 0 0 0 0 1/10 0 0 0; 0 0 0 0 1 0 1/10 0 0 0 ; 0 0 0 0 0 0 1/10 0 0 0 ; 0 0 0 0 0 0 1/10 0 0 0; 0 0 1 0 0 0 1/10 0 0 0 ; 0 0 0 0 0 0 1/10 0 1/2 0; 0 0 0 0 0 0 1/10 1 0 1; 0 0 0 0 0 0 1/10 0 1/2 0 ] (略) octave:96> P = [1; 0; 0; 0; 0; 0; 0; 0; 0; 0] ←ひーくんに居る確率を1としたベクトル octave:97> M*P ans = 0 0 1 0 0 0 0 0 0 0
というわけで、まなかは三番目の要素で、それが1となったので、見事正しい結果を得られています。これを沢山続けてみましょう。10000回ぐらい掛けると変わらなくなってきます。
octave:98> (M^10000)*P ans = 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.22222 0.55556 0.22222
…あれぇ?最後の3人、つまり大人組以外ゼロ?なんか間違ったかなぁ?
こうなってしまった原因は、大人組から子供組へ繋がっていないことです。つむぐくんは全員が好きだと仮定したので、子供組から大人組へはつむぐくんから遷移することが出来るのですが、その後は大人組の間でぐるぐるぐるぐる巡り続けることになります。ひーくんからはじめても長い目で見ればいつかは大人組に入ってしまい、そこで定常状態となるので、子供組の確率がすべて0になってしまったのです。グラフ理論の言葉でいうと、グラフを辿ると元の位置に必ず戻ってこれる大人組のような部分を再帰類と呼び、そうではなく元に戻れない子供組のような部分を非再帰と呼ぶそうですが、あまりこれ自信をもって解説できないので、しません…。
元の論文ではこれをRank sinkと読んでいて、そのためにランダム・サーファー・モデルというのを考慮しています。これはどういうモデルかというと、「時々はまったくリンクされていない別のページに飛ぶ」と考慮しているモデルです。具体的には、新しい遷移確率行列を次のように定義します。
octave:99> M2=(M*1/1.15)+((1/10)*0.15/1.15)
これは、まず今までの確率を少し下げた上で、あるページから他のページへ僅かな確率で飛ぶようにした、ということです。凪のあすからの言葉を使えば、ひょっとするとひーくんは他の女の子(や男の子)にも興味を持つかもしれないよねというモデルです。
この修正したモデルでは、あるページから他のページへ少ない確率ながら必ずジャンプできるので、Rank sinkのような問題は起こりません。
早速、計算してみましょう。
octave:100> (M2^10000)*P 0.095976 ひーくん 0.060684 ちさき 0.106569 まなか 0.043208 かなめ 0.023111 さゆ 0.023111 美海 0.115780 つむぐ 0.135981 あかり 0.259599 至 0.135981 みをり
やはり両思いは強いのですね!(?) 子供組を見ると、やはり特に重要そうなキャラクターであるひーくん、まなか、つむぐの三人のページランクが高いので、おおよそページランクの妥当性を示せたと言っていいんでしょうか!?とりあえず、この三人に注目して今後は視聴を続けたいと思います!
なんか10000回も行列を掛け算するのは…という感じしますか?元の論文だとその方法で計算してると書いてあるのですが、これは行列の固有値・固有ベクトルを使っても求めることが出来ます。
固有値・固有ベクトルをおさらいしておくと、
ここで、固有値μ=1なら、MV=Vとなって、N回目とN+1回目でのそれぞれのページに居る確率が全く同じという事になり、ちょうど私達が求めたかったベクトルと一致しますね!
octaveで求めるとこんな感じになります。
octave:142> eig(M2) ans = 1.00000 + 0.00000i ←求めたい、固有値1の固有ベクトルは1番目だと分かる 0.78950 + 0.00000i 0.19713 + 0.55213i 0.19713 - 0.55213i -0.86957 + 0.00000i -0.59237 + 0.00000i -0.25222 + 0.45314i -0.25222 - 0.45314i 0.00000 + 0.00000i 0.00000 + 0.00000i octave:143> [V, D] = eig(M2); ←固有値と固有ベクトルを再度格納 octave:144> V(:,1) ←固有ベクトル1番目を取得する ans = 0.252078 0.159383 0.279899 0.113484 0.060701 0.060701 0.304091 0.357146 0.681825 0.357146 ↑固有ベクトルは整数倍しても固有ベクトルで、octaveはベクトルの大きさを1に正規化するので、さっきの結果と合わない octave:146> V(:,1) ./ sum(V(:,1)) ←ベクトルの要素の合計が1となるようにすると… ans = 0.095976 0.060684 0.106569 0.043208 0.023111 0.023111 0.115780 0.135981 0.259599 0.135981 ↑先ほどの結果と一致する!
こんな感じで計算できます。固有値ってこんなのにも使えるんですね〜。ちなみに、この行列の固有値のうち、絶対値が一番大きいものはかならず1になることがペロン=フロベニウスの定理から言えるらしいのですが、よくわからないので解説できません…。
凪のあすからは線形代数と確率過程とグラフ理論を学べる神アニメ
ていうか実は前期のアニメで一番好きだったのは「いなり、こんこん、恋いろは」で、京都と出雲にまで行ってきたのですが、それを書く日は来るのだろうか…!?
C++から動画を直接出力できる自作ライブラリ「Dolly」を用いて、二重振り子のシミュレーション動画を作ってみました。
ソースコードはこちらにあります:
さらに、振り子の通ったところをずっと重ねるように描いた動画も作りました。
すごいランダムな動きに見えますが、振り子のある場所はやっぱり下側が多い?
C++から動画を直接出力する自作ライブラリDollyを使って、マンデルブローを拡大する動画を作りました。
この部分のソースはこちらにあります。
あけましておめでとうございます!今年もよろしくおねがいします。去年はあまりいろいろ出来なかったので、今年は少しずつでも、何かできればなと思っています。せっかく転学部までしたので物理をちゃんと身につけたい1ですし、大学再受験も本腰いれてやってきたいです。
さて、新年早速何かアウトプットしよう、ということで、去年作って放置していた「紙ジェクションマッピング」というネタを投稿します。
プロジェクションマッピングってご存知でしょうか。
東京駅が動き出す!? この冬見られる話題のプロジェクションマッピングまとめ
こういう感じで立体物に映像を投影するアートで、最近いろいろなところで行われているようです。
これっぽい事がしたいのですが、うちにはプロジェクタのような高いものはありません。ので、代わりに1枚50円で印刷できるコンビニのプリンタで何か似たようなことが出来ないかと模索した結果、こんな感じになりました。
仕組みは非常に単純で、ある角度から眺めると立体的に見えるように紙に印刷してあります。
作り方ですが、まずこのマーカー画像をセブンネットプリントで印刷して(宣伝)、
こんな感じで撮影します。このとき、カメラのファインダから眺めた時に台形が真四角に見えるようにするのがポイントです。
これを作ったソフトで変形させて適当にホワイトバランスを調整。
これを紙に印刷して、マーカー画像を印刷した紙の代わりにこの紙をおきます。
実態としては、台形に変形させただけの簡単画像加工をしただけということになりますw
今回は一番簡単な平面でしたが、もっといろいろなものに紙ジェクションしたいですね。たとえば、ティッシュの箱に貼り付けて、ある角度から見ると立体的に見える…とか。今位置合わせが非常にしんどいのですが、ARマーカーでなんとかできるといいんじゃないかなーとかも考えてます。3D力が問われる!!
ただ、結局プリンタの実力があまり高くないせいで、紙に写した方がそんなにリアルに見えないので限界かなという気がしています。っていうかそれがお蔵入りしてた原因です…(◞‸◟ )