- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2017-10-14T10:39:27+09:00","default:takataka","takataka")
*SJS2017 ex05 [#f69bd8f1]
#contents
**これまでの分 [#kbc5dcd1]
- 以前の分を全て報告してokをもらってから,今回分にすすみましょう.
**課題A [#w83b99ab]
最短距離法による顔認識(1)
[[SJS/2017/ex04]] の顔画像を3つのクラス(猫,女性,男性)に分類する識別問題を考え,最短距離法による識別の実験をやってみよう.
- 最短距離法について,[[PIP/2017]] の講義資料,ウェブや書籍で調べなさい
- 次の課題Bで考えるように,本当は「学習データ」と「テストデータ」を分けて実験するべきである.しかし,まずは全データを使ってクラス毎の平均を求めて,それをプロトタイプとして全データを分類するプログラムを作ろう.
- データ毎に「識別されたクラス」,「正解のクラス」を出力するとともに,誤識別率すなわち全データのうち識別を間違えたデータの割合を計算して出力するようにしなさい.
**課題B [#gf539f2d]
最短距離法による顔認識(2)
データを「学習データ」と「テストデータ」に分けて課題Aと同様の実験をしよう.
- 「学習」とは何か,データを「学習データ」と「テストデータ」に分けるのはなぜか,について [[PIP/2017]] の講義資料,ウェブや書籍で調べなさい.
- 231枚の画像からランダムに選んだ 131 枚を学習データ,残りをテストデータとする実験プログラムを作ろう.次の例を参考にしたらよい.
#pre{{
In [11]: X = np.arange(10).reshape((5,2))
In [12]: X
Out[12]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [13]: idx = np.random.permutation( X.shape[0] )
In [14]: idx
Out[14]: array([2, 3, 4, 1, 0])
In [15]: idxL, idxT = idx[:3], idx[3:]
In [16]: idxL
Out[16]: array([2, 3, 4])
In [17]: idxT
Out[17]: array([1, 0])
In [18]: XL = X[idxL]
In [19]: XT = X[idxT]
In [20]: XL
Out[20]:
array([[4, 5],
[6, 7],
[8, 9]])
In [21]: XT
Out[21]:
array([[2, 3],
[0, 1]])
}}
- np.random.permutation 等の関数は,特に何もしなければ毎回異なる乱数を生成するので,バグ取りなどの際には都合が悪い.次のように乱数の種を指定すれば,再現性のある実験をできるようになる.
#pre{{
In [12]: np.random.seed(0) # 種として 0 を指定
In [13]: np.random.rand(5)
Out[13]: array([ 0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
In [14]: np.random.rand(5)
Out[14]: array([ 0.64589411, 0.43758721, 0.891773 , 0.96366276, 0.38344152])
In [15]: np.random.seed(0) # 再び種を 0 に
In [16]: np.random.rand(5)
Out[16]: array([ 0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
}}