Search on the blog

2017年4月1日土曜日

はじパタ第2章 識別規則と学習法の概要

 平井有三先生の「はじめてのパターン認識」を読んでいる。今日は第2章「識別規則と学習法の概要」を読んだので学習メモを残しておく。

理解度チェック
  • アフィン関数とは?
    • アフィン関数を線形関数にするためによく使われる方法は?
  • バイアスとは?
  • バリアンストは?
  • バイアスとバリアンスの関係は?
  • 次の手法について説明せよ。
    • holdout法
    • cross validation法
    • leave one out法
    • bootstrap法
悩んだところ
バイアス項とバリアンス項(分散項)の導出のところで悩んだ。
一般にE[X2] = E[X]E[X]が成り立つと思い込んでしまっていて、バリアンス項って消えるんじゃない?何これ?となっていた..。
XとYが独立な場合はE[XY] = E[X]E[Y]ですが、XとXは独立じゃないので、バリアンスの項は消えませんね。

基本中の基本を忘れてました。
例えばサイコロに{-2, -1, 0, 0, 1, 2}という数字を書いて、2回投げたときにそれぞれ出る値をX、Yとすると、E(XY) = E(X)E(Y) = 0となりますが、E(XX)は0にはなりませんね。

試してみたこと
N個のデータからN回復元抽出(sampling with replacement)すると、あるデータが少なくとも1回は抽出される確率は1-e-1となるってのが面白かったので試してみた。1-e-1は 劣モジュラ関数の最適化や回路の時定数などでも出現する値で興味深い。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


def bootstrap_unique_freq(n):
 x = np.random.randint(0, n, n)
 return len(set(x)) / n


if __name__ == '__main__':
 t = 100  # iteration
 ns = []  # sample size
 xs = []  # unique sample freq

 for n in [10, 100, 1000, 10000]:
  ns.extend(n for _ in range(t))
  xs.extend(bootstrap_unique_freq(n) for _ in range(t))

 sns.boxplot(x=ns, y=xs)
 plt.show()

箱ひげ図を書いてみた。
x軸は元のデータ数、y軸はブートストラップサンプルしたときのユニークなデータ数。

0 件のコメント:

コメントを投稿