2014年4月21日月曜日

サクラエディタで Aspell のマクロを作ってみる(不完全版)

サクラエディタを最近試してみており、そのなかからスペルチェックの Aspell を呼び出そうと考えている。
ただ、TeX Wiki の情報
http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?%E3%82%B5%E3%82%AF%E3%83%A9%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%2F%E3%83%9E%E3%82%AF%E3%83%AD

からたどれる情報は更新されていないようで、現在のサクラエディタだとうまく利用できなかった。

少しマクロなどを修正して、現状としては以下のようにしている。
--- aspell.js ----

(function () {
    var c = Editor.ExpandParameter("$e");
    var b = Editor.GetFilename();
    var cd = "cd /d " + ["\"", c, "\""].join("");
    var aspellcmd = "\"c:\\Program\ Files\ \(x86\)\\Aspell\\bin\\aspell.exe\" --lang=en -c -t" + " " + ["\"", b, "\""].join("");
    var cmd = "cmd /c " + cd + " && chcp 65001 && " + aspellcmd;
    Editor.FileSave();
    var objShell = new ActiveXObject("WScript.Shell");
    objShell.Run(cmd,1,1);
    Editor.FileClose();
    var movecmd = "cmd /c " + cd + " && " + "move " + b + ".new " + b;
    objShell.Run(movecmd,1,1);  
}.call(this));

--- ここまで ---

これを設定フォルダ(サクラエディタの「設定」->「共通設定」として出てくるダイアログの左下にある「設定フォルダ」を押すと表示されるフォルダ)において、「共通設定」の「マクロ」タブで登録すると利用できるようにはなる。

ただ、まだ機能面で不足があって、
(1) a.txt を Aspell にかけると a.txt.new というファイルに結果が保存されて、a.txt.new を a.txt に移動している。このあとで、 Editor.FileReopen() をかけると空の状態でエディタに表示されてしまう(ファイルが「無題.txt」になる)。「X」ボタンでファイルを一度閉じた後に、もう一度開けると、Aspell のかかった結果を表示できる。
(2) ファイルが UTF-8 の場合、コマンドプロンプトのコードを chcp 65001 で UTF-8 に変換しているが、フォントが合わないため日本語部分が誤って表示される。Aspell 自身は日本語部分を飛ばして処理するようで処理自体は問題ないのだが、フォントを変更するにはレジストリを regedit で修正する方法がある。regedit ではなく、コマンドプロンプトからのコマンドで修正できるかどうか、がよく分かっていない。

となっている。



2014年4月10日木曜日

要約メモ:Math Prog A, Vol 144, No. 1-2

だいたいどんなことが研究されているか、一部の論文を抜粋して簡単にメモしておく。

[1] Iteration complexity of randomized block-coordinate descent methods for minimizing composite function
Richtarik and Takac

Nesterov の一次法のあたりでよく見かける
min : F(x) = f(x) + Psi(x)
の形式の問題を解いている。ベースになっているのは、Nesterov の 2012 の SIAM J. Optim の論文だが、ここでは、ベクトル x をいくつかのブロックに分解して、それぞれのブロックごとに手法を適用している。これは、例えば、 x のうちのx_1 から x_100 まで、などブロック単位で区切って処理しないとならないほど大きな問題などを想定できる。

解析の中では、Lipsitz 連続や strong convexity などを利用するタイプ。
また、完全に最適解に収束させるわけではなくて、確率的に収束させるタイプ。(99% 以上の確率で最適値とのずれが 0.01 以内、といった感じ。)


[2] On the complexity of finding first-order critical points in constrained nonlinear optimization
Cartis, Gould and Toint

min: f(x) such that c(x) = 0
という制約付き最適化問題に対する KKT 条件の近似解を求めるのに必要な計算量は、
min: fbar(x)
のように制約なしの場合から本質的には増えたりしない、ということを言っている。

解析の道具としては、信頼領域法のアルゴリズムを利用している。

[3] An introduction to a class of matrix cone programming
Ding, Sun and Toh

この論文のMatrix cone programming は、
min { c^T x | A x \in b + Q \times K}
の形で定式化されている。ここで、Qは基本的には対称錘なので、second-order cone や SDP などを含む。また、 K は epigraph による錘で、
epi (f) = {(t,X) : t \ge f(X)}
といったもの。
このような定式化に含まれるのは、Matrix completion, Robust PCA, 低ランク行列近似などがある。

アルゴリズムの基本要素は、錘などへの射影計算。

[4] A unified approach for minimizing composite norms
Aybat and Iyengar

この論文も composite の関数の最小化で
min    mu_1 || F(X) -G ||_{alpha}   + mu_2 || C(X) -d ||_{beta}
subject to A(X) - b \in Q.
という問題が対象。ここで、alpha と beta のノルムは 1-norm, 2-norm などがある。
解法としては、augmented Lagrangian がベース。


2014年3月20日木曜日

SDPA-M for 64bit Windows MATLAB バイナリを作成

SDPA-M の Windows 版については、いままで 32bit しか提供していなかったが、64bit でもコンパイルに成功したので、これをダウンロード可能とした。ファイルは、

https://sourceforge.net/projects/sdpa/files/sdpa/windows/sdpam-7.3.9-windows.zip

に置いてある。

64bit バイナリは、Debian jessie 上のmingw64で MatlabR2014a 用にコンパイルしている。
コンパイルするうえでのポイントは以下の通り。

[1] クロスコンパイラとして x86_64-w64-mingw32 の系統を使う

[2] OpenBLAS の libopenblas.a がなぜか ranlib がかかっていないことがたまにあるので、
$ x86_64-w64-mingw32-ranlib libopenblas.a
を明示的に実行

[3] pthreads は mingw64 でインストールされているので、それを利用できる
(以前のSDPA-Mのコンパイルでは、別途 cvs でダウンロードしてコンパイルしていたが、その必要がなくなった)

[4] mingw の DLL 依存を外すために、
x86_64-w64-mingw32-gcc, x86_64-w64-mingw32-g++, x86_64-w64-mingw32-gfortran には
-static オプションを追加する
なお、sdpa.exe DLL 依存の状況は、
$ x86_64-w64-mingw32-objdump -p sdpa.exe | grep DLL
などとするとわかる。

[5] mex を mingw でコンパイルするときには、Windows の Matlab から
$MATLAB_ROOT/extern/include/*.h と
$MATLAB_ROOT/bin/win64/libmex.dll,$MATLAB_ROOT/bin/win64/libmx.dll をコピーしてくる必要がある。
なお、Windows の Matlab に libmex.lib や libmx.lib があり、これを使ってもコンパイルができてしまうが、実行時に Matlab がハングアップするので、dll と lib の違いには気を付ける。


2014年3月11日火曜日

書籍「はじめての最適化」

今回チェックした書籍は、「はじめての最適化」である。

Amazon へのリンクなら
http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96-%E9%96%A2%E5%8F%A3-%E8%89%AF%E8%A1%8C/dp/4764904500
である。

内容としては、凸関数から始まり、制約なし最適化、制約付き最適化と非線形最適化問題を見た後に、線形計画問題に移って、変分問題を扱っている。

このうち、非線形最適化問題のあたりは、KKT 条件などのグラフが多く、視覚的な理解が深まりやすいと思う。

また、個人的には双対問題の解釈が分かりやすくて、とてもいいと思う。
双対問題は、定式化からの天下りになりやすいが、栄養問題と食品購入料の不等式を考えるようになっており、よく考えられた説明である。


2014年2月13日木曜日

Iguana TeX で日本語を通す

Powerpoint に TeX の数式を入力するアドインとして、IguanaTeX があるが、これだと dvi から png への変換が dvipng コマンドのために日本語に対応していない。

この場合は、Imagemagick の convert を使うように修正すると日本語を通すことができる。
以下は作業手順。

1. w32tex を
http://did2memo.net/2012/04/23/easy-latex-install-windows-201204/
にある方法でインストール。
(他の方法でも、パスが通っていればもちろん問題ない。)

2. Imagemagick をインストールする
今回は、
C:\Program Files\ImageMagick-6.8.8-Q16
にインストールされたので、このディレクトリに行って convert.exe を convert2.exe にコピーする。
(Windows 自体にも convert コマンドがあるので、衝突を避けるため。)

3. IguanaTeX をインストールする
このときに、ソースも一緒にインストールすること

4. IguanaTeX のマクロを修正する
C:\Program Files (x86)\IguanaTex\IguanaTex64.pptm
を「ドキュメント」などにコピーして、IguanaTex64-platex.ppam などとリネームする。
これを powerpoint で開いて、「表示」→「マクロ」→「NewLatexEquation」を選択して、「編集」を押す。
VBA の編集画面になったら、左の方にある「Macros」を開いた後に、「編集」→「検索」で対象を「カレントプロジェクト」にして、"tight" で検索する。

tight が検索されたところの少し前に
retval& = Execute("latex -interaction=batchmode """ + FilePrefix + ".tex""", TempPath, debugMode)
という行があるので、これを
retval& = Execute("platex -interaction=batchmode """ + FilePrefix + ".tex""", TempPath, debugMode)
に修正する。
また、tight が検索されたところの少し後に
    Execute "dvipng " & DviPngSwitches & " -o """ & FilePrefix & ".png"" """ & FilePrefix & ".dvi""", TempPath, debugMode
とあるのをコメントにしておいて、その代わりに
   Execute "convert2 -debug ALL -density 600  -trim -transparent white """ & FilePrefix & ".dvi"" """ & FilePrefix & ".png""", TempPath, debugMode
を追加する。
ここまできたら、保存して、VBA の編集画面を閉じる。

5. アドインの保存
Powerpoint の「ファイル」→「名前を付けて保存」でファイルの種類を *.ppam にして、IguanaTex64-platex.ppam として保存する。

6. アドオンの登録
Powerpoint の「ファイル」→「オプション」で「アドイン」を選択して、「管理」のところを「COMアドイン」から「PowerPointアドイン」に変更して「設定」を押す。
「新規追加」から IguanaTex64-platex.ppam を追加する。


これで一通り作業は終わりなので、あとは通常通り IguanaTeX を使えば、日本語が通るようになる。
ただし、ImageMagick の convert が遅いようなので、PC のスピードによっては、日本語になるまでに10秒程度待つこともある。

うまくいかないときには、IguanaTeX のdebug にチェックボタンを押して実行して、作業途中で一次領域のC:\Tempを参照すると、情報が得られるときがある。


2014年2月7日金曜日

双対定理における実数空間の完備性の意味

双対定理は、数理最適化の定理の中でも極めて重要な定理であるが、双対定理を示すうえで根幹となるのは、実数空間の完備性である。

ここでは、簡単に双対定理のためになぜ実数空間の完備性が必要か、見てみることにする。

非線形最適化問題の双対定理の証明は、手元にある和書だと見つからなかったが、洋書の場合には、

"Foundations of Optimization" by O. Guler

の定理11.15である。この証明で使うのが、定理11.14のConvex Transposition Theoremであり、これは Farkas の Lemma を非線形最適化問題に一般化したものである。

定理11.14 に使われるのが、分離定理である。分離定理の証明については、日本語でも書かれており、例えば、

凸解析と最適化理論, 田中兼輔

に詳しい。以降の定理番号は、「凸解析と最適化理論」のほうに準ずるとして、分離定理は定理5.4に証明されている。

この分離定理は、「ユークリッド空間の閉凸集合とそれに含まれない点があるときには、それらを分離する超平面が存在する」という内容だが、この証明に用いられる定理5.1では、「ユークリッド空間の閉凸集合とそれに含まれない点があるときには、含まれない点から見た閉凸集合の最小距離の点は、ただ一つであり、内積による必要十分条件がある」が示される。

この証明には、ユークリッド空間が完備であることが必要となっており、n次元ユークリッド空間が完備であることは、定理2.2で1次元ユークリッド空間の完備性から示される。
そして、最終的には定理A.2.3によって、実数空間の完備性が、limsup などの定義から直接的に示される。


他にも、ノルムの連続性が効いているが、「実数空間の完備性」と「ノルムの連続性」は、 epsilon-delta の定義から証明できることになる。

この流れは大まかな流れであるが、大まかな流れで見てくると、双対定理という重要な定理も epsilon-delta の定義までさかのぼることができるし、その中でも「実数空間の完備性」というところを経由しているのがわかる。

2014年1月31日金曜日

Regularized Stochastic BFGS Algorithm

最近読んだ論文のポイントを書いておく。

"RES: Regularized Stochastic BFGS Algorithm"
by Aryan Mokhtari, Alejandro Ribeiro
http://arxiv.org/abs/1401.7625

1.問題定式化
変数 $w \in R^n$, ランダム変数 $\theta \in R^p$ があって、関数 $f(w, \theta): R^{n \times p} \to R$ について、$\theta$ での期待値 $F(w) := E_{\theta} [f(w, \theta)]$ を最小化する。つまり、

$w^* = argmin_{w} E_{\theta} [f(w, \theta)]$

2.今回のアルゴリズムの目玉

Stochastic Gradient を $s = \frac{1}{L} \sum_{l=1}^L \nabla f(w, \theta_l)$ としたとき、Stochastic Gradient Method に現れる更新式 $w_{t+1} = w_t - \epsilon_t s$ にヘッセ行列の近似行列である $B$ の逆行列を挿んで、$w_{t+1} = w_t - \epsilon_t B_t^{-1} s$ とする。
また、$B_{t+1}$ を$B_t$からつくるときに、正則項を入れている。

3.主な結果

+条件数がいい問題では、Stochastic Gradient Method と同じだけの性能しか出ない
+条件数が悪いときは、正則化 Stochastic BFGS のほうがいい結果が出る

4.ほかに面白い情報
Stochastic Newton 法があまり使われていないのは、Newton ステップの不偏推定量が簡単に計算できないため。


論文の構成としては、アルゴリズムの紹介、収束性の証明、数値実験結果、というところ。