2018年に読んでよかった本 & 2019年の目標

久しぶりの投稿、しかも旬がすぎたタイトルでの投稿です。 2018年は大企業特有の闇の1年研修を終え、ようやく研究業務を始められた年でした。 企業研究所の研究環境といえば、先日kumagi氏の例の記事がバズりましたね。 記事を読んで、企業研究所の研究環境はどこも似たり寄ったりで、弊社の研究環境も他と同程度には恵まれているのかなという感じがしました。 いろいろ言いたいことはありますが、自分は配属がアタリで、大学のように自由に研究させてもらえる部署だったこともあり、文句を言う前に成果を出さねばと言う気持ちです。 業務内容は物理に近い分野で、自分に馴染みが薄かったため、足りない知識を補うための勉強からはじめました。 業務時間に学べる環境は大変ありがたく、色々な本を発注しては読みふける日々を送っています。 初めのうちは熱統計や流体力学の本を読んでいたのですが、気がつけば仕事に直結しない数学の本まで仕入れ始めていました。 本記事ではその中で読んで良かったと思うものを紹介します。 まず田崎先生の「統計力学」です。 以前統計力学に触れたときは、何が仮定で何が結論かがわかりづらく感じたのですが、本書は納得できる仮定を列挙した上で、力学的な仕事をすべての出発点として議論を展開しているので、数学的にもWell-definedな本だと感じました。 また数理物理の本は行間を推測させるような最小限の記述に留められることが多いと思いますが、本書はそれとは真逆の読み物のような文体で書かれているので、初学者にもとっつきやすく感じられました。 とはいえ内容はしっかりしているため自分もすべて網羅できたわけではなく、今後も手に取り続ける本になりそうです。 次に山田先生の「工学のための関数解析」です。 さまざまな分野に登場する関数解析ですが、自分はとある論文の中で偏微分方程式の解の存在証明に半群の理論が出てきたため、勉強し始めました。 Twitterでおすすめされていた本書を試し読みなしにポチったのですが、これがかなり良くて、数学の厳密さを犠牲にすることなく、概念の「心」をしっかり伝えている本でした。 関数の連続性や収束性と聞くと身構えてしまいますが、「解析の対象が関数になっても、関数を距離で実数に写してあげて、そこで連続性や収束性を考えればよい」と宣言してあるのは目から鱗でした。 こちらもまだ読了したわけではなく、会社の同期と読み会を進めているところです(いつ終わるのやら)。 本書はスペクトル理論や半群の理論はカバーしていないため、読み終わったら次は黒田先生の「関数解析」を読もうと思います。 最後に兼清先生の「確率微分方程式とその応用」です。 確率過程は今まで何度も挑戦しようとした分野なのですが、前提知識が多すぎて挫折を繰り返してきました。 確率を数学の土台に乗せるには測度論の知識が必要ですし、確率過程のサンプルパスは関数になるので、収束性の議論などに関数解析の知識が必要になります。 そのため一から勉強を初めて確率過程の定義に辿り着くころには、土台の部分の知識を忘れてしまうという悲しい現実に直面します。 こんなときにありがたいのは、最小限の用語を定義しながら、時には証明を犠牲にして、ストーリーを重視して伝えてくれるような本であり、本書もまたそのような形式をとっています。 フィルトレーションやマルチンゲールといったつまづきやすい概念の裏にある気持ちをしっかり伝えた上で定理を述べ、その使い方まで提示してくれているのはありがたい限りです(それでも理解できないのは僕の頭がポンコツなのでしょう)。 似たテイストの本として、B.エクセンダールの黄色い本がありますが、自分には兼清本の方がまだリーダーフレンドリーに感じられました。 本書は手にとって間も無く、まだ全然読み進められていないので、引き続き気合い入れて読んでいこうと思います。 余談ですが、確率自体を公理的に定義してしまえば、測度論なしに確率論を進められるっぽいです。 また確率過程論も測度論なしに展開している本があるようで、小倉先生の「物理・工学のための確率過程論」がそれに当たります。 自分は最初この本から勉強し始めたのですが、どうも本質から逃げているように感じてしまい、本棚に戻してしまいました。 以上、おすすめでした。 2018年はインプットは順調でしたが、満足にアウトプット出来なかったことが悔やまれます。 2019年は、引き続き勉強を続けるとともに、アウトプットにも繋げられたらと思います。 目標はつぎの3つです。 論文3本投稿: 昨年は一本しか書けませんでした。 初年度にしては上々だと思っていたのですが、尊敬する若手の人たちのホームページを眺めると、いくつものpublicationや講演が並んでおり、悔しい気持ちになります。 彼らに少しでも追いつくためにも、今年は最低3本は書きたいです。 Webサービス公開: 毎年アウトプット欲が高まる時期に、フレームワークの勉強だけして、満足して何も作らず終わるという現象が続いています。 去年はFlaskでRestAPIの実装をし、Herokuにアップロードするところまで体験できたので、今年は何かしらのサービスを作って実際に公開するところまで進めたいと思います。 どれだけしょぼくてもいいので、見栄をはらずにアウトプットしたいです。目指せいつでも転職できる人材。 博士課程の行先の決定: 過去に何度も進学を考えたことがあったのですが、資金面が主な理由で断念してきました。 弊社の社会人博士制度は比較的整っており、社内のロビー活動さえうまくいけば、会社に勤めながら学位を目指すことができます。 幸い上司は理解を示してくれており、あとは行き先だけという感じです。 4月から少し職場環境が変わりそうなので、それを活かしていろんな先生に会ってみようと思います。 みなさま今年もよろしくお願いします。

January 3, 2019

Langevin方程式とFokker-Planck方程式の対応

$x(t)\in\mathbb R$の時間発展が、つぎの非線形ランジュバン方程式 $$ \dot x(t) = f(x(t)) + R(t) $$ で表されるとする。 ここで、$f:\mathbb R\to\mathbb R$は関数、$R:\mathbb R\to\mathbb R$はランダム力である。 $R(t)$はつぎの仮定を満たすとする。 $R(t)$はガウス過程。 すなわち、$t_1,\ldots,t_k$を選んだとき、$R(t_1,\ldots,t_k):=(R(t_1),\ldots,R(t_k))$が多次元正規分布に従う。 $\mathbb E[R(t)] = 0. $ $\mathbb E[R(t)R(t’)] = D\delta(t-t’)$, ただし$D$は正の定数。 $x(t)$と$R(t’)$が$t<t’$で独立。 時刻$t$に$x(t)$が$[x,x+dx]$にある確率を$p(x,t)dx$と定義する。 $p(x,t)$を分布関数という。 $p(x,t)$はつぎの仮定を満たすとする。 $x\to\pm\infty$で$p(x,t)\to 0. $ $x\to\pm\infty$で$\frac{\partial p(x,t)}{\partial x}\to 0. $ このとき、$p(x,t)$はつぎのフォッカープランク方程式に従う。 $$ \frac{\partial p(x,t)}{\partial t} = \left( -\frac{\partial }{\partial x}f(x) + \frac{\partial^2}{\partial x^2}\frac{D}{2} \right) p(x,t) $$ 証明はいろんなところに載ってる。 あとで追記するかも。

August 24, 2018

OpenCV/ArUcoライブラリで物体位置計測

OpenCVは画像処理に触れたことのある人ならば知らない人はいないと言われるほど有名なライブラリですが、本日はそのモジュールの一つである、AR用ライブラリArUcoを用いて、物体の位置計測をしてみます。 ネットにはC++の記事がたくさん転がっているのですが、Pythonを用いた記事が少ないように感じたため、備忘録としてブログに残そうと思った次第です。 やりたいこと 机の上に座標系を設定し(横の辺が$x$軸、縦の辺が$y$軸とか)、机の上を動き回る物体(小型ロボットとか)の位置座標を、机を撮影するカメラの映像から推定したいです。 準備  PCにPythonはインストールされているとし、OpenCVのインストールから行います。 pip install opencv-contrib-python 動作確認を行いましょう。 import cv2 aruco = cv2.aruco help(aruco) それっぽい文章がわちゃわちゃ出てきたら、インストール成功です。 マーカー生成 ArUcoでは、QRコードのような2次元マーカーを生成し、画像中から生成されたマーカーを認識することができます。 画像の生成は以下のように行います。 dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50) for i in range(5): marker = aruco.drawMarker(dictionary, i+1, 100) cv2.imwrite('ar_marker'+str(i+1)+'.png', marker) ここで、getPredefinedDictionaryはマーカーが格納されている辞書を呼び出す関数であり、DICT_4X4_50は辞書の種類を表します。 また、forループの中では、drawMarkerでidが$i+1$のマーカーを呼び出し、imwriteで呼び出したマーカーを保存しています。 生成された画像はつぎのようになります。 今回マーカーは5つ呼び出しました。 1つは物体に設置し、認識するためのもので、残りの4つは座標変換のためのものです。 マーカー検出 画像中のマーカーを検出するためのコードが以下です。 img = cv2.imread('img.jpg') corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary) img_marked = aruco.drawDetectedMarkers(img, corners, ids) cv2.imwrite('img_marked.png', img_marked) detectMarkersで、画像からマーカーを認識します(たった一行!)。 戻り値であるcornersとidsは、それぞれ検出されたマーカーの座標とidが格納されたリストです。 先ほど生成された画像をモニタに表示させ、手元のカメラで撮影したものを認識させてみました。 結果がつぎのようになります。 座標変換 ArUcoでは、画像中のマーカーの位置を検出することができますが、その位置座標は机の上の座標と必ずしも一致しません。 このため、机の上に座標変換用のマーカーを設置し、それらを用いて座標変換を行うことにします。 この作業は、ArUcoではなく、OpenCVライブラリによって実現できます。 marker_coordinates = np.float32(moments) true_coordinates = np....

March 18, 2018

デルタ関数とは、超関数とは

デルタ関数って結局何なの? 工学の至る所で現れるデルタ関数。これはよく $$ \delta(t):= \begin{cases} \infty, & t=0\\newline 0, & t\ne 0 \end{cases}, $$ $$ \int_\infty^\infty \delta(x-y)f(y)dy = f(x), $$ $$ \int_\infty^\infty \delta(t)dt = 1 $$ を満たす関数 $\delta$ という風に定義されていますが、「 $t=0$ は測度0なので、その積分は0になるのでは」と考えたことがある人は多いのではないでしょうか。 実はこの定義は不正確なものであり、「超関数」という概念によって、正確に定義することができます。 超関数の定義 ある数値を入力するとある数値を出力する装置のことを、関数といいます。 これに対して、ある関数を入力するとある複素数を出力するような装置のことを、汎関数といいます。 汎関数 $F$ に関数 $\phi$ を入力した時の出力値を $F[\phi]$ 、または $\langle F, \phi \rangle$ と書きます。以下では後者の書き方を用います。 全区間で無限回微分可能で、関数値が0でないところが有界区間に限られるような関数の全体からなる集合を $\mathcal D$ とします。 $\mathcal D$ 上に属する関数 $\phi$ をテスト関数と呼びます。 また、 $\mathcal D$ を定義域とする汎関数を $\mathcal D$ 上の汎関数と呼びます。 ここで、シュワルツの超関数は、つぎのように定義されます。 汎関数 $F$ が、 $\langle F, \phi_1 + \phi_2\rangle = \langle F, \phi_1\rangle + \langle F, \phi_2\rangle,$ $\langle F, c\phi\rangle = c\langle F, \phi\rangle\ (c\in\mathbb K),$ テスト関数の列 ${\phi_n}$ が $n\to\infty$ で $\phi$ に収束する時、 $\langle F, \phi_n\rangle$ もまた $\langle F, \phi\rangle$ に収束する を満たすとき、 $F$を超関数という。...

October 15, 2017

カーネル型機械学習入門

$d$個の数値を並べた変数$\mathbf{x}=(x_1,x_2,\ldots,x_d)^{\mathrm T}$から、 $y$という変数を推定する多変量の回帰問題を考えます。 サンプルデータは$n$組あるとし、$i$番目のサンプルを$\mathbf{x}^{(i)}, y^{(i)}$と書くことにします。 線形モデル まず、カーネルを使わない線形モデル $$y = \mathbf w^\mathrm T \mathbf x$$ を考えましょう。これは、データを原点を通る直線で当てはめることを意味します。 直線からのズレに対して、損失を $$r(y,\mathbf{x};\mathbf{w}) = (y-\mathbf w^\mathrm T \mathbf x)^2$$ として定義し、全てのサンプルの総和 $$R(\mathbf{w}) = \sum_{j=1}^n r(y,\mathbf{x};\mathbf{w})$$ を考えます。$R(\mathbf{w})$は $$\mathbf y := \left( \begin{array}{ccc} y^{(1)}\newline y^{(2)}\newline \vdots\newline y^{(n)} \end{array} \right) $$ $$X := \left( \begin{array}{ccc} x_1^{(1)} & \cdots & x_d^{(1)}\newline x_1^{(2)} & \cdots & x_d^{(2)}\newline \vdots& & \vdots\newline x_1^{(n)} & \cdots & x_d^{(n)} \end{array} \right) $$ を用いて、 $$R(\mathbf{w})=(\mathbf y-X\mathbf w)^\mathrm T(\mathbf y-X\mathbf w)$$...

July 23, 2017