スキップしてメイン コンテンツに移動

投稿

ラベル(機械学習)が付いた投稿を表示しています

カーネルK-means 理論編

Introduction English ver 今日は、カーネルK-meansの理論について書きます。カーネルK-meansは通常のK-meansの欠点を補うことができます。通常のK-meansの欠点とカーネルK-meansの強みも説明します。もし、まだ御覧になられていなければ、通常の K-means 理論編 の記事を見ていただけるとよいのではないかと思います。 カーネルK-meansの実装編 も併せてご覧ください。 概要 K-meansの弱点 カーネルトリック カーネルK-means アルゴリズム K-meansの弱点 例えば、次のようなデータを用意します。 このデータはK-meansによってうまく分類することはできません。なぜなら通常のK-meansでは、データとプロトタイプのユークリッド距離に依存しているからです。そのため、このような円状に分布しているデータはうまく分類することができません。 プロトタイプとはそれぞれのクラスにあり、そのクラスを代表するようなもののことです。K-meansでは各クラスの平均ベクトルとなります。それゆえ、以下のような分類になってしまいます。 このようなデータではK-meansはうまくいきません。 K-meansで分類できるデータセットは次のように各クラスで固まっている必要があります。 カーネルK-meansはK-meansの弱点を補います。 カーネルトリック 初めに、カーネルトリックを説明します。 線形分離できないようなデータ$X$を例えば次のように線形分離できるように$\phi(x)$に送る写像$\phi$を考えます。 カーネルは次のように定義されます。 $$K(x,y) = \phi(x)^T \phi(y)$$ $\phi$を具体的に計算することは難しいですが、$K(x,y)$を計算することなら簡単です。 この手法をカーネルトリックと呼ばれます。 カーネルK means K-meansの目的関数を復習しておきます。 $$J = \sum_{n=1}^{N} \sum_{k=1}^{K} r_{nk} ||x_n-\mu_k||^2$$ ここで、 プロトタイプは$\mu_i ~\forall k \in K$としま...

K-means 理論編

Introduction English ver 今日はK-meansアルゴリズムの理論について書きます。 K-meansアルゴリズムはクラスタリングのためのアルゴリズムです。 K-meansの実装の記事は カーネルK-meansの実装 を御覧ください。 この記事はカーネルK-menasの実装についての記事ですが、通常のK-meansの実装も行っています。カーネルK-meansについてはまた、今度別の記事で紹介したいと思います。 概要 1 of K 符号化法 プロトタイプ 歪み尺度 最適化 1 of K 符号化法 K-meansはK個のクラスについて分類することを考えます。 K-meansでは $x_n$がkのクラスに属していることを次のように表します。 ベクトル$r_n:1 \times K$ を $$r_n := (0,0,..,1,..,0)$$ このベクトルはk番目にのみ1を持ち、それ以外は0を要素に持つようなベクトルです。 こののような表現の仕方を1 of K符号化法と呼びます。 プロトタイプ K-meansではプロトタイプと呼ばれるベクトルを選びます。このベクトルは各クラスに一つあり、そのクラスの代表のようなベクトルです。 K-means ではそのようなベクトルは各クラスの平均ベクトルとなります。これは目的関数から自然と導かれます。 歪み尺度 プロトタイプベクトルを $\mu_i ~\forall k \in K$とします。 この時、k-meansの目的関数は次のようになります。 $$J = \sum_{n=1}^{N} \sum_{k=1}^{K} r_{nk} ||x_n-\mu_k||^2$$ ここで、 $r_{nk}$ は$r_n$のk番目の要素です。 この目的関数について少し説明をします。$r_{n}$は$x_n$が属しているクラスのラベルの場所だけ1で他は0であるので、 $$J = \sum_{n=1}^{N} ||x_n - \mu_{x_n}||$$ ここで、$\mu_{k_n}$は$x_n$が属しているクラスのプロトタイプです。 よって、 $$J = ||x_1 - \mu_{x_1}|| + ||x_2 -\mu_{x_2}|| + ...

SVMの理論 part 2

Introduction English ver 今日はSVMの定理について書いていきます。 この記事はpart 2になります。Part 1 では目的関数の導出までを書きました。Part 2では双対問題とゆわれるものを導出します。Part 1で導いた目的関数は主問題と呼ばれます。一般的に、SVMでは主問題ではなく、双対問題を解くことで最適解を得ます。 もし、まだPart 1を見ておられない場合は、 Theorem of SVM part 1 を見てくださるとよいのではないかと思います。 SVMの実装編は Implement linear SVM Implement kernel SVM を御覧ください。 概要 主問題 双対問題  ラグランジュ関数 主変数について、最小化、双対変数について最大化 双対変数について最大化、主変数について最小化 主問題 Part 1で導いた主問題の復習をしておきます。 $$\min_{w,b} \frac{1}{2}||W||^2 + C\sum_{i \in N} \epsilon_i$$ $$~~s.t~~ \forall i \in N, y_i (w^T \phi(x_i) + b) \geq 1 - \epsilon_i ,~~~, \forall i \in N~\epsilon \geq 0$$ これはソフトマージンの時の目的関数ですが、以後ソフトマージンの場合のみを扱っていきます。 さて、双対問題と呼ばれるものですが、これは主問題から自然に導かれます。 双対問題 SVMの最適化問題は凸二次最適化問題と呼ばれる種類の問題です。凸二次最低化問題は、必ず大域最適解に近づくことが知れれており、数値上の安全性が高いとされています。 双対問題を導出します。まず、主問題を以下のように書き換えます。 $$\min_{w,b} \frac{1}{2}||W||^2 + C\sum_{i \in N} \epsilon_i$$ $$~~s.t~~ \forall i \in N, -\{y_i (w^T \phi(x_i) + b) -1 + \epsilon_i \}\leq 0,~~~, \forall i \in N~ -\epsilon \...

SVMの理論 part 1

Introduction   English ver SVMの理論編を書いていこうと思います。実装編は 線形SVMの実装 カーネルSVMの実装 をご覧ください。 このpart 1の記事ではSVMの目的関数の導出までを書いていきます。 概要 一般線形モデル SVMの説明 ハードマージン ソフトマージン 一般化線形モデル  SVMには一般化線形モデルが使われています。一般化線形モデルとは次のようなモデルのことです。 $$f(x) = w^T\phi(x) + b$$ bはバイアスと呼ばれています。 $$0 = w^T\phi(x) + b$$は超平面(n次元平面)を表します。この超平面は$\phi(x)$をきれいに2クラスに分類するように決めます。 ここで$\phi(x)$は平面で分類できないようなxを平面で分類できる特徴空間に送る写像です。 $\phi(x)$のイメージは以下の画像を見てください。 左は線形分離不可能なデータ。右は$\phi(x)$によって特徴空間に移された線形分離可能なデータです。 よって$w^T \phi(x) + b$は特徴空間では平面となります。 次に、SVMの目的を説明します。 SVMの説明 SVMではラベルは1 or -1として扱います。$y \in \{1,-1\}$、Xをデータセットとします。 私たちの目的は決定関数と呼ばれるものを作ることです。 SVMでは以下のようなものです。 $$f(x_i) > 0 \implies y_i = 1 $$ $$f(x_i) < 0 \implies y_i = -1$$ f(x)は $w^T \phi(x) + b$とし、パラメータwとbを最適化します。 しかし、最適化するにはあるよい基準が必要になります。SVMではマージンと呼ばれる値を使い、最適な境界線を決定します。 ハードマージン SVMはマージンと呼ばれる値を用いて、クラスの境界は決定されます。 マージンとは何なのでしょうか? 境界$w^T \phi(x) +b = 0$から一番近いデータ$x_i$を持ってきます。マージンとは、境界と$x_i$との距離のことを言います。 ...

カーネルk-meansの実装

Introduction   English ver 今日はカーネルk-meansの実装をしました。k-menasアルゴリズムはクラスタリングのためのアルゴリズムです。僕がカーネルk-meansを実装しようと思ったのには一つ理由があります。それは僕の友人がk-meansのプレゼンを、僕がカーネルのプレゼンをしていた時に、k-meansにカーネルを適応できないかと思ったからです。そこで、カーネルk-meansについての論文を探しました。 ここのpdf を主に参考にさせていただきました。うまくカーネルk-meansを実装できたと思います。ここでは、普通のk-meansとカーネルを用いた,kernel k-meansについての実装の結果を紹介します。 また、この記事では実装結果のみ書きますが、理論のほうも別の記事で書くつもりです。書き終えたらリンクをこの記事にも貼っておきます。 #  理論編書きました。K-means 理論編 概要 dataset   ちょっとだけ理論の説明  k-means    kernel k-means   Dataset   English ver 今回使うのは二つのデータセットです。一つ目は、普通のk-means用のデータです。二つ目はkernel k-means用のデータセットです。 一つ目のデータは、三つのグループで構成されており、次元は2で、サンプル数は300です。以下のような分布になっています。 二つ目のデータは二つのグループで構成されており、次元は2でサンプル数は300です。   this page にデータセットを作ったコードを載せています。 ちょっとだけ理論の説明 k-meansとは、k-平均法とも呼ばれています。初めに、適当なクラスに分け、各クラスの中で平均となるベクトルを求めます。そして、各データに対して、すべての平均ベクトルとの距離を求めます。そして、最小となる距離になるクラスに改めて、そのデータをクラスタリングします。そして、新たに得られたクラスの中でそれぞれ平均ベクトルを求め、これを繰り返し、平均ベクトルが動かな...

カーネルSVMの実装

Introduction English ver 今日はカーネルSVMを実装しました。 最適化には内点法を実装しました。 この記事では実装のみ書いていますが、理論編もそのうちに書きたいと思います。書き次第、リンクを貼っておきます。 # 第一弾書きました。 SVMの理論 part 1 僕のcomputerはwindowsでOSもwindowsです。 実装はPython3で行います。 概要 カーネルとは データセットについて 実装の結果 カーネルとは カーネルとは非線形問題を解くための手法です。 直線で分類できないようなデータをある写像をもとで、直線で分類できるような分布に変形することです。次の画像を見たほうがわかりやすいかもしれません。 ⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓⇓↓ このように変形することをカーネルトリックといいます。 変形されたデータは写像\(\phi\)によって\(\phi(x)\)と表現されます。 \[\phi:x -> \phi(x)\] しかし、SVMではカーネル関数は次のように表されることが多いです。 \[K(x,y)=\phi(x)^T \phi(y)\] なぜなら、SVMでは \(\phi(x)^T \phi\)のみを計算するからです。 最もよく使われているカーネルはRBFとpolynomialです。 RBF \[K(x,y) = \exp(-\gamma ||x-y||^2)\] polynomial \[K(x,y) = (x^Ty+c)^p\] \(K(x,y) = x^Ty\)とすればこれは線形SVMになります。 データセット 今日使うデータセットはnp.random.randnによって生成された正規分布に従う乱数です。 と このデータを作ったコードは ここ に置いてあります。 Implementation 今回はRBFカーネルを使いました。 \(\gamma = 0.5\) 正規化係数50とすると次のようになりました。 次に二つ目のデータセットに対して、RBF kernelを使いました。 \(\gamma = 0.5\) 正規化係数を100とすると、次のよ...

線形SVMの実装

Introduction English ver 今日は線形SVMの実装をしました。 SVMはDeep learningが主流になる前、人気だったとどこかで拝見しました。 SVMの詳しい理論の説明は別の機会に必ず書きます。 # 第一弾書きました。 SVMの理論 part 1 computerはwindowsでOSはwindows10です。Python3で実装します。 このプログラムには内点法という最適化を使っています。 Dataset 次の二つのdastasetを使います。 一つは、完全に分離できるような分布のデータです・ もう一つは完全に分離できないような分布のデータです。 例えば、data1の分布はこのような形になります。 この分布ならきれいに二つのクラスを分けるような線が引けそうですね。 もう一つのデータは次のようなデータを使います。 このデータはきれいに分けるような線は引けなさそうです。 この二つのデータを用いて、線形SVMを使っていきましょう。 Implementation data1 この線が分離面になります。 きれいにいい感じのところに引けてます。 data2 このデータについては様々なCを用いて計算してみました。 Cの値が小さければ小さいほど、誤分類を認めてしまうことになります。 このデータではCの影響を確認しずらいかもしれませんが、\(C=1\) の時、よく見ると、赤色のデータが一つ境界面を飛び出しています。 線形でないSVMを使うとCの影響がもっとわかりやすいかもしれません。 非線形なSVMについては、別の記事で書こうと思います。 CODE コードはすべてgithubに乗せています。 My SVM code is here 今回使ったファイルはgit_SVM_check.pyとgit_SVM_def.pyです。 git_SVM_check.py には次のようなコードが入ったメインファイルです。 if __name__ == '__main__': git_SVM_def にはSVMのクラスと、内点法の実装が入っています。 次は非線形のSVMについても書きたいと思います。 もし、そちらの記事も見ていただけたらハッピーです。

ロジスティック回帰の実装

Introduction English ver 今日はロジスティック回帰の実装を行いました。 初めに、僕のComputerはosはwindowsです。実装はPython3で行います。 最適化にはIRLSを用いています。 ロジスティック回帰の理論偏にロジスティック回帰の詳しい理論や説明を書いています。 ロジスティック回帰の理論編 概要 使うデータ集合について Pythonでのコードを紹介 コマンドラインでの実行結果 Dataset データセットはこちらを使います。 dataset このデータセットには住宅街のデータが入っています。 Python3のPandas.DataFrameでの表示を貼っておきます。 上から五行目までを貼っています。 もし、その家に住人がいるのであれば、Occupancyには1が入っています。 反対に、その家に住人がいるのであれば、Ouucpancyには0が入ります。 このデータセットは約8000個のサンプルが入ったトレーニング用データと、約2000個のサンプルが入ったテスト用のデータがあります。 しかし、今回はトレーニング用に100個、テスト用に100個のデータを使います。僕のcomputerがプログラミング用ではないためです。。。 すいません。。。 CODE このコードはとても長いので、僕のGithubのページに乗せてあるものを見てください。。 githubのページ ロジスティック回帰(def file) ロジスティック回帰(main file) mainファイルには、以下のようなコードが入っているファイルです。コマンドラインで入力するファイルになります。 if __name__ == '__mian__' defファイルには様々な関数が入っています。クラスも使われています。Pythonのクラスについてはまた、機会があれば書きたいと思います。 いざ、実行! w を推定します… wが更新されるごとのクロスエントロピー誤差関数の様子をplotしておきます。 scatterplot でクロスエントロピー誤差関数をplotした画像です。 うまく減少しているのがわかります。 最適化は終わりました。 ではこのモデルのテストを行っていきましょう...

ロジスティック回帰 理論編

Introduction English ver 今日はロジスティック回帰について書こうと思います。ロジスティック回帰は機械学習の中でも基本とされています。ロジスティック回帰は二値を分類するためのアルゴリズム、モデルです。 概要 この記事はPRMLを参考に書かせていただいています。 最適化には反復再重みづけ最小二乗法を用いています。 シグモイド関数 分類のための確率を定義 交差エントロピー誤差関数 反復再重みづけ最小二乗法 シグモイド関数 初めにシグモイド関数を定義します。 以下のような関数です。 \[\sigma(a) = \frac{1}{1+\exp(a)}\] 後に扱うので、シグモイド関数の微分を計算しておきます。きれいな形をしています。 \begin{eqnarray*} \frac{d}{d a} \frac{1}{1+\exp(a)} &=& \frac{\exp(-a)}{(1+\exp(-a))^2} \\ &=& \frac{1}{1+\exp(-a)} \frac{\exp(-a)}{1+\exp(-a)}\\ &=& \frac{1}{1+\exp(-a)} \{ \frac{1+\exp(-a)}{1+\exp(-a)} - \frac{1}{1+\exp(-a)} \} \\ &=& \sigma(a)(1-\sigma(a)) \end{eqnarray*} シグモイド関数は機械学習において大事な役割を果たしています。 シグモイド関数は以下のような形をしています。 これを見てわかる通り、シグモイド関数は次のような性質を持っています。 シグモイド関数は 定義域は\((-\infty,\infty)\)で定義され、値域は\((0,1)\)で定義されています シグモイド関数は単調増加関数です シグモイド関数は(0,0.5)で点対称です シグモイド関数の値を確率として考えることができるようになります。 分類のための確率の定義 初めにデータが正しく分類されたかの確率を考えてみる。 この直線は超平面だと思ってください。 超平面は以下のように表されます。 \[w^T x= 0\] wは超平面に対する法線ベク...