Skip to content

Instantly share code, notes, and snippets.

@spaghetti-source
Last active December 19, 2015 06:59
Show Gist options
  • Select an option

  • Save spaghetti-source/5914925 to your computer and use it in GitHub Desktop.

Select an option

Save spaghetti-source/5914925 to your computer and use it in GitHub Desktop.

MNISTデータセットで遊ぼう

概要

MNISTデータセットは0~9の数字を手書きした画像のデータセットであり,以下からダウンロードできる:

http://yann.lecun.com/exdb/mnist/

各画像は28×28のモノクロ・ピクセルデータで表現されており(以下可読性のため row = col = 28 とおく), 各ピクセルには 0~255 の値が入っている.また,何の文字が手書きされているかを表す0~9のラベルがついている. 学習用に60000個の画像とラベル,判別用に10000個の画像とラベルが用意されており, 学習用データで学習した結果,判別用データをどれだけ正しく判別できるかを評価する.

現在までの各種手法での判別性能は上記の MNIST 公式サイトにまとめられている. このメモでは,それらの結果を再現することを目指す.基本的に速度よりも精度を重視する.

k近傍法

k近傍法は幾何探索に基づく手法である.

学習

学習データを row × col 次元ベクトルとして読み込む. 幾何探索系のデータ構造に突っ込むときっと高速化するがここでは何もしない.

判別

各テストデータに対し,(適当な距離で)近い方から k 個の学習データを探し, その中のデータの分布を使ってテストデータを判別する. 以下の実装では近い方から3つの要素を取って単純に多数決で決めている.タイの場合は近い方を優先.

実装

https://gist.github.com/spaghetti-source/5624007

結果

誤差率 2.83% を達成する.2.66GHz マシンで計算したところ判別速度は画像1枚あたり 0.15 [sec] だった. パラメタ調整がまったく必要無いので,非常に使い勝手が良かった.

k-meansハッシュ

k-meansハッシュも幾何探索に基づく手法だが,k-meansクラスタリングを利用することで探索を近似高速化する.

学習

データを読み込み,k-means クラスタリングを行う(k は適当なパラメタ).

判別

テストデータに一番近い k-means センターを返す.

実装

TODO

結果

TODO

カーネルSVM

カーネルSVMはカーネルトリックを用いた非線型回帰にもとづく手法である.

学習

ラベル 0~9 に対して,それぞれ判別機を作成する.

画像同士の比較を意味するカーネル関数 K(x,y) を設定する.読み込んだ画像に対してカーネル行列 Kij := K(xi, xj) を計算する. ラベルベクトル bj = (画像 xj がラベル k のとき 1, そうでないとき 0) をつくり,連立方程式 K c = b を解く. このとき,任意の学習データ x に対し,∑ K(x, xj) cj は x がラベル k をもつとき 1, そうでないとき 0 となることに注意されたい.

判別

テストデータ x について,l = ∑ K(x,xj) cj を計算し,l が最も大きな値をもつラベルを返す.

実装

TODO

結果

TODO

普通にやると学習に O(n^3) 時間かかるので,大規模な学習データを使うことができない.どうも学習データ不足が精度悪化の原因のように思える.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment