はじめてPull Requestしてみた

ひどい英語なので取り入れられるかはまだわかりません。 しかも1行です。

まだまだ変更される予定なので、この修正をいれてもまた壊れちゃうとのこと。 jedi本体の開発ブランチがマージされたときにsys.pathをとってくるAPIを公開するので それを待つことになりました。

私がした修正は一時的な変更らしく、またしばらくしたら元に戻るとのことで、workaround的な修正を提案され、無事にマージされました。

つまり英語力が足りない。

github.com

jediがエラー

 venvを色々といじっていて、neovimのCheckHealthで状況確認をしていたのですが jediだけ何をやってもErrorが消えなかったので困りはてていました。

https://i.imgur.com/kXtxnLq.png

(積読している易しめの本を爆速で消化している最中だったので、ストレスマックスです。)

 sys_pathのエラーだったので自分の環境を色々と疑いましたが梨のつぶてでした。エラーログをググってもヒントらしいものは一切見つかりませんでした。本を読み進めたい気持ちを抑え、重い腰をあげてソースを読んだらjedi本体のsys_pathの変数が変わっててました。

github.com

(ウゴゴゴゴゴゴッ)

修正する

# こいつを
 for p in jedi_vim.jedi.Script('')._evaluator.sys_path:

# こうする
 for p in jedi_vim.jedi.Script('')._evaluator.project.sys_path:

 そういえばCheckHealthは何度もつかってましたが、jediが有効な状態で使ったこと一度もなかったことに気づきました。変数が変わったのが2017年10月なので、みんなもCheckHealthしてないようです。

Pull Requestする

 貴重な時間を消費したので、Pull Requestってやつを経験することにしました。 GitHubで他人のコードを修正したことなったので手順から学びます。手順はこちらを参考にしました。感謝です。 コミットのメッセージを考えるほうが修正時間より掛かったのは言うまでもありませんね :)

github初心者がPull Requestを送ってみた時の手順

というわけで、Pull Requestを体験しました。 返答を理解できるのか不安ですがゆっくり待つとします。

はじめてのパターン認識を読み終える

はじめてのパターン認識

はじめてのパターン認識

一言で言うといい本でした。

難易度とか

 数式多めですが、過去に説明したことをあまり端折らず繰り返してくれるので、 前のページに何度も戻りながら進むと行ったことがあまりなかった。 それでも中級者向けに作られているので、機械学習の大雑把なイメージと線形代数微積分、確率等の初歩を理解してないと序盤から躓くと思う。

難しかったところと自分の変化

 自分はSVMあたりから理解するのにかなり苦しんだ。 ラグランジュ未定乗数とは?カーネル法???といった感じで、出だしから苦戦した。 (この後、カーネル法の多次元への写像の理屈を理解して感動した。)

 この辺りからだと思うがWikipediaの説明が分かりやすいと感じはじめた。 Wikipediaの数学系記事は分かり難いと思っていたのだが、はじパタという応用方法を目の当たりにしながらだと、スッキリと頭に入ってくることに気づいた。苦手意識が克服され本当によい経験になった。また最終章のランダムフォレストには強く惹かれたので、これは実際に何か作って試してみようと思う。

意識した点と痛感したこと

 今回は直感的なイメージに拘って本を読んだ。

  • 式がどんなことを表しているのか?
  • どんな作用を果たしているのか?
  • 数式のどんな特徴をつかって応用しているのか?
  • 内積外積スカラー?ベクトル?行列?
  • etc

かなり想像力が鍛えられたけれど、線形代数と確率に対する想像力の低さを痛感したので、はじパタを繰り返し読んだり、数学の入門書を読んだりして基礎力を高めていきたい。

 ちなみに微積については、式の展開に苦戦したがパターン認識だと「微分≒最適化」、「積分≒確率等の連続値の総和」くらいに考えておけば基本的によかったので、それほど苦しめられなかった。

今後

 これからについてですが、しばらくプログラミングの学習に戻ろうとおもう。 数学的な知見が深まってきたので、加速したいところですが 転職の身としては、もう少しアウトプットが欲しいのです。 ただ、すでにはじパタの内容が記憶からこぼれ始めているので、定期的にこの分野に戻ってこなとダメですね。

SVMについて雑にまとめる

はじパタのSVMの直感的理解に苦しんだので雑に整理しておく。

SVMの導出

  • SVMを使うと2クラスの線形識別できるよ
  • 基本2クラスだけど多クラスの場合は、判別したいクラスとその他のクラスの2クラス問題にして一対他SVMするよ
  • サポートベクトルとは、識別境界を決めるために使用する学習データのことだよ。つまり境界付近のデータだよ。
    • サポートベクトルをつかって学習機械をつくるからSVMだよ
  • SVMの導出にはラグランジュ未定定数法をつかうよ
    • ラグランジュ未定乗数法は、制約条件下で評価関数を最適化する手法だよ。ただし制約条件下は等式のみだよ。
    • 制約条件下が不等式の場合は、KKT条件が必要だよ
  • この最適化問題の主問題の解は、双対問題の解がわかれば求まるよ

線形分離できない時

  • 基本的にSVMは線形分離できるときだけ使える手法だよ
  • ただし、ある程度の誤識別を許容することで線形分離できない問題も解くことができるよ
  • どれくらい誤識別するかをスラック変数で表すよ。スラック変数の総和が大きいほどマージンを超えてくるよ。
  • スラック変数の総和にどれくらペナルティを与えるかが、パラメータCだよ
  • Cが大きいほどマージンを超えてくることに厳しくなるよ。でも過学習しやすくなるので汎化誤差が大きくなるよ。
  • これをC-SVMとかいうよ
  • ちなみにスラック変数は学習の時だけつかうよ

非線形特徴写像

  • 線形分離できないd次元のデータをM>>dなM次元に写像すると、データの間隔に隙間ができるので(疎になるで)超平面で線形分離できる可能性がでてくるよ
  • ただし内積計算に時間がかかるので内積カーネルを用いたほうがいいよ
  • 内積カーネルには多項式カーネルと動径基底関数カーネルがあるよ
  • このあたりはよくわからんかったので、あとでやりなおすぞ

ν(ニュー)-SVM

  • 学習機械(識別する仕組み)が達成できる誤り率と機械の複雑さには関連性があるよ
  • 「誤り率と機械の複雑さ」のトレードオフをνというパラメータをつかって調整するよ
  • C-SVMの時と似ていて、複雑にすると誤り率が減るけど汎化誤差がますよ(過学習)、ぎゃくに単純すぎると誤り率が高くなるよ
  • パラメータνは、-ρ倍することでトレードオフを調整するよ。-ρなのは、ρが大きくなれば評価関数が小さくなるので最適化にすすむからだよ。
  • νは、「サポートベクトルの割合(全データのうち、どれくらいがサポートベクトルになるか?)の下限」と、「上限サポートベクトルの割合の上限」を表すよ
    • 上限サポートベクトル(Bounded SV)とは、α_i = 1/N となるデータだよ。

1クラスサポートベクトル

  • 2クラス分類で話をすすめてきたけれど、1クラスだけで学習して使う方法もあるよ
  • ある1クラスに属すか?属さないか?を分類するよ
  • 新規性判別、例外検出、外れ値検出に利用するよ

サポートベクトルの理解 むずかしい。

Jupyter NotebookでPIL画像(QRコード)表示

すこし躓いたのでメモ。

qrcodeモジュールでQRコードを作成するとPIL画像になる。 Jupyter上でPIL画像を表示するには、matplotlibのimshowを使うようだ。 imshowは、numpy.array型を引数に取るのでPILを一度numpy.array型に変換するする。

という具合にnumpyまで登場して、わりと面倒だし煩雑。PIL対応して欲しい。

サポートベクターマシンとかラグランジュ未定乗数法とか

2日かけてはじパタ8章の冒頭を読んでなんとなーく理解してきた。

ラグランジュという言葉に怖気づきそうになったけれど、 要は2変数関数の微分Wikipediaの言葉をそのまま借りると「束縛条件のもとで最適化をおこなう解析学の手法」なんだね。

ラグランジュ未定乗数法では、等式制約しか扱えないが、KKT条件(カルーシュ・クーン・タッカー条件)を用いた手法(制約に条件をさらに加える)なら不等式制約も扱うことができる。

SVMの導出は不等式制約条件なのでKKT条件が必要。

2変数関数g(x,y)=0(等式制約)とかg(x,y)>=1(不等式制約)等々の条件下で、関数f(x,y)最大化or最小化するx,yを求めるときに使う手法。 これを主問題(primary problem)という。

そして主問題を式変換していくと、ラグランジュ未定乗数を変数にした関数の問題に置き換えられる。 これを双対問題という。 (双対ってなんだ?って思ったけど英語のduality problemのほうが直感的なきがする。)

  • 双対問題の最大値を求めると、主問題の最小値が求まるし
  • 双対問題の最小値を求めると、主問題の最大値が求まる。

つらつらと文字で書くと凄く難しく感じるけれど 「ある条件下で2変数関数の最適解を求める方法だよ」 「ある条件が不等式ならKKT条件も必要だよ」 「双対問題(duality problem)を解けば主問題(primary problem)も解けちゃう」 ということのようだ。

なるほどなぁー

さて概要はつかめたけど、式の直感的な解釈にまでは至っていないので、もうちょっと読み深めていこう。

はじパタ8章がむずかしい

突然だがはじめてのパターン認識を読んでいる。

はじめてのパターン認識

はじめてのパターン認識

 

6章辺りまでは親切な内容だったが7章あたりからエンジンがかかってきて8章から牙を向けてきた。8章はサポートベクターマシンの導出からはじまる。8.1.2のKKT条件でラグランジュ未定定数がでてきて戸惑っている。はて…ラグランジュどこかで聞いたことが… 物理だったかな?

聞きなれない単語と数式に困りっていたけおd、直感的な解釈はWikipediaがよかった。

ラグランジュの未定乗数法 - Wikipedia

丁寧な解説はこのあたりか

ラグランジュの未定乗数法と例題 | 高校数学の美しい物語

 

にしても今は数学の丁寧な解説書や解説ページが増えたのでいい時代になったなぁ。学生時代にほしかったよ。まぁでも、いま人生でいちばん数式を楽しめている感じがするのでジックリやっていこう。

 

あ。どうもはじめまして。