集合知プログラミング
5章 最適化 (後半)
@tetsuroito
自己紹介
名前           バックボーン
伊藤 徹郎       経済・ファイナンス
twitter ID Python歴
@tetsuroito ビギナー
所属
株式会社ALBERT データ分析部
株式会社ALBERTについて
私たちは「分析力をコアとする情報最適化企業」です!
ALBERTの事業領域
CRMソリューションの開発・提供
レコメンドエンジンの開発・提供
行動ターゲティング広告システムの
開発・提供
データサイエンティスト大募集中です!
皆様、ぜひよろしくお願いします!
この前、こんな会に出てきました
http://www.slideshare.net/yokkuns/japan-r-15449897
前半サマリー
グループ旅行の最適化のために解の表現を
行い、コスト関数を学びましたね。
探索アルゴリズムとして、         
ランダムサーチ、ヒルクライム、    
模擬アニーリング、遺伝アルゴリズムを 
学びましたね。
@gepuro 君が5.1∼5.7まで
わかりやすく発表してくれましたから、
みなさん準備はいいですね!
アジェンダ
実際のフライトを検索する           
-Kayak API                 
-minidomパッケージ             
-フライト検索
嗜好への最適化               
-学寮の最適化                
-コスト関数                 
-最適化の実行     
ネットワークの可視化    
-レイアウト問題      
-交差線のカウント     
-ネットワークの描画
さらなる可能性
 etc‥
実際のフライトを検索する
Kayak API
(本書抜粋)                     
Kayak APIは旅行用の垂直検索エンジンとして人気がある。
旅程検索の優れたXML APIを持っているからだ。
http://www.kayak.com/labs/api/search/ に行こう!
ちーん
以後、APIを取れた体で説明していきます。
実際のフライトを検索する
■minidomパッケージ
minidomは標準Pythonディストリビューションパッケージ
XMLドキュメントをオブジェクトのツリーとして扱う方法
DOMオブジェクトのメソッド
■Kayak APIを使う上で大事なものだよ!
・getElementsByTagName(name)
ドキュメント全体を検索し、タグ名がnameにマッチするエレメントをすべて
DOMノードのリストにして返す。
・firstChild
オブジェクトの最初のノードを返す。
・data
オブジェクトに結びついたデータを返す。大体Unicode
フライト検索の手順
・APIからセッションを取得
・XMLをパースする
・フライト検索を開始する関数を作る
・結果を最後までリクエストする関数を作る
・うまく動くかフライトを検索してみる
・行きと帰りの便を検索する
・2人分の検索をする
https://gist.github.com/4201232
嗜好への最適化
多くの問題に適用可能な問題
必要
問題に対し、コスト関数が定義されていること
類似の解が類似の結果をもたらすこと
みんなハッピーになるかもね!
学寮の最適化
学寮に入る際の第1、2希望の最適な組み合わせの例
5つの寮と2人分のスペースを10人の学生が争う。
コードは見てください。
この例では1万通りなので、全部やってもよいが、学生や部
屋数が増加すると組合せ爆発となる
https://gist.github.com/4201235
解の表現
解の表現はトリッキー
学生と寮を数字で割り当ててもよいが、2人の制約を満たせない
解1
無効解にはコスト関数が非常に大きな値になるように返してやる
最適化アルゴリズムの解の探索が難しい
無効な解の間を探索するのにプロセッササイクルを捨てるのはやめ
た方がいいよ!
もっとうまい方法があるよ
必ず有効となるような解を見つけること
有効解 優れた解 でいい
最初の学生は10のスロットのうちどれか
2人目は残りの9つのどれか
といった感じ
解を出力するコード
①まずスロット(各寮2つ)によるリスト生成
②解の数字にループをかけて、各数字が示す寮番号をスロッ   
トの中から見つける
③学生と寮の名前を出力し、そのスロットをリストから削
除して、他の学生が同じスロットを使わないようにする
④ループが終わると、スロットのリストは空
学生と寮はすべてプリント済みになる
コスト関数
コスト関数は出力関数と似た動作をする
スロットのリストを構築し、使ったスロットを削除
学生が第1希望に割り振られているとき
コスト=0
学生が第2希望に割り振られているとき
コスト=1
どちらでもない場所に割り当てられる 
コスト=3
コスト関数
完全な解のコストをゼロとなるようにする
コスト関数の有効なルール
完全解のコストがゼロであれば、どの程度近いかわかる
完全な解を見つけたら探索をストップするように最適化
アルゴリズムに教えてあげられること
利点
最適化の実行
解の表現、コスト関数、結果の出力関数がそろえば、先に
定義しておいた最適化関数が実行できる!
遺伝最適化アルゴリズムのパラメータをいじることで良い解
をより速く見つけられるか調べてみよう!
ネットワークの可視化
ネットワークの可視化
後はGistのコードを見てください
https://gist.github.com/4201248
おわり
解の表現とコスト関数の決定
が大事!

集合知プログラミング5章発表