#author("2017-11-25T12:44:01+09:00","default:takataka","takataka") #author("2017-11-25T12:48:48+09:00","default:takataka","takataka") *SJS2017 ex10 [#f69bd8f1] #contents **これまでの分 [#kbc5dcd1] - 以前の分を全て報告してokをもらってから,今回分にすすみましょう. **課題A [#qee16d4e] 人工データをロジスティック回帰モデルで識別させてみよう(0) 〜 データ生成プログラム 以下を適当な名前で保存して,ipython 上で実行してみよう. このプログラムでは3クラスのデータを2次元の正規分布で生成してますが,nclass を 2 にしたら赤と緑の2クラスのデータを作ることもできます. #gist(08915ac166e2316568346be4c5b6e1c6); **課題B [#g4957adb] 人工データをロジスティック回帰モデルで識別させてみよう (1) 〜 2クラス識別の実験 上記プログラムで得られる2クラスのデータを学習データとして,ロジスティック回帰モデルの交差エントロピーをSGDによって最小化する学習プログラムを作成しよう. 学習が一定回数(たとえば &mathjax{N}; 回)進むたびに交差エントロピー &mathjax{H}; と誤識別率(&mathjax{z = 0.5};を境にしてどっちと識別したか判断する)を表示するようにしよう. 構成はこんな感じ: + パラメータを初期化する + 以下を適当な回数繰り返す ++ &mathjax{N}; 個の中から一つデータを選ぶ ++ &mathjax{N}; 個の中からデータを一つランダムに選ぶ ++ それを入力としてモデルの出力を求める ++ パラメータを更新する ++ 繰り返し回数が N の倍数になったら --- 全ての学習データに対するモデルの出力を求める --- それらの交差エントロピーの平均および誤識別率を求めて表示する - パラメータの初期値は,&mathjax{[0,1)}; の一様乱数をもとに &mathjax{[ -0.01, 0.01 )}; くらいにするとよいかも - とりあえず &mathjax{\eta}; は 0.01 とか 0.001 とか.うまく学習がすすまないときはもっと小さくしてみたらよいかも. - ↑ の getData は引数なしでは毎回乱数の種が異なってデータが変わります.それに,勾配法による学習はパラメータの初期値や &mathjax{\eta}; 等の値が変われば毎回結果が変わります. - &mathjax{z = 0.5 \Leftrightarrow ax+by+c = 0 }; だから,学習後のパラメータの値を見ると,学習した識別器が2クラスの境界をどんなだと思っているかがわかりますね.次のようにすると...これは課題ではありませんが. #pre{{ 学習データの散布図を描く xx = np.asarray( plt.xlim() ) yy = -( a * xx + c ) / b # 本当は b → 0 のときのこととかちゃんと考えるべき line = matplotlib.lines.Line2D( xx, yy ) ax.add_line( line ) fig.show() }}