Machine:SVM)を最適化ライブラリを使って実装してみた。MyEnigmaスマートフォン用の表示で見るMyEnigmaとあるエンジニアのブログです。Machine:SVM)を最適化ライブラリを使って実装してみた。Machine:SVM)を最適化ライブラリを使って実装してみた。Machine:SVM)の技術の概要と、シンプルなSVMを実際に最適化ライブラリを使って実装したコードを紹介したいと思います。機械学習における分類アルゴリズムの一つです。分類問題ではかなり精度が高いアルゴリズムであると知られていました。結果が安定しているという特徴があります。二乗誤差を最小化することで、同じように分類ができますが、データの誤差などに引きずられてしまうという問題があります。SVMはそのようなデータに強いという特徴があります。シンプルな線形SVMは下記のような最適化式で表すことができます。上記の最適化式において、1/||w||は分類平面からのマージンなので、||w||を最小化することで、分類平面からのマージンを最大化しています。今回は制約条件をそのまま使っています。データが混ざっていても分類平面を計算できるように、スラック変数を使って、制約条件を緩和させています。(ソフトマージンSVM)JuliaとJuMPを使った線形SVMの実装ここでは、Juliaと、myenigma.hatenablog.comJuliaの最適化ライブラリJuMPを使ってmyenigma.hatenablog.com線形SVMを解くサンプルコードを書いてみました。main()endgithub.comx-y平面で、2つのガウス分布からデータを生成し、それらを線形SVMで分類する線を決定しています。上記のコードでは、スラック変数を使って制約条件を緩和しているので、それぞれのデータが混ざっていても分割線が引けていることがわかります。非線形な分類はできません。線形分類をするには無理があります。別の空間内では線形分類だが、元の空間では非線形に分類する手法があります。変換する関数をカーネル、このカーネルを使う方法をカーネルトリックというようです。〜詳細説明〜qiita.comshogo82148.github.ioこのカーネルトリックをわかりやすく説明する動画として下記があります。function)カーネルなどが有名なようです。qiita.com非線形SVMの詳細は前述のリンク先の資料を参照ください。続いて、前述のシンプルな非線形SVMをJuliaとJuMPで実装してみました。今回は、3つのガウス分布のデータを生成し、その内2つのガウス分布のデータを一つのクラスタであるとしました。残りの一つのガウス分布のデータはもう片方のクラスタとします。このような場合、前述の線形SVMで分類するのは非常に難しくなります。カーネルとしては非常にシンプルな二次多項式のカーネルとしました。このカーネルを選んだ理由は特にありません。このカーネルを使うことにより、二次元のx-yのデータが、3次元のカーネル空間にリマッピングされ、そのカーネル空間で線形SVMを解く形になります。下記がJuliaのコードです。下記のような結果が得られます。非線形SVMで各点を識別した結果です。非線形に識別できていることがわかります。この形状はカーネルの種類やパラメータにもよるのですが、それっぽく識別できていることがわかります。Supportersもしこの記事が参考になり、ブログをサポートしたいと思われた方は、こちらからよろしくお願いします。Machine:SVM)を最適化ライブラリを使って実装してみた。はてなブログProとあるエンジニアのブログです。Page月別アーカイブスポンサーリンクスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。