Hatena::ブログ(Diary)

備忘録とか あと あれとか それとか

2013-08-16

latexdiffでの改行コードによるエラー

latexdiffがエラーばっかり吐いているので,それの対処法.


いつの間にかtexの改行コードがLFからCRに変更してしまったらしく,

Missing characters near word 1352 character index: 8492-8497 Length: 4 Match: |The | (expected match marked above).

というようなエラーを大量に吐くようになってしまった.


改行コードを直したらすぐ治りました.

nkfだと,

nkf -Lu --overwrite hoge.tex

という感じで改行コードを変更することが出来る.

2013-06-21

MacVimでメニューバーのメニューを消す

vim-latexを使っているせいか,MacVimのメニュー項目が長くなり,メニューバー右上のアイコンが省略されている場面が多々ある.

どうにかならねーかなー,と思ったらたまたま下の記事を見つけた.

【MacVim】メニューバーでアイコンが見えない! | blog.remora.cx

これに少し手を加えたときの備忘録.


まず,MacVimの標準のメニューを消すために,gvimrcに次を書く.

source $VIMRUNTIME/delmenu.vim


これだと,vim-latexのメニューが消えないので,変なことになってしまう.

そこで,vim-latexマニュアルから下を参照して,

11.8 Menu Customization

さらに,gvimrcに下を加える.

let g:Tex_Menus=0
let g:Tex_PackagesMenu=0

以上で,メニューバーがすっきりした.


ちなみに,

set langmenu=none

とgvimrcに書けば,メニューが英語表記になる.

2013-04-07

主成分分析(PCA; Principal Component Analysis)を丁寧に解く

この間書いた記事で,codecogsのOnline Latex Equation Editorを使えば,はてなダイアリーでもキレイな数式を書けることが分かったので,昔書いたPCAの導出を載せておこうと思う.

PCAは固有値分解で主成分を抽出する写像を求めることができるんだけど,多くの教科書などでは,「PCAの最適化問題固有値問題になるよー」と書いて終わりなので,「どうして固有値問題で解くことができるのか」というところを丁寧に導出したい.

考えた結果,すごい回りくどい方法しか思いつかなかったので,他のシンプルな解説もあるのかもしれない.

特に直感的な説明などなくて式を丁寧に見ていっているだけです.たぶん間違ってたり抜けているところがあるので,見つけた人は優しくご指摘下さい.(言い訳がすごい)

主成分分析(PCA)の目的と定式化

次の観測されたN個の観測データから成るデータ集合が与えられたとする.

  • : 観測値
  • : 各の次元
  • : 内の一次独立であるベクトル数(別に意味は分からくてもいい).が成り立つはず.

この観測値の次元がすごく大きい場合,すごく扱いづらい.

なので,観測値の情報を出来るだけ維持しながら,次元を小さくしたい.

この次元削減を次のような式で実現する.

ここで,

  • : 次元ベクトルを次元に小さくする行列.
  • はもちろんより小さくする.の場合は次元削減の点で言えば全然意味ないんだけど,そういうのを求めたい変態も少なからずいる.また内の一次独立であるベクトルよりも小さくしたほうがいい)
  • : 行列によってを次元削減した結果.
  • 単位行列の列ベクトルは互いに直交する.理由はよく分からないけど,PCAはこういう写像を求めたいんだから仕方ない)

は,「観測値の情報を出来るだけ維持しながら,次元を小さくする」写像である.

この「情報を出来るだけ維持する」ことを評価するために,ここでは,平均二乗誤差(MSE: Mean Squared Error)を小さくすることを考える.

この誤差は,と観測値の空間を見たときの誤差のことである.

わかりづらいので,2次元の観測値を1次元に次元削減する問題

を例にとって説明してみる.

下のクソみたいな図は,による次元削減を元の空間(観測値がある空間)で表したものである.

f:id:hgshrs:20130407173641j:image:w360

何が言いたいかというと,

  • 元の空間上でみると,次元削減後の観測値がある空間というのは,基底で張られた空間(図では直線で表される1次元空間)である.
  • は,そのを基底としたときの座標である.つまり,というのは,元の空間でみると,ベクトルの長さのこと.
  • したがって誤差ベクトルというのは次のように定義できる.

  • 全観測値の誤差ベクトルの長さ(の二乗)を平均を取ると,

このような感じで,PCAの問題は最適化問題として定式化される.

最適化問題を解く

上のを最大にするを求めることを考える.

は次のように変形できる.

ここで,は,相関係数行列で

と定義される.

固有ベクトル固有値によって対角化する.

をこの固有値固有ベクトルで表すと

は,の正規直交基底なので,の列ベクトルをこれらの線形結合で表すことにする.

したがって,

と書けるので,は,

関数として書くことができる.

ここで,の行列で,その要素は,である.

さらに,制約条件は,

と書くことができる.

以上より,PCAの最適化問題を求める問題から変形され,を求める問題として以下のように定式化される.

ここで,評価関数の和の形で書けるため,それぞれで最大化値を求めれば良い.

また,重複する制約条件を省略すると,は,その他のパラメータに依存していないことが分かる.

したがって,

となる.

制約条件をとして,これを評価関数に代入すると,

となる.

よりよりという結果から,明らかにである.

したがって,評価関数の最大値はであり,そのときのパラメータの値は,

となる.

が求まったので,次に,最適化問題

を考える.

まず,明らかに,である.

さらに,制約条件をとして,これを評価関数に代入すると,

となるので,先ほどと同様に,これの最大値はである.

これを実現するパラメータは,

同様に,全てのパラメータを求めると,

となる.

最後に,より,

となる.

したがって,は,の大きい個の固有値に対応する固有ベクトルとして求めることができる.

2013-03-31

再生核ヒルベルト空間をなんとなく理解する

タイトルの通り再生核ヒルベルト空間を何となく理解する.

厳密ではないし,証明も書いていない.

僕はかなり忘れっぽいので,「わかんなくなったなー」と思ったときに見るメモ用.

問題

入力ベクトル非線形写像によって高次元空間へ移して,その高次元空間上で別の入力ベクトルとの内積をとる.

内積

このとき,カーネルトリックというテクニックを使って,この内積

という感じで求めたい.

の次元が非常に大きい場合(無限のときもある)は,内積は計算出来ないのだけど,上の式によって計算できるよ,という話.

準備

  • 適当な入力空間上の集合: .入力ベクトルとしてが与えられているとすると
  • 適当な正定カーネル: の関係は,となる(ようにしておく).
    • ここで,は,関数とみなせるので,は,関数空間(上の高次元空間つまり無限次元空間になる)に写像するものと考えることができる(パラメータによって関数が設計されるというイメージで考えると分かりやすい).
    • 図を書いたけど見づらい.

f:id:hgshrs:20130331122706p:image:w360

    • 関数空間とは関数が空間内のある一点と対応する.その関数が取る値を並べてそれをベクトルのように考えると想像しやすい.
  • によって張られる空間:

    • の例でみると,の任意の元は次のよう表すことができる.

    • この空間を図示すると下のようなイメージ.

f:id:hgshrs:20130331132452p:image:w360

再生性

が再生核ヒルベルト空間の場合,次の性質を持つ.

つまり,上の任意の元(これも上の元)の内積は,任意の関数においてを入力したときの値になるという性質.

f:id:hgshrs:20130331132453p:image:w360

カーネルトリック

この再生性を利用すると,つぎのような良い感じの性質が見えてくる.

  • 上の2つの元, 内積:

    • のところは,関数を入力することになるので,再生性を利用するととなる.
  • 上の結果を利用して内積:

おわりに

を実数全体としたときに再生性を満たすカーネルが線形カーネル,ガウシアンカーネルだったり.

2013-02-15

オンラインでドイツO2のプリペイドSIMをチャージする

前章「ドイツO2でプリペイドSIMを買う」はこちら


Flatrateの期限が過ぎているのをすっかり忘れて,繋いだら以下のようなページが現れたので,「これ,オンラインでチャージできんじゃね?」と思い,やってみた.

試行錯誤した結果,SIMフリー携帯電話がなくても,SIMにチャージして新たにFlatrateのプランを購入することができた.

f:id:hgshrs:20130215184202p:image:w360


Google翻訳で必死に翻訳した結果,「SIMにいくらかチャージ」→「Flatrateのプランを購入」という流れらしかった.

SIMにチャージ

先ほどのアカウントページ(もし,自動で繋がらなかったらhttps://surfmanager.www.o2.de/surfmanager/に接続してみるといいかもしれない)を下にスクロールすると以下のページが出てくる.

f:id:hgshrs:20130215193120p:image:w360

どうやら,「クレジットカード銀行口座を使ったチャージ」と「プリペイドカードを使ったチャージ」できるようだ.


最初は,クレジットカードでチャージしようとしたが失敗した.

一応やり方は,クレジットカードで「Weiter」というボタンをクリックするともろもろ入力する場面が出てくるので,必要な情報を入れる.

(ちなみに,クレジットカードで「Weiter」というボタンをクリックしても,データ通信が出来ないSIMを使っているとそこから先に進めない.

ただし,ページを開いたまま,利用可能な別のネットワークに繋いでもログインしたままなので,先に進める)

ここで,「Monatlich」を選ぶと月ごとにオートチャージされるみたいなので「Einmalige Aufladung」を選ぶと良いと思う.

(結局,チャージできなかったので分からないけど)

全部,必要な情報は入力したがよくわからないけど出来なかった.

クレジットカードドイツ内で発行されてないからかもしれない.


仕方ないので,プリペイドカードを使ってチャージすることにした.

近くのスーパーで買えた.

レジの近くにタグがかかっているので,「通信会社」と「金額」を確認してレジに持っていけば,下のレシートみたいなものが貰える.

f:id:hgshrs:20130215190526j:image:w360

「Ihr CashCode lautet:」と書いている12桁の数字がコードで,それを「Code eingeben」という欄に入力する.

f:id:hgshrs:20130215184203p:image:w360

「Einlösen」というボタンをクリックする.

画面は遷移するけど,「何もかわって無いじゃないか!」と焦らない.

結構,時間かかる.

しばらくすると「Guthaben & Tarif」というところにチャージした金額が表示されるはず.

これで,チャージ完了.

Flatrateのプランを購入

ページをさらにスクロールすると利用可能なプランの一覧が下のように出てくる.

ここで,「Bestellen」を押して進めばプランを購入できる.

画面は遷移するけど,「何もかわって無いじゃないか!」と焦らない.

結構,時間かかる.

しばらくすると,購入したプランの表示が「Status: aktiv」となり,「Packs & Flatrates」のタブに自分が購入したプランが表示される.

これで,もう使える.