#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 ])
}}


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS