#author("2017-10-14T10:40:10+09:00","default:takataka","takataka") #author("2017-10-14T10:41:20+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 枚を学習データ,残りをテストデータとする実験プログラムを作ろう.次の例を参考にしたらよい. #gist(b50fcbb17eeda2262403fef89b4e42c0); #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 ]) }}