プログラマでありたい

おっさんになっても、プログラマでありつづけたい

集合知プログラミングが凄すぎる件について

 ようやく集合知プログラミングが届きました。まだ30分くらいざっと目を通しただけですが、これだけは言えます。自然言語処理をテーマとして扱う書籍の中で、実用度No.1です。文句なしにお勧めです。これで3,400円は安すぎます。倍の値段であっても買います。
 気に入った点といえば、例えばです。2章「推薦を行う」は、所謂リコメンドエンジンをテーマにしているのですが、この方法に複数のアプローチを紹介しつつ解説しています。レコメンドエンジンの代表的な方法に強調フィルタリングというのがあるのですが、この方法は類似スコアを出す必要があります。スコアの出し方に、ユークリッド距離やピアソン相関などの例を挙げ、それぞれの長所短所を述べています。また相関の種類にもユーザ相関とアイテム相関があり、それぞれどのようなデータの時に向いているのか等を解説してくれています。ですので、複数の手法は知っていてもどちらの方が良いか解らないという時に、非常に参考になります。
 また、テーマも多岐に渡っているので、自然言語処理に対する引き出しが非常に増えます。まだざっと読んでいるだけで、コードを動かしたりしていないので、これから取り組んで行くつもりです。何故か自然言語処理のサンプルコードはPythonが多いので、これを機会にPythonを習得しようかと思います。

集合知プログラミングに関するエントリ

リコメンドエンジンを作る 集合知プログラミング

随時、追加する予定



以下、目次。目次の内容をググるだけでも、勉強になります。

訳者まえがき
はじめに

1章 集合知への招待
	1.1 集合知とは何か?
	1.2 機械学習とは何か?
	1.3 機械学習の限界
	1.4 実生活における例
	1.5 学習アルゴリズムのその他の使用

2章 推薦を行う
	2.1 協調フィルタリング
	2.2 嗜好の収集
	2.3 似ているユーザを探し出す
		2.3.1 ユークリッド距離によるスコア
		2.3.2 ピアソン相関によるスコア
		2.3.3 どちらの類似性尺度を利用すべきなのか?
		2.3.4 評者をランキングする
	2.4 アイテムを推薦する
	2.5 似ている製品
	2.6 del.icio.us のリンクを推薦するシステムを作る
		2.6.1 del.icio.usのAPI
		2.6.2 データセットを作る
		2.6.3 ご近所さんとリンクの推薦
	2.7 アイテムベースのフィルタリング
		2.7.1 アイテム間の類似度のデータセットを作る
		2.7.2 推薦を行う
	2.8 MovieLensのデータセットを使う
	2.9 ユーザベース VS アイテムベース
	2.10 エクササイズ

3章 グループを見つけ出す
	3.1 教師あり学習 VS 教師なし学習
	3.2 単語ベクトル
		3.2.1 ブロガーを分類する
		3.3.2 フィード中の単語を数える
	3.3 階層的クラスタリング
	3.4 デンドログラムを描く
	3.5 列のクラスタリング
	3.6 K 平均法によるクラスタリング
	3.7 嗜好のクラスタ
		3.7.1 データの取得と準備
		3.7.2 Beautiful Soup
		3.7.3 Zeboの結果をすくい取る
		3.7.4 距離の基準を定義する
		3.7.5 結果をクラスタリングする
	3.8 データを2次元で見る
	3.9 クラスタについてその他のこと
	3.10 エクササイズ

4章 検索とランキング
	4.1 検索エンジンとは?
	4.2 シンプルなクローラ
		4.2.1 urllib2を使う
		4.2.2 クローラのコード
	4.3 インデックスの作成
		4.3.1 スキーマの設定
		4.3.2 ページ内の単語を探し出す
		4.3.3 インデックスへの追加
	4.4 問い合わせ
	4.5 内容ベースの順位付け
		4.5.1 正規化関数
		4.5.2 単語の頻度
		4.5.3 ドキュメント中での位置
		4.5.4 単語間の距離
	4.6 インバウンドリンクの利用
		4.6.1 単純に数えあげる
		4.6.2 PageRankアルゴリズム
		4.6.3 リンクのテキストを利用する
	4.7 クリックからの学習
		4.7.1 クリックを追跡するネットワークの設計
		4.7.2 データベースのセットアップ
		4.7.3 フィードフォワード
		4.7.4 バックプロパゲーションによるトレーニング
		4.7.5 トレーニングのテスト
		4.7.6 検索エンジンとつなげる
	4.8 エクササイズ

5章 最適化
	5.1 グループ旅行
	5.2 解の表現
	5.3 コスト関数
	5.4 ランダムサーチ(無作為探索)
	5.5 ヒルクライム
	5.6 模擬アニーリング
	5.7 遺伝アルゴリズム
	5.8 実際のフライトを検索する
		5.8.1 Kayak API
		5.8.2 minidomパッケージ
		5.8.3 フライト検索
	5.9 嗜好への最適化
		5.9.1 学寮の最適化
		5.9.2 コスト関数
		5.9.3 最適化の実行
	5.10 ネットワークの可視化
		5.10.1 レイアウト問題
		5.10.2 交差線のカウント
		5.10.3 ネットワークの描画
	5.11 さらなる可能性
	5.12 エクササイズ

6章 ドキュメントフィルタリング
	6.1 スパムフィルタリング
	6.2 ドキュメントと単語
	6.3 分類器のトレーニング
	6.4 確率を計算する
		6.4.1 推測を始める
	6.5 単純ベイズ分類器
		6.5.1 ドキュメント全体の確率
		6.5.2 ベイズの定理の簡単な紹介
		6.5.3 カテゴリの選択
	6.6 フィッシャー法
		6.6.1 特徴たちのカテゴリの確率
		6.6.2 確率を統合する
		6.6.3 アイテムを分類する
	6.7 トレーニング済みの分類器を保存する
		6.7.1 SQLiteを利用する
	6.8 Blogフィードをフィルタする
	6.9 特徴の検出の改良
	6.10 Akismetを利用する
	6.11 その他の手法
	6.12 エクササイズ

7章 決定木によるモデリング
	7.1 サインアップを予測する
	7.2 決定木入門
	7.3 ツリーのトレーニング
	7.4 最高の分割を選ぶ
		7.4.1 ジニ不純度
		7.4.2 エントロピー
	7.5 再帰的なツリー構築
	7.6 決定木の表示
		7.6.1 グラフィック表示
	7.7 新しい観測を分類する
	7.8 ツリーの刈り込み
	7.9 欠落データへの対処
	7.10 数値による帰結への対処
	7.11 住宅価格のモデリング
		7.11.1 Zillow API
	7.12 "Hotness"のモデル化
	7.13 決定木を使うべき場面
	7.14 エクササイズ

8章 価格モデルの構築
	8.1 サンプルデータセットの構築
	8.2 K近傍法
		8.2.1 近傍群の数
		8.2.2 類似度を定義する
		8.2.3 K近傍法のコード
	8.3 重み付け近傍法
		8.3.1 反比例関数
		8.3.2 減法(引算)関数
		8.3.3 ガウス関数
		8.3.4 重み付けK近傍法
	8.4 クロス評価
	8.5 異質な変数
		8.5.1 データセットの追加
		8.5.2 次元のリスケール(縮尺変更)
	8.6 縮尺の最適化
	8.7 不均一な分布
		8.7.1 確率密度の推測
		8.7.2 確率のグラフ化
	8.8 実データの利用  eBay API
		8.8.1 ディベロッパキーの取得
		8.8.2 コネクションのセットアップ
		8.8.3 検索する
		8.8.4 アイテムの詳細を得る
		8.8.5 価格予測器の構築
	8.9 K近傍法はどこで使うべきか
	8.10 エクササイズ

9章 高度な分類手法:カーネルメソッドとSVM
	9.1 matchmakerデータセット
	9.2 このデータセットの難点
		9.2.1 決定木による分類器
	9.3 基礎的な線形分類
	9.4 カテゴリーデータな特徴たち
		9.4.1 Yes/Noクエスチョン
		9.4.2 「興味があるもの」リスト
		9.4.3 Yahoo! Mapsを使って距離を決定する
		9.4.4 新たなデータセットの作成
	9.5 データのスケーリング
	9.6 カーネルメソッドを理解する
		9.6.1 カーネルトリック
	9.7 サポートベクトルマシン
	9.8 LIBSVMを使う
		9.9.1 LIBSVM の入手
		9.9.2 セッション中での使用例
		9.9.3 SVMをmatchmakerデータセットに適用する
	9.9 Facebookでのマッチ
		9.9.1 Developer Keyを取得する
		9.9.2 セッションを作成する
		9.9.3 友人データをダウンロードする
		9.9.4 マッチのデータセットを作る
		9.9.5 SVMモデルを構築する
	9.10 エクササイズ

10章 特徴を発見する
	10.1 ニュースのコーパス
		10.1.1 情報源の選択
		10.1.2 情報源をダウンロードする
		10.1.3 行列に変換する
	10.2 これまでのアプローチ
		10.2.1 ベイジアン分類器
		10.2.2 クラスタリング
	10.3 非負値行列因子分解
		10.3.1 行列に関する数学の簡単な紹介
		10.3.2 これは記事の行列とどのような関わりがあるの?
		10.3.3 NumPyを使う
		10.3.4 アルゴリズム
	10.4 結果を表示する
		10.4.1 記事を表示する
	10.5 株式市場のデータを使用する
		10.5.1 取引量とは何か?
		10.5.2 Yahoo! Financeからデータをダウンロードする
		10.5.3 行列の準備
		10.5.5 NMFを走らせる
		10.5.6 結果を表示する
	10.6 エクササイズ

11章 進化する知性
	11.1 遺伝的プログラミングとは?
		11.1.2 遺伝的プログラミング VS 遺伝アルゴリズム
	11.2 ツリー構造のプログラム
		11.2.1 Pythonでツリーを表現する
		11.2.2 ツリーの構築と評価
		11.2.3 プログラムを表示する
	11.3 最初の集団を作る
	11.4 解決法をテストする
		11.4.1 単純な数学的テスト
		11.4.2 成功の度合いを計測する
	11.5 プログラムの突然変異
	11.6 交叉(Crossover)
	11.7 環境を作り上げる
		11.7.1 多様性の大事さ
	11.8 シンプルなゲーム
		11.8.1 ラウンドロビントーナメント
		11.8.2 実際の人間とプレイしてみる
	11.9 さらなる可能性
		11.9.1 数学的な関数を増やす
		11.9.2 メモリ
		11.9.3 さまざまなデータタイプ
	11.10 エクササイズ

12章 アルゴリズムのまとめ
	12.1 ベイジアン分類器
		12.1.1 トレーニング
		12.1.2 分類
		12.1.3 ベイジアン分類器のコードの使用
		12.1.4 強みと弱み
	12.2 決定木による分類器
		12.2.1 トレーニング
		12.2.2 決定木分類器の利用
		12.2.3 強みと弱み
	12.3 ニューラルネットワーク
		12.3.1 ニューラルネットワークのトレーニング
		12.3.2 ニューラルネットワークのコードの利用
		12.3.3 強みと弱み
	12.4 サポートベクトルマシン
		12.4.1 カーネルトリック
		12.4.2 LIBSVMの利用
		12.4.3 強みと弱み
	12.5 K近傍法
		12.5.1 スケーリングと過剰変数
		12.5.2 K 近傍法コードの利用
		12.5.3 強みと弱み
	12.6 クラスタリング
		12.6.1 階層的クラスタリング
		12.6.2 K平均法クラスタリング
		12.6.3 クラスタリングコードの利用
	12.7 多次元尺度構成法
		12.7.1 多次元尺度構成法のコードの利用
	12.8 非負値行列因子分解
		12.8.1 NMFコードの利用
	12.9 最適化
		12.9.1 コスト関数
		12.9.2 模擬アニーリング
		12.9.3 遺伝アルゴリズム
		12.9.4 最適化コードの利用

付録A サードパーティによるライブラリたち
	A.1 Universal Feed Parser
	A.2 Python Imaging Library
	A.3 Beautiful Soup
	A.4 pysqlite
	A.5 NumPy
	A.6 matplotlib
	A.7 pydelicious

付録B 数式
	B.1 ユークリッド距離
	B.2 ピアソン相関係数
	B.3 加重平均
	B.4 Tanimoto係数
	B.5 条件付き確率
	B.6 ジニ不純度
	B.7 エントロピー
	B.8 分散
	B.9 ガウス関数
	B.10 ドット積

付録C 日本語のテキスト処理
	C.1 形態素解析ツール
	C.2 Yahoo!日本語形態素解析Webサービス

索引