2014年12月20日土曜日

MarkDown形式の可能性

markdown

Markdown形式

最近いろいろとMarkdown形式で書く様にした。 理由としては、
  • 生のファイルが(それなりに)見やすい
  • シンプルな記述
  • 数式のサポート(拡張Markdownのみ)
  • ソフト、OS非依存、プレーンテキスト
  • 他形式への出力が容易
  • サポートしているサービスが多い(Tumblr, Github等)

Markdownとはなにか?

http://ja.wikipedia.org/wiki/Markdown
じつは、あのAaron Swartzが開発に関わってたんですね。

MarkdownのSyntaxを知る

上のWikiにも書いてあるが他にも、
githubによる簡潔なMarkdownの説明
https://help.github.com/enterprise/2.0/user/articles/markdown-basics
Markdownには表や数式サポートといった機能がない。 Githubが導入したGitFlavoredMarkdownではそういった種々の機能を持っている。以下のリンクで説明されている https://help.github.com/enterprise/2.0/user/articles/github-flavored-markdown/
日本語のページだと、
http://qiita.com/Qiita/items/c686397e4a0f4f11683d
ブラウザエディタもあるので気軽に試してみてほしい。(一部のコードが正しく表示されないようだ。)
http://markdownlivepreview.com/

各種ツール

Markdownはレンダリングしないと、やはり生のテキストだと編集していて間違いに気付きにくい。 専用のエディタを導入するとよい。
以下のページで幾つか紹介されている。
http://www.find-job.net/startup/20-markdown-editors
筆者はMacdownしか試していないが、以下に箇条書きで感想を述べる。
良いところ
  • オープンソースでライセンスがMIT(うろ覚え)
  • リアルタイムプレビュー
  • 拡張Git形式を各種サポートしており、機能を使うか使わないか細かく設定できる。
  • Syntax Highlight をサポートしている(おそらくGithub準拠?)
  • 数式をサポート(インターネット接続必須、MathJax)
  • 文法チェックと、スペルチェックがあるのが地味にうれしい。
  • テーマにSolarizedが標準で入ってる!
  • PDF、HTMLにそのまま出力できる!
  • キーバインドが標準的
他にも、筆者は試していないがSpeaking機能があって機械音声で文章を読み上げてくれる。 無料のソフトとは思えないほど所々の機能が充実している。
悪いところ
  • テキストが1000行程度になってくると挙動が重たくなってくる。ASCIIファイルだとそんな事はないようなので、Unicodeをレンダリングするのが負荷になっているのかもしれない。
  • 行数が多くなってくると表示がずれてくる。
  • 勝手に変更を保存してしまうので、たまにいらつく。
  • 数式が重すぎて使い物にならない(今後に期待)
  • タブ非対応
  • キーバインドが設定できない。
  • 置換/検索機能が貧弱。正規表現すら使えない。
その他細かい部分に手が回らなくてなんかもったいない気もする。
色々ぼろくそに書いたが、シンプルにできていて非常に使いやすいソフトだと感じた。 というかあれこれ文句をいうなら開発に参加しろって話ですよね…

この記事もMarkdownで書いているのだが、BloggerはMarkdown形式での投稿に対応していないようだ。はてなやTumblrが対応している事から分かる様に、Googleはブログサービスのやる気がないようだ。もうTumblrに移行しようか本気で悩む。

2014年11月3日月曜日

Martingale CLT

外に出かける用事があったのだけど、急遽予定が変わったのでブログの更新でもする。 数理統計学で良く用いられる Martingale Central Limit Theorem について最近少し勉強したのでメモ。
統計学や確率論を知っている人なら中心極限定理(CentralLimitTheorem)を知っているだろう。
古典的なCLTは次の様な、$i.i.d$のケースであろう
Let $\{\ X_n\ \}_{i=1}^{\infty}$ be $i.i.d$, square integrable r.v's.
Suppose that $\ \mathbb{E}[X] \ = \ 0 \ $ and $\ \mathbb{E}[X^2] \ = \ 1 \ $. Then \begin{align} \frac{1}{\sqrt{n}}\sum_{i=1}^n X_i \xrightarrow{d} \mathcal{N}(0,\ 1) \quad \text{as} \quad n \to \infty \end{align} holds
Lindebergは、ここからさらに$\ i.i.d\ $という仮定を取り去って次の古典的Lindeberg条件を考えた。
Tailの振る舞いに条件をつける。 \[ \text{(LC)} \quad \sum_{k=1}^{k_n}\mathbb{E}\large[(\xi_k^n)^2\large1_{\{|\xi_k^n|>\epsilon\}} \large] \ \xrightarrow[n \to \infty] \ 0 \quad \text{for every} \quad \epsilon > 0 \] これに、エネルギーの条件を加える。 \[ \text{(E)} \quad \sum_k^{k_n}\mathbb{E}\large[ (\xi_k^n)^2 \large] = 1 \quad \text{for all} \quad n \ge 1 \] Let $\{\ \xi_k^{n}\ \}_{k=1}^{k_n}, \ n\ge1 $ be independent, square integrable r.v's.
If Triangular Array $\{\ \xi_k^{n}\ \}_{k=1}^{k_n}, \ n\ge1 $ satisfies the condition (E) and (LC), then \begin{align} \sum_{k=1}^{k_n} \xi_k^n \xrightarrow{d} \mathcal{N}(0, \ 1) \end{align}
証明に関しては例によって、特性関数の一意性を用いる。つまり、 \[ \mathbb{E}\large[ \exp(iu\sum_{k=1}^{k_n}\xi_k^n) \large] \xrightarrow[n \to \infty] \ \exp(\frac{1}{2}u^2) \quad \text{for every} \quad u \in \mathbb{R} \] 講座 数学の考え方〈21〉数理統計学:吉田 に多次元の場合の簡潔な証明が載っている。
最初の定理の仮定は、(E)と(LC)を満たすとすぐにわかるであろう。 しかし、この場合もまだ独立性という非常に強い仮定の下にしか収束が言えていない。
そこで、Martingale CLT が出てくる。
上の、条件(E), (LC)を Conditional Expectation で弱めたとしても、成り立つという定理である。 \[ \text{(CLC)} \quad \sum_{k=1}^{k_n}\mathbb{E}\large[(x_k^n)^2\large1_{\{|x_k^n|>\epsilon\} } |\mathscr{F}_{k-1}^n \large] \ \xrightarrow[n \to \infty]{p} \ 0 \quad \text{for every} \quad \epsilon > 0 \] \[ \text{(CE)} \quad \sum_{k=1}^{k_n}\mathbb{E}\large[ (x_k^n)^2 |\mathscr{F}_{k-1}^n\large] \xrightarrow[n \to \infty]{p} 1 \quad \] 定理のステートメントはなるべく正確に書く。
$(\Omega, \mathscr{F}, P)$ が$n$毎に変化してもよいが、簡単化の為に全て共通とする。 Let $(\Omega, \mathscr{F}, P)$ be probability space and $\ \mathbb{F}^n := \{\mathscr{F}_k^n \}_{1\ \le k \le \ k_n }$ be filtration of $\mathscr{F}$ for each $n \ge 1$ and
$\ \{\ \xi_k^{n}\ \}_{k=1}^{k_n}, \ n\ge1 $ be Martingale Triangular Array(MTA) i.e.
$\xi_k^n \ $ is $\ \mathscr{F}_k^n $ m'ble and $\ \mathbb{E}[\ x_k^n \ | \ \mathscr{F}_{k-1}^n ] = 0$.
If MTA $\{\ \xi_k^{n}\ \}_{k=1}^{k_n}, \ n\ge1 $ satisfies conditions (CE) and (CLC), then \begin{align} \sum_{k=1}^{k_n} \xi_k^n \xrightarrow[n \to \infty]{d} \mathcal{N}(0, \ 1) \end{align}
証明の方針としては、エネルギーの条件を弱めた場合にまず証明をする \[ \text{(CE)'} \quad \sum_{k=1}^{k_n}\mathbb{E}\large[ (\zeta_k^n)^2 \xrightarrow[n \to \infty] \ 1 \quad \] このとき、(CE)'と、(CLC)を満たす場合に、まず特性関数を評価してやって収束を示す。
原論文の証明はかなりテクニカルなので詳細は省く。本質的には古典的なCLTの証明と変わらないと思う。
一方でそんな都合のよい$ \{\ \zeta_k^n \ \} $ がみつかるのかと言うと、もとの奴らを適当にカットオフしてやると上手くいく。
それがこの証明の面白い所だ。 \[ V^n_k := \sum_{i=1}^k \mathbb{E}\large[ (\xi_i^n)^2 |\mathscr{F}_{k-1}^n \large],\quad 1 \le k \le k_n \quad \] $c > 1 \ $を任意にとり、$\ \zeta_k^n := x^n_k1_{\{ V_k^n \le c \}} \ $とおく。
そうすると、これが求めるMTAになっている。つまり、
  1. $\{\zeta_k^n\}_{1\le k \le k_n}, n\ge 1$ はMTAである
  2. 条件(CE)'を満たす
  3. 同様に、条件(LCL)も満たす。
(1), (3)はかなり明らかである。 (2)も、直感的に明らかであるが、次のようにして示される。 \[ W^n := \sum_{k=1}^{k_n} \mathbb{E}\large[ (z_k^n)^2 | \mathscr{F}_{k-1}^n\large] \] に対して、 \[ P\{W^n \le c \} = 1 \quad \forall n\ge1, \\ W^n \xrightarrow[n \to \infty]{p} 1 \]を示せば、二つ合わせて$W^n$の$L^1$収束が言える。それはすなわち、(CE)'の成立である。 参考文献として以下を挙げておく。
ちなみに筆者は統計を専攻しているわけでもなんでもない素人なので注意。
B.M.Brownによる原論文は短く簡潔なので、すぐに読める。 Margingale CLTに関するSurveyもあるが、有料。Springerと契約していれば無料。 色々調べている中で読んだこれは間違いだらけなきがします。違いましたらコメントで教えてください。

MathJaxを使って数学の記事を公開するのは初めてだったので、かなり時間がかかってしまった。
自分の効率の悪さで死にたくなってしまった。もっと素早く書く方法はないだろうか…。

2014年9月25日木曜日

[Python] どうでもいいClosure

最近Closureについての記事を見かけることが多いので、まとめる。
ref(えいご) ref(にほん語)

  1. closureの基本
  2. Closure = function + environment
    これをOOPの文脈で置き換えると
    Class = Method + member(attributes)
    Closureのほうはあくまで関数が主役。
    次のPythonのコードは典型的なClosureの応用
    def fibonacci_factory():
      memo = {}
      def fibonacci(n):
        if n in memo: return memo[n]
        if n < 1: return 1
        memo[n] = fibonacci(n-1) + fibonacci(n-2)
        return memo[n]
      return fibonacci
    
    ファクトリの呼び出しにより、fibonacci関数が作成され関数は内部的に memo というローカル変数への参照を保持し続ける。
    pythonでは、__closure__ attribute を用いて内包している環境を見る事ができる。
    f = fibonacci_factory()
    f(100) # -> 927372692193078999176
    print(f.__closure__) # -> tuple of cell object
    print(f.__closure__[0].cell_contents) # -> function oject of f itself
    print(f.__closure__[1].cell_contents) # -> might be a dictionary
    
    環境が、cell object のタプルとして保存されているのをみることができる。
    もう一度ファクトリを呼び出すと異なる環境を保持するfibonacci関数が作成される。
    g = fibonacci_factory()
    id(g.__closure__[0]) == id(f.__closure__[0]) # -> false
    
    f と g では各々別々のメモ辞書を持ってるのが分かる。
    別の例として、呼び出す毎に内部変数が1ずつ増えていくカウンターを考える

    def counter_factory():
      x = 0
      def _counter():
        nonlocal x  
        x += 1
        print(x)
      return _counter
    
    上の nonlocal せんっげんはpython3から新しく追加されたもので、これを付けないと、下の様なエラーになる。
    counter_factory()()
    ---------------------------------------------------------------------------
    UnboundLocalError                         Traceback (most recent call last)
     in ()
    ----> 1 counter_factory()()
    
     in _counter()
          2   x = 0
          3   def _counter():
    ----> 4     x += 1
          5     print(x)
          6   return _counter
    
    UnboundLocalError: local variable 'x' referenced before assignment
    
    ファクトリ内部関数での x へのアサインメントは上手くいかない。というのはスコープ外の変数への代入だからである。
    従って、x は一つ上のスコープの変数なんですよ、という宣言が必要になる。
    ちなみに、attribute を用いる事でnonlocal宣言を回避して、クロージャっぽいものを作る事もできる。
    def counter_factory():
      def _counter():
        _counter.x += 1
        print(_counter.x)
      _counter.x = 0
      return _counter
    
  3. Closureとアクセサ
  4. 次に、クラスオブジェクト的な操作を模倣することを考える
    例えば、オブジェクトであればアクセサやらプロパティを用いて、内部で保持している変数(attributes)を変更できる。
    同じ事をクロージャでやってみたいが、__closure__ attribute は tuple なので直接変更できない。
    上で用いた nonlocalせんっげん を使って、アクセサ関数を作って一緒に返してやればよい

    def counter_factory():
      x = 0
      def _counter():
        nonlocal x  
        x += 1
        print(x)
      def set_count(new_x):
        nonlocal x
        x = new_x
      def get_count():
        return x
      return (_counter, set_count, get_count)
    
    get_countには nonlocal は必要ない。単に参照するだけだからである
    正直こういった使い方は邪道な気がする

  5. クロージャとクラス変数

  6. 一部の環境を他のクロージャと共有したい場合があるでありそう
    クラスであれば、単にクラス変数を用いれば実現できるが、クロージャだとどうなるだろう?
    そのときはファクトリのファクトリを作って、共有したい変数を第一レベルに置いて各々の関数で保持したい変数を第二レベルにおけばよい。
    大まかな作りは次のようになるはず
    def factory_factory(x):
      share_var = ... # some collections
      def _factory(y):
        each_vars = ... # some other collections
        def __process(z):
          someprocesses
        return __process
      return _factory
    
    こうしてやると、x, share_var は全体で共有することになって、y, each_vars は各々で保持する
    応用として、二つのカウント値を持ったカウンタを作る。
    一つは全体で共有するカウント値で、もう一つは各々別々に持つカウント値である
    def counter_fact_fact():
      whole_count = 0
      def _counter_fact():
        _count = 0
        def __counter():
          nonlocal _count, whole_count
          _count += 1
          whole_count += 1
          return (_count, whole_count)
        return __counter
      return _counter_fact
    
    アンダーバーが多くて醜い(^q^)
    実際に呼び出して使ってみると、ちゃんと動いくうぃ(^q^)
    cf = counter_fact_fact()
    f = cf()
    g = cf()
    f() # -> (1, 1)
    g() # -> (1, 2)
    f() # -> (2, 3)
    g() # -> (2, 4)
    
  7. まとめ
  • 単なるメモ化程度ならばクロージャは便利だし、デコレータと組み合わせると色々な操作がシンプルに書ける
  • 継承をclosureで実装するにはどうすればいいだろうか?
  • 基本的にpythonはOOPLなので、無理せずクラスを作った方が良い場合が殆どだろう
  • どのようにしてクラスオブジェクトとクロージャを使い分けてやればいいのか明確な判断基準が欲しいところ
  • ブログかくのめんどい(^q^)

2014年9月22日月曜日

John,

海外アニメを見てたら、
we need to go after johns.
って表現が出てきた。
Johnって誰やねん、と思ってWikiで調べたら売春婦の客の事を指すらしい(以下引用)
The clients of prostitutes are also known as johns or tricks in North America and punters in the British Isles. These slang terms are used among both prostitutes and law enforcement for persons who solicit prostitutes.[13] The term john may have originated from the frequent customer practice of giving one's name as "John", a common name in English-speaking countries, in an effort to maintain anonymity.
(引用終わり) 北米におけるポピュラーな名前だからとか、日本だとたかしとかそんな感じだろうか。

さっき某掲示板を見ていたら pastes.org とかいうスニペットの共有サイトに、色々な人の個人情報があげられているというのが話題になっていた。
ドメイン指定して、知りたい言葉で検索するとあれこれ出てくる。
例:発送のお知らせ site:pastie.org
これで知った情報を使って他人のアカウントに入ると不正アクセス禁止法違反なので注意しましょう。

2014年7月28日月曜日

test for mathjax $$ \partial_t u(t,x) = \partial_x^2 u(t, x) $$ mathjaxは重いとか色々言われているわけですけど、実際に使って見るとたしかに重い。 しかし特に難しい設定やインストールなしにきれいに数式が表示されるというのは素晴らしい。

2014年7月27日日曜日

[R] あーあーあーあ

最近はデータ分析やらが流行なので私の学科でもそういう多変量解析を実際にやってみる講義もあったりする。
まあせっかくなので単位の足しにするために出席してたりしたのだが、
 R Programmingはあまりやらなかったので現状使いこなすのが難しい。

 というわけでもう少し体系的にRを勉強する事にした。
 とはいっても自分でドキュメントを読むのとかダルすぎる。
 ネットで情報を漁るのも時間がかかりすぎる。

Courseraにあるコースが結構お手軽。 英語だけど字幕があればなんとかなるレベル。


・Rの コードをblogに埋め込もうと思ったがいい感じのスクリプトがなかったのでgistを使う。
 1.gistに飛ぶ
2.コードを貼付ける
3.create public gistを押すと埋め込み用のタグがでてくるのではっつける
すると以下のようにいい感じになる。

2014年7月21日月曜日

日々の生活を漫然と過ごしているとどうしようもない気分になってくる。 せっかくなのでここに私が勉強した事などのメモを逐次残していく。 日記に書くという手もあるが公開し人の目に触れられる形で残しておく方が私としても頑張って記録を残す気になるというものなのではないかと期待している。 恐らく殆どの場合、閲覧するのは私自身と言う事になるであろう。

2014年3月11日火曜日

this is python code test
#This is a test
for i in range(100):

    print 'Hello World'

    print i
This is a syntax highlighting test.

class Myclass(object):
  __init__(self, x):
    brabra....