「虚数はあるのか?」という話の物理学的な回答
はじめに
GW中にツイッターで「虚数はあるのか?」という話をタイムラインでよく見かけたので自分なりの回答をしようと思います。
私は大学/大学院で素粒子論・超弦理論をやってきた理論物理徒なので物理的な観点から回答します。
※虚数はiで表現します。()
電磁気学/波動・振動論
物理で初めて虚数を使うのはおそらく電磁気学か波動・振動論でしょう。
オイラーの公式という形で出て来ると思います。
オイラーの公式
虚数によって指数関数と三角関数が関係付くという美しい公式です。
オイラーの公式と振動
ご存知の通り三角関数は振動を表しているのでも振動を表現しています。
では振動とはどう言う運動かというと、遠くに行こうとするものを中心に引き戻す力が働くので物体は振動してるわけです。
遠くに行けば行くほど強い力で引き戻す必要があるので、引き戻す力は距離に比例してるとすると振動は次の運動方程式でかけます。
m:振動してる物体の質量
x:位置
t:時間
k:定数(バネ定数)
左辺は質量かける加速度、右辺は中心に引き戻す力です。(ma=Fですね。)
三角関数 、はもちろんこの式を満たしています。(Cは定数)
さて、を(2)式に代入してみてください。(Cは定数)
ちゃんと等式が成立していることがわかると思います。つまり、が振動を表しているということです。(今の場合は)
また、の代わりに時間に依存しない項をeの肩に追加しても式を満たします。(と置き直す。)
このは位相(phase)と呼ばれいてtが0の時の値なのでどのような状態で振動が始まったのかを表現しています。
は物理では様々な分野で出てきます。
ですので、物理学徒はをみたら「振動だ!」と思うように訓練されています。
インピーダンスの例
抵抗とコイルが直列につながっている回路に交流電流を流すことを考えます。
V:電圧
I:電流
R:抵抗
L:インダクタンス
t:時間
とすると、電位差の和は0になるというキルヒホッフの第二法則より
となります。1項目は起電力で、2項目は抵抗にかかる電圧(オームの法則)、3項目はコイルにかかる電圧です。
さて、交流電流は振動しているので電流はと書けそうです。(は定数)
これを代入すると、
になることがわかります。つまり全体として見れば、の抵抗がかかっているように見えます。
この、との比であるをインピーダンスと呼びます。以後、インピーダンスをZと表記します。
(5)式を複素平面で表すで表現すると様々なことがわかります。図1となります。この図から直ちに大きさ,電圧と電流の位相差であるとわかります。
インピーダンスの虚数
インピーダンス、つまり電圧と電流の比に虚数が出ました。
つまり、虚数は存在する?
結論から言うとそうとは言い切れません。
オイラーの公式を(1)のにを代入してみてください。
になります。
つまりインピーダンスはと書けます。
電流がであり、(4)の再び代入すると、
となります。
これが示しているのはコイルに入ったら位相がずれるということを表現しているにすぎません。
実際にの代わりにと表現しても良いはずです。
これを(3)式に代入すると
\begin{align}
V_0\sin(\omega t + \alpha) &= RI_0\sin(\omega t) + \omega LI_0\cos(\omega t) \\
&= I_0\sqrt{R^2+(\omega L)^2}\sin(\omega t + \theta_0) \tag{6}
\end{align}
但し、
両辺を比べると、, となって複素数を使わなくても同じ結果を得られます。
ではなぜ最初にを使ったのかというと(6)式の三角関数の合成を使うよりも複素平面の幾何として扱った方が簡単だからです。
つまり、ここで使っている複素数は本質的なものではなくあくまでも便利な道具として使っています。
量子力学
量子力学の基礎方程式として状態の変化を記述するシュレディンガー方程式というのがあります。
h:プランク定数
m:が粒子の質量
V:ポテンシャル
:波動関数(状態を表す関数)
t:時間
x,y,z:それぞれ空間座標
:ラプラシアン
この方程式には初めから虚数が入っています。
しかし、人間が観測する物理量は量子力学では波動関数に働く作用で、実数になります。(というか実数になるようにしてます。)
また、に関しても物理として意味があるのはではなくです。
が粒子の存在確率密度を表すというのが一般的な量子力学の解釈です。
確率密度なので空間で積分すると1になります。
では、量子力学においても虚数を使わずに表現できるのでしょうか?
その前に(7)式は両辺に複数共役をとっても成り立つはずなのでが成り立つ方程式は
となります。(これは後で使います。)
さて、確率密度の時間変化を考えます。
\begin{align}
\frac{d|\psi|^2}{dt} &= \frac{d}{dt}(\psi^*\psi) \\
& = \frac{d\psi^*}{dt}\psi + \psi^*\frac{d\psi}{dt} \\
& = -\frac{\hbar}{2mi}\left( \psi^\ast\nabla^2 \psi - (\nabla^2 \psi^\ast)\psi \right)\\
& = -\frac{\hbar}{2mi} \nabla \cdot \left( \psi^* \nabla \psi - (\nabla \psi^*)\psi \right)\\
& = - \nabla \cdot { \frac{\hbar}{2mi} \left(\psi^* \nabla \psi - (\nabla \psi^*)\psi \right) }
\end{align}
3行目の式変形で(7),(8)を使った。また、はとも書かれダイバージェンスですね。
ここで、, とすると、
と書けます。
(10)式は連続方程式と呼ばれていて、確率密度の時間変化がjという流れとなるという式です。(jは確率密度流と呼ばれています。)
この連続方程式は確率密度が急に湧いてきたり、無くなったりせず空間上で連続的に変化することを表してます。
確率密度なら当然満たすべき性質です。
さて、この確率密度流の係数に虚数が出てきました。
先ほどのインピーダンスの時と違うのはを複素数とした訳ではないのに始めから確率密度流に虚数が入っていることです。
さらに確率密度は実数なので(10)の左辺も実数で、確率密度流は実数になるべきです。そうするためにはは複素数である必要があります。
(そもそもが実数ならとなって確率密度流は常に0になる。
また、(8)式より「右辺が1なんだから確率密度の時間微分は0になるのでは?・・・」と思った人はガウスの定理などを思い出しながら実際に計算してみて下さい。)
終わりに
これが「虚数はあるのか?」という問いに完璧に答えるかと言われてると微妙ではありますね。
そもそも量子力学の解釈が間違っているとか、実は虚数を使わなくて済む別の方程式があるのではないかとか色々ツッコミどころはあると思います。
ただ、少なくとも私は「虚数はあるの?」とか「虚数は必要なの?」って聞かれた場合は「虚数が無いと量子力学の確率解釈が成立しない。」と答えます。
追記(2018-5-9)
フィードバック
Re(ψ),Im(ψ) の2つの波動関数があって、その二乗和が確率になるってモデル作ったら虚数いらなくないでしょうか?
— 平田朋義 (@tomo3141592653) 2018年5月8日
問題は量子系を「複素」Hilbert空間で記述することがどれだけ本質的なのかというところですが、U(1)の下で変換する複素スカラー場は、これと同型なSO(2)の下で変換する実2成分場で書いてもいいはずなので、このような場は直交行列の下で時間発展すると解釈できないでしょうか?
— れおなち (@leonacism) 2018年5月8日
これらの議論を受けて、虚数を使わなくても量子力学は構成できる気もして来ました。
現段階での、理解としては以下のツイートになります。
実ヒルベルトではダメで複素ヒルベルトじゃないと導出できない性質があれば、量子力学には本質的に虚数が必要って言えるのか。
— tdual@情報幾何 (@tdualdir) 2018年5月8日
あるのか?
詳しい方がいたら教えてください><
ツイッターやっているのでフォローお願いします。
↓今すぐフォローすべきキラキラ アカウント
じゃあの。
日記20180507
日記じゃ
前処理大全が業務で役に立った
例えば、
a, 1 b, 2 c, 3 b, 4 a, 5 a, 6
を
a, [1,5,6] b, [2,4] c, [3]
という処理をしたかった。
pandasのgroupbyでどうにかなるのか?ってちょっと悩んだが、前処理大全でagg関数でlambdaを使う処理をやったことを思い出した。
agg("カラム名", lambda x: xの計算) の時のxは Seriesオブジェクトになっているのでtolist()でリスト化したら上手くいった。
gist.github.com
なお、SeriesGroupByにapply(list)してもできる模様。(その場合の返り値はDataFrameじゃなくてSeries)
ありがとう前処理大全!
Macの隠しファイル表示/非表示コマンド
以前、日記に以下のコマンドをターミナルに打てば良いと書いた。
tdual.hatenablog.com
defaults write com.apple.finder AppleShowAllFiles TRUE killAll Finder
しかしもっと簡単なキーボードコマンドがあった。
[command] + [shift] + [.]
で切り替えられる。
TrelloのPower-UpsをTwitterに変えた。
Power-Upsは無料プランなら一つのボードに一つ設定できる。
今までは、Githubにしてたのですが、どうも使わないのでTwitterが埋め込めるPower-Upsにした。
データドリブンなカナブン
衝動的に作ってしまった・・・ pic.twitter.com/aQv0RWeSa9
— tdual@情報幾何 (@tdualdir) 2018年5月7日
日記20180506
日記じゃ。
Pycon mini Osakaの資料作り
資料を作った。7割くらい出来たけど、資料を作ってるとまたアーキテクチャを変えたり色々と実験したくなるので資料が進まない。
あと、資料にアーキテクチャ図を書こうと思ってTensorboardのグラフを載せようと思ったけどグラフの流れは縦向きなので如何せんスライドに貼りずらい。
Tensorboardのグラフは横向きに出来ないのか?
Tensorflowのデバイスのログ出力
Tensorflowのデバイス(CPU,GPU)のログ出力をするにはSessionで設定すれば良い。
import tensorflow as tf a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') c = tf.matmul(a, b) sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) print(sess.run(c))
出力
2018-05-06 22:58:47.845758: I tensorflow/core/common_runtime/placer.cc:886] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:CPU:0 b: (Const): /job:localhost/replica:0/task:0/device:CPU:0 2018-05-06 22:58:47.845783: I tensorflow/core/common_runtime/placer.cc:886] b: (Const)/job:localhost/replica:0/task:0/device:CPU:0 a: (Const): /job:localhost/replica:0/task:0/device:CPU:0 2018-05-06 22:58:47.845808: I tensorflow/core/common_runtime/placer.cc:886] a: (Const)/job:localhost/replica:0/task:0/device:CPU:0 [[22. 28.] [49. 64.]]
インタープリタでやるとこれで良いのだがupyter notebook上で実行するとlogは出力されない・・・
あれ?って思ってjupter notebookのログを見るとそっちに出力されてた。
なんとかしてjupyter notebookで表示しようと思ったけど、C++のエラー標準出力は表示されないだと・・・
stackoverflow.com
分散表現という言葉
単語の埋め込みを分散表現(Distributed representation)とも言うが「分散」ってなんだ?って思って調べたけどなんか深そうだった。
一応、one-hotベクトルじゃなくて複数成分で単語を表現出来ているときに分散表現と呼ばれていると言える。
分布仮説との関係、認識の類似性としての表現、word2vecのように計算ができることなど色々な側面があってちゃんとまとめる必要がありそう。
日記20180505
日記じゃ
茨城のひたち海浜公園にネモフィラを見に行った。
ネモフィラっていう青い花をTwitterなどで見かけて綺麗だったのと、せっかくのゴルデンウィークだしちょっと小旅行するかってことで「ひたち海浜公園」に行った。
国営ひたち海浜公園 – 海と空と緑がともだち。ひたち海浜公園は、茨城県ひたちなか市にある国営公園です。
最寄駅は「勝田駅」で、行きは品川から「JR特急ときわ」に乗って行って1時間30分くらい。
それにしても普通の運賃と特急券が別にあるシステムは面倒臭いし、ややこしいのでどうにかならんものか。
(日本人でもややこしいんだから海外の観光客なら尚更混乱するでしょうね。)
勝田駅からは専用のバスが出ていて15分かからないくらいでひたち海浜公園に着いた。
暑かったのでTシャツで行ったが、海の近くなので風が結構冷たかった。
入場料は大人400円で、中学生以下は無料という激安だった。
園内は思ったより広くて、たこ焼きやかき氷などの屋台があちこちにあってテーブルもたくさん設置されていてのんびり過ごせる感じだった。
肝心のネモフィラは10分程度歩いたら見えてきた。
小さな丘を登りながらネモフィラを楽しむ形になってた。
ネモフィラで丘が青くなっているのは神秘的やな。
丘の頂上からは海が見えた。空も雲一つなくて見渡す限り青色で綺麗だった(写真はない。)
ネモフィラを見た後は厚切りポテトチップスを屋台で買って座って食べて、帰った。
帰りは特急に乗らなかったが、勝田から日暮里まで2時間以上かかった。眠かった。
久しぶりに歩いたので疲れたが、まあ、ゴールデンウィークっぽいことをしたのでよかった。ネモフィラも綺麗だったし。
今、wikiで調べたけどネモフィラって英語では"baby blue eyes"ともいうのか。なるほど。
character level cnnで文書の最大長を変えて実験
文書の最大長が長すぎると埋め込む前の次元が大きくなってしまって処理に時間がかかるので1000文字で切ってた。
もちろん1000文字以上の文書だと途中で切られているがそれでも十分に極性を表現できていると考える。(原論文でも1014とかで切ってた。)
ただ、実験として最大長を2000文字に変えてみた。
まだ途中だけど情報が多い分やはり収束は速い。
青い方が2000文字
赤い方が1000文字
Instant Hotspotを知らないうちに使ってた
私のiPadはwifiしか使えないので外で使う時は毎回iPhoneのテザリングで通信してたんだけどあることに気付いた。
iPhoneのインターネット共有をoffにしていてもiPadからwifiを見つけて接続できる・・・
なぜなんだって思って調べたらiOS8から使える「Instant Hotspot」っていう機能だった。
両端末でアップルアカウントにログインしていて、Bluetoothがonになっていれば、wifiで繋ごうとした時に自動でインターネット共有をonにしてくれる。
最近、iPadを再び使い出したので当たり前だと思って享受してたけど、よく考えたらめっちゃ便利な機能やな。
日記20180504
日記じゃ
- Character level CNNでアーキテクチャを変える
- 回線のスピードチェックアプリを入れて見た。
- microbit
- 2、3時間のお昼寝
- ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った。
- Trelloのipadアプリでチケットにチケットを添付できない。
- 今日の思い付き
- pycon miniのスライド全然できてないじゃん・・・
Character level CNNでアーキテクチャを変える
原論文([1509.01626] Character-level Convolutional Networks for Text Classification)のアーキテクチャではどうも上手く学習できないのでアーキテクチャを全然違うものに変えた。
低次元空間に埋め込みした後に複数のカーネルサイズを通して、最後に結合して特徴を出力するやつ。
参考
[1702.08568] eXpose: A Character-Level Convolutional Neural Network with Embeddings For Detecting Malicious URLs, File Paths and Registry Keys
[1408.5882v2] Convolutional Neural Networks for Sentence Classification
character-level CNNでクリスマスを生き抜く - Qiita
CNNを利用したセンチメント分析 - にほんごのれんしゅう
VocabularyProcessor
文字を数値化するのはtensorflow.contrib.learnのpreprocessing.VocabularyProcessorを使ったので日本語も問題なくできる。
注意点としてはこれは元々は単語の処理をする為のものなので最大長を4とかに設定すると
from tensorflow.contrib.learn import preprocessing vocab_processor = preprocessing.VocabularyProcessor(4) docs = ["a aa aaa aaaa", "aaa a"] print(list(vocab_processor.fit_transform(docs)))
出力
[array([1, 2, 3, 4]), array([3, 1, 0, 0])]
なので単語の間にスペースを入れて文字を整数にマッピングするようにした。
gist.github.com
あとcontrib.learn.preprocessingは古いのでtf.dataを使えと言う警告が出るがtf.dataの使い方がわからない。
と言うかドキュメント読んでも同じことが出来るようには思えない・・・ うーむ・・・
方針
学習も上手くいってるのでこのアーキテクチャで色々実験する。
回線のスピードチェックアプリを入れて見た。
なんか回線が遅い気がしたのでせっかくなのでアプリを入れて確認して見た。
speedcheck
これ
チェックした上下の速度だけでなくSSIDや場所も履歴として残るので良い。
色んな場所のFree wifiの速度をチェックしたくなる。
結果をipadやiphoneで同期できるらしいのでアカウントも作った。
ただ広告がウザすぎるので360円くらい払って広告出さないようにした。
また、ipadの方のアプリで支払ったのにiphoneの方でログインしたのにまだ広告出てるのはなんかちょっと微妙やな。
同じアカウントなら一つ買ったら別の端末でも広告出さないようにしてよ。iphoneの方は広告出したままにした。。。
結果
wifiで二種類繋げられるんだけど、チェックしたらなぜか知らないけど遅い方に接続してることが発覚した。
だから遅く感じたのか・・・
速い方に変えた。
速度
- 遅い方
くだり 21.36Mbps
のぼり 5.63Mbps
- 早い方
くだり 59.24Mbps
のぼり 4.69Mbps
どっちも普通に速いやんけ。ってかのぼりは同じあまり変わらないのね。
microbit
twitterで見かけたのでちょっと調べた。
http://microbit.org/ja/guide/
教育用のマイコン。BBCが作っていてイギリスの小学生とかが使ってるらしい。
マイクロusbでパソコンに繋いでプログラミングできるみたいだ。pythonでもコーディング可。
ジャイロ、温度センサー、無線通信、bluetoothと機能は一通り揃ってるみたいだ。
2、3時間のお昼寝
例のごとくMONSTER ENERGYを昨日二本飲んだので夜は3時間くらいしか眠れなかったので2、3時間お昼寝した。
昼寝すると午後からの作業が捗るな。
ヨドバシの前でGUのセールをやってたのでTシャツを3枚買った。
3枚で3000円ちょっとだった。
なんてないTシャツなので写真は割愛
今日の思い付き
あ、プラグラミング言語の特定とかなら出来そうか。
— tdual@情報幾何 (@tdualdir) 2018年5月4日
ブログのネタとしてはいいかもしれないけどあまり実用的ではないかも・・・
pycon miniのスライド全然できてないじゃん・・・
やばい・・・
日記20180503
日記じゃ
- 今日はずっとcharacter level CNNの実装してた。
- 久しぶりにAWSのGPUインスタンスを起動した。
- 『前処理大全』の3-3を読んだ。
- ChromeのdevToolを開くショートカット
- 歌詞取得スクリプト
- コンソールに求人を埋め込むAbemaTV
今日はずっとcharacter level CNNの実装してた。
完全に論文通りなのになんか上手く学習されないのでどこかバグがあるんだろうか。
tensorboardでsparsityを確認したらいきなりほぼ1になっていたのでなんかおかしい・・・
久しぶりにAWSのGPUインスタンスを起動した。
Char level CNNの学習を待って居られないので時間をお金で買うことにした。
だが、Amazon reviewのデータセットを送ったらすぐにディスクが一杯になった。
前にSSDの学習のための画像データセットを保存していて、それが圧迫してたので消した。
『前処理大全』の3-3を読んだ。
極値、代表値の算出の話。
平均値
「平均値」の他の代表値とは違う利点として計算計算コストが低いから良いって言うのは、言われてみそうだがあまり意識したことなかった。
SQLの関数
SQLのMEDIAN関数やPERCENTILE_CONT関数を使ったことないな・・・
まあ、SQLでそもそもデータ分析をしたことない。手元に持ってきてPythonでやってる。そこまで巨大なデータを扱わないからか?
python
agg関数はlambdaが使えるのか。
あとは、パーセンタイルの計算としてnumpy.percentileがある。
gist.github.com
バージョン1.15からnumpy.quantileも使える。(今は1.14)
percentileは引数が1~100の整数だが、quantileは0~1の少数で指定できるようだ。
numpy.quantile — NumPy v1.15.dev0 Manual
歌詞取得スクリプト
「歌詞タイム」ってサイトで歌詞をちょっとコピーしようとしたら出来なかったので取得スクリプトを作った。
DevToolを開いても取得できたけど
タグなどが挟まっていたので「もうスクリプト作るか・・・」ってなった。
最初、HTML要素を見て歌詞が見当たらなかったので歌詞は別APIで取得してるのかと思ったけどただエンコードしてjavascriptで持ってるだけだった。
なのでHTMLをテキストで取得してデコードした後に正規表現で対象箇所を抽出するだけで歌詞を取得できた。(
HTTP HEADERなどを駆使してもっとマシな作りに出来ないか・・・)
なんかの法律に抵触すると面倒臭いのでスクリプトは公開しないようにします。
コンソールに求人を埋め込むAbemaTV
AbemaTVのページでコンソールを開くと求人が出てくるの、割と面白くないですか? pic.twitter.com/BjLqlUnILm
— keymoon (@kymn_) 2018年5月3日
ワロタwwww
ちなみに要素はアイコンが。
要素はもっとワロタ pic.twitter.com/JcvNIH9OPJ
— tdual@情報幾何 (@tdualdir) 2018年5月3日
日記20180502
まとめ
- 昨日眠れなかったので一日中頭があまり働かない感じだった。
- 『Pythonで学ぶ新しい統計学の教科書』1部6章まで読んだ。
- 『前処理大全』3章「集約」の3−1まで読んだ。
- はてなにJupyter notebookを貼る方法
- アイロン買った。
- 畳み込み層の処理は相互相関と言う記事をポストした。
- RAKERUに行った
- 明日の予定
昨日眠れなかったので一日中頭があまり働かない感じだった。
昨日飲んだMONSTER ENERGYのせいだと思う。ああ言うのを飲むとよく眠れなくなる。(が集中力はやはり上がるのでつい飲んでしまう。)
『Pythonで学ぶ新しい統計学の教科書』1部6章まで読んだ。
まだ、
- 母集団分布の推定 = 分布の決定(正規分布や二項分布など) + パラメータの推定
- 標本の統計量=母集団分布のパラメータの推定値
みたいな統計学の基礎の話
「母数」は分布のパラメータのことでサンプルサイズじゃないってことを強調して書いてた。
個人的にはもう「母数」って言葉も使うのやめてパラメータで良いんじゃないかと思う。
『前処理大全』3章「集約」の3−1まで読んだ。
groupbyした後に
aggで集計処理をまとめてできる。
gist.github.com
"May the agg be with groupby(aggがgroupbyとともにあらんことを)"
はてなにJupyter notebookを貼る方法
gistにipynbファイルをD&Dで追加して、そのリンクを貼るだけだった。
気をつけるのはtextareaに入れるとちゃんと貼れないのでこの状態の時にDropする。
アイロン買った。
最近買ったシャツのシワが目立つので、人生初のアイロンを買った。
t-falの変な形のスチームアイロン。アイロン台を買いたくなかったのでハンガーとかに掛けたままシワが伸ばせるやつにした。
まだ使ってない。
畳み込み層の処理は相互相関と言う記事をポストした。
tdual.hatenablog.com
割と反響があったみたい。
Toeplitz matrixの解説やnp.correlationでcnnを実装する話もいつか書きたい。
RAKERUに行った
オムライス専門のチェーン店。初めて行った。吉祥寺のヨドバシカメラ横のガストの下。
オムライスだけでなくパンも美味かった。後、店内がカラフルで子供受けしそうな内装だった。