TeXで数式をはてなブログに表示して、Atomでプレビュー

はてなブログの設定

[デザイン]>[カスタマイズ]で設定画面を開き、[記事]>[記事下]と[フッタ]に以下のhtmlを挿入する。

<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    tex2jax: {
      inlineMath: [ ['$','$'], ["\\(","\\)"] ],
      displayMath: [ ['$$','$$'], ["\\[","\\]"] ]
    }
  });
</script>

これで$または\(で囲めばMathJaxを利用してTeXを表示できます。

また、中央揃えのときは$$または\[です。

Atomの設定

  1. markdown-preview-plusをインストール

  2. 既存のmarkdown-previewを無効化

  3. markdown-preview-plusのSettingsからEnable Math Rendering By Defaultにチェックを入れる

これでctrl+shift+MTeXMarkdownがプレビューできるようになりました。

感想

ブログをずっとはてなブログで書き続けるという方やライトに書きたい方は[tex:]を使って数式を書いてもいいのですが、他のブログへ引っ越す可能性があったり、Markdownエディタでブログを書こうとしている場合は今回の方法を使った方がいいと思います。自分はブラウザで長い数式を書くのが苦痛だったのでこの方法をとることにしました。

PRML 1章 解答

PRMLの演習問題の解答を書いてみることにしました。
数学の知識は数Ⅲ、Cレベルまでしかないので正確性は求めないでください。あくまで、理解できればいいということで。
もちろんすべての解答を書くとは限りません。
当面は基本問題中心で...

1.5

期待値の公式を使って計算します。 公式はこちらにまとまっています。

期待値と分散に関する公式一覧 | 高校数学の美しい物語


var[f] = E[(f(x) - E[f(x)])^{2}]

2乗を展開して、期待値の中身を分解する


= E[f(x)^{2}] - E[2f(x)E[f(x)] + E[f(x)]^{2}

ここで E[f(x)]を定数と考えると


= E[f(x)^{2}] - E[f(x)]E[2f(x)] + E[f(x)]^{2}


= E[f(x)^{2}] - 2E[f(x)]^{2} + E[f(x)]^{2}


= E[f(x)]^{2} - E[f(x)^{2}]

1.6

共分散の定義は


cov[x,y] = E_{x,y}[\{x - E[x]\}\{y - E[y]\}]

であり、展開すると
(E[x], E[y]は定数であるので公式E[x+a] = E[x] + aを使った)


E_{x,y}[\{x - E[x]\}\{y - E[y]\}] = E_{x,y}[xy] - E_{x,y}[yE[x]] - E_{x,y}[xE[y]] + E[x]E[y]

x,yは独立なので(E[xy] = E[x]E[y]が成り立つ)、また1.5と同様にE[x], E[y]は定数であり、


= E_{x,y}[x]E_{x,y}[y] - E[x]E_{x,y}[y] - E[y]E_{x,y}[x] + E[x]E[y]

因数分解すると


= (E_{x,y}[x] - E[x])(E_{x,y}[y] - E[y])

ここで期待値の定義より


E_{x,y}[x] - E[x] = \int\int p(x,y)xdxdy - \int p(x)xdx

x,yは独立なのでp(x,y) = p(x)p(y)が成り立つので


= \int p(x)xdx \int p(y)dy - \int p(x)xdx

p(y)は確率密度なので \int p(y)dy = 1であるから


= \int p(x)xdx - \int p(x)xdx = 0

よって


E_{x,y}[\{x - E[x]\}\{y - E[y]\}] = 0

1.11


\displaystyle \ln{p({\sf x}|\mu,\sigma)} = -\frac{1}{2\sigma^{2}}\sum_{n=1}^{N}(x_n-\mu)^{2} - \frac{N}{2}\ln{\sigma^{2}} - \frac{N}{2}\ln{(2\pi)}

ここで


\displaystyle \frac{1}{2\sigma^{2}}\sum_{n=1}^{N}(x_n-\mu)^{2} = \frac{1}{2\sigma^{2}}\sum_{n=1}^{N}(x_n^{2} - 2\mu x_n + \mu^{2})


\displaystyle \frac{1}{2\sigma^{2}}\sum_{n=1}^{N}x_n^{2} + \frac{\mu}{\sigma^{2}}\sum_{n=1}^{N}x_n - \frac{N\mu^{2}}{2\sigma^{2}}

よって対数尤度関数を\mu微分すると0になるので


\displaystyle \frac{d\ln{p({\sf x}|\mu,\sigma^{2})}}{d\mu} = \frac{1}{\sigma^{2}}{\sum_{n=1}^{N}x_n} - \frac{N\mu}{\sigma^{2}} = 0

よって


\displaystyle N\mu = \sum_{n=1}^{N}x_n


\displaystyle \mu = \frac{1}{N}\sum_{n=1}^{N}x_n

1.55が示された

\sigma^{2}が最大になるとき、対数尤度関数を\sigma^{2}微分すると0になるので


\displaystyle \frac{d\ln{p({\sf x}|\mu,\sigma^{2})}}{d\sigma^{2}} = \frac{1}{2(\sigma^{2})^{2}}\sum_{n=1}^{N}(x_n-\mu)^{2} - \frac{N}{2\sigma^{2}} = 0

両辺に2(\sigma^{2})^{2}を掛けて


\displaystyle N\sigma^{2} = \sum_{n=1}^{N}(x_n - \mu) ^ {2}

よって


\displaystyle \sigma^{2} = \frac{1}{N}\sum_{n=1}^{N}(x_n - \mu) ^ {2}

1.56が示された

1.12

テキストに書かれている通り最尤解(\mu_{ML},\sigma_{ML}^{2})はx_1,...x_Nの関数であることに注意する。 n = mのとき1.50より


E[x_nx_m] = E[x_n^{2}] = \mu^{2} + \sigma^{2}

I_{nm} = 1なので

E[x_nx_m] = \mu^{2} + I_{nm}\sigma^{2}

n \neq mのときx_nとx_mは独立なのと、1.49より


E[x_nx_m] = E[x_n]E[x_m] = \mu^{2}

I_{nm} = 0なので

E[x_nx_m] = \mu^{2} + I_{nm}\sigma^{2}

(1.130)が示された。また、


\displaystyle E[\mu_{ML}] = E[\frac{1}{N}\sum_{n=1}^{N}x_n]


\displaystyle = \frac{1}{N} \sum_{n=1}^{N} E[x_n]

E[x] = \muより

= \frac{1}{N} N\mu = \mu

よって1.57が示された。

また、


\displaystyle E[\sigma_{ML}^{2}] = E[\frac{1}{N} \sum_{n=1}^{N}(x_n - \mu_{ML})^{2}]


\displaystyle = \frac{1}{N} \sum_{n=1}^{N} E[(x_n - \mu_{ML})^{2}]


\displaystyle = \frac{1}{N} \sum_{n=1}^{N} E[x_n^{2} - 2x_n\mu_{ML} + \mu_{ML}^{2}]

ここで \displaystyle
E[x_n^{2} - 2x_n\mu_{ML} + \mu_{ML}^{2}] = E[x_n^{2}] - 2E[x_n\mu_{ML}] + E[\mu_{ML}^{2}] \tag{1}

(1)の第1項は


E[x_n^{2}] = \mu^{2} + \sigma^{2}

(1)の第2項は

\displaystyle
-2E[x_n\mu_{ML}] = -2E[x_n \frac{1}{N}\sum_{m=1}^{N}x_m]

\displaystyle
= -\frac{2}{N} \sum_{m=1}^{N} E[x_nx_m]

(1.130)より

\displaystyle
= -\frac{2}{N} \{(N-1)\mu^{2} + \mu^{2} + \sigma^{2}\}

\displaystyle
= -2\mu^{2} -\frac{2}{N} \sigma^{2}

(1)の第3項は

\displaystyle
E[\mu_{ML}^{2}] = E[(\frac{1}{N} \sum_{n=1}^{N}x_n)^{2}]

この変形が肝!

\displaystyle
= \frac{1}{N^{2}} \sum_{n=1}^{N} \sum_{m=1}^{N} E[x_nx_m]

(1.130)より

\displaystyle
= \frac{1}{N^{2}} \{N(\mu^{2} + \sigma^{2}) + (N^{2}-N)\mu^{2}\}

\displaystyle
= \frac{1}{N} (\mu^{2} + \sigma^{2} + N\mu^{2} - \mu^{2}) = \frac{\sigma^{2}}{N} + \mu^{2}

よって(1)は

\displaystyle
\sigma^{2} - \frac{1}{N}\sigma^{2} = (\frac{N-1}{N})\sigma^{2}

よって

\displaystyle
E[\sigma_{ML}^{2}] = \frac{1}{N} \sum_{n=1}^{N} (\frac{N-1}{N})\sigma^{2} = (\frac{N-1}{N})\sigma^{2}

これで1.58が示された。

参考

第1章 序論 - Google ドライブ

今年の目標

明けましておめでとうございます。新年ということで自分なりの今年の目標をまとめてみました。
これが1年で達成できるとなかなか立派なプログラマーになれそうですねえ。
まあ、6割以上は達成できるようになりたいです。

  1. アセンブリ言語をマスターする
    よりハードウェアに近いことを理解しようと思うと常にアセンブラにぶつかるのでそろそろ身に付けたい。 リバースエンジニアリングにも興味がある。

  2. C/C++を実用レベルまで習得する
    アセンブラに関連してC/C++で書かれたソースコードは多いし、基礎となる言語なので身に付けたい。

  3. ダンなWebサイトを作るのに必要な技術を身に付ける
    JavaScriptのライブラリやCSSなどを使えるようになりたい。
    Web界隈は非常に込み入っているイメージがあり、あまり手を付けたくなかったのだが、最近よく聞くElectronにはWeb技術が使われているようで、Webサイトに興味がなくても無視できない存在になっていると感じた。

  4. セキュリティについて勉強する(のに必要な知識を付ける)
    先日、セキュリティ関連の本を読んだところ、アセンブラやデバッガ、Linuxカーネルの話題などがありついていけなかった。
    幅広い知識が必要なのだと実感した。

  5. 効率的にプログラムを開発できるようにする
    すこし規模の大きなプログラムを作ろうとすると、設計が上手くいかなくなる。デザインパターンを勉強したい。 また、gitやIDEを使いこなせるようになりたい。

  6. 機械学習ディープラーニングについてアルゴリズムを理解し、実用できるようにする
    取り敢えず、PRMLとコード主体の機会学習の本を読む。

  7. 数学
    まともに大学で数学を勉強できないので、しばらくは独学で頑張るしかない。

  8. 英語
    プログラミングには直接関係ないけど。TOEIC750点、TOEFL550点ぐらい取れるようになりたい。

  9. アプリ開発
    自分で作ったアプリを公開してみたい。まずはUWPとAndroidで。
    iOS用にも作ってみたいがiPhoneMacもないから難しそう。(というか無理)
    最近、Xamarinを始めようとしている。C#にも手を出すことになるとは...

TeXで数式をはてなブログに表示する

(初期設定がやや面倒ですが[tex:]記法ではなくこちらの方がおすすめです。 1/11追加) stronger.hatenablog.com

数学のお勉強をちゃんとしようと思い、(おそらく)このブログにも書いていくことにした。

そのためには数式を書く必要があるのでTeXの書式について調べてみた。

以下の数式は機械学習において有名な本「パターン認識機械学習」(通称: PRML)に載っていたものです。

加法定理


\displaystyle p(X) = \sum_{Y} p(X, Y)

乗法定理


p(X, Y) = p(Y | X)p(X)

ベイズの定理


\displaystyle p(Y, X) = \frac{p(X | Y) p(Y)}{p(X)}

正則化した誤差関数


\displaystyle \tilde{E}(\mathrm{W}) = \frac{1}{2} \sum_{n = 1}^N \{ y(x_n, \mathrm{W}) - t_n\}^{2} + \frac{1}{2}||\mathrm{W}||^2

[tex:TeXのコマンド]で数式を表示する。

コマンド自体の使い方はhttp://www.latex-cmd.com/を参考にした。

\displaystyleを使うことで分数や総和が見やすくなる

最後の数式の中括弧は\\{とエスケープしないと表示されなかった(30分ぐらい悩んだ...)

恐らくMarkdown記法によるものではないかと思う。他のはてなブログでは表示されていたので。

(確認したところはてな記法では\{のように1回だけエスケープが必要だった。 12/20) 他にも]_などエスケープが必要なものがあります。うまく表示されないときは怪しい文字(MarkdownTeXのメタ文字)をエスケープするといいかもしれません。

以下がソースです。繰り返しになりますが、Markdownで書いています。

加法定理

[tex:
\displaystyle p(X) = \sum_{Y} p(X, Y)
]

乗法定理

[tex:
p(X, Y) = p(Y | X)p(X)
]

ベイズの定理

[tex:
\displaystyle p(Y, X) = \frac{p(X | Y) p(Y)}{p(X)}
]

正則化した誤差関数

[tex:
\displaystyle \tilde{E}(\mathrm{W}) = \frac{1}{2} \sum_{n = 1}^N \\{ y(x_n, \mathrm{W}) - t_n\\}^{2} + \frac{1}{2}||\mathrm{W}||^2
]

数学や機械学習の本を読むと難しい数式が出てきて、抵抗感があったのですが、TeXを使うことでより数式が身近なものに感じてきました。

プログラムは好きだけど数式は苦手という人はTeXから入るといいかもしれない。

参考サイト

www.latex-cmd.com

whoisコマンドについて

インストール方法

Windows

以下のリンクからファイルをダウウンロード、解凍し、exeファイルをパスの通っているディレクトリに置く。

https://technet.microsoft.com/ja-jp/sysinternals/whois.aspx

Linux(CentOSの場合)

yum install whoisではインストール出来ない

sudo yum install jwhois

使用方法

whois [ドメイン名]

注意

VPNに繋いで使おうとしたところWindowsでもLinuxでもwhoisコマンドが使えなかった。

VPNから切断したところ使えたため、接続先のファイアーウォールで止められてしまったためと思われる。

whoisコマンドはTCPの43番ポートを使う。

Pythonの辞書の要素を削除しようとするとdictionary changed size during iterationと言われた

辞書からある条件に一致する要素を削除しようと思い、下のようにすると

for key in dic.keys():
    dic.pop(key)

エラーが出てきました。

RuntimeError: dictionary changed size during iteration

こうすれば大丈夫です。

for key in list(dic):
    dic.pop(key)

forを使って辞書を操作する時は基本的にlist()を使った方がいいかもしれない