続けて,推定フェーズの実装を見ていきましょう。算出するためのメソッドを確認していきます。生起確率を求めていきます(リスト4⁠)⁠。「訓練データとしてカテゴリが与えられた件数/総文書数」で算出することができます。求めます(リスト5⁠)⁠。ここでは,先ほどのカテゴリの中に単語が現れた回数とカテゴリに出現した単語の総数で算出することができます。ここで1つ大きな問題があります。0になってしまいます。この問題をゼロ頻度問題やスパースネスの問題と呼びます。普通に考えて,単語の出現頻度が0だからといって世の中にその単語がカテゴリに属する確率が0にならないことは分かりますよね。この時,ゼロ頻度問題を回避するために,訓練データから得られる単純な推定値を用いるのではなく,何らかの形で補正する必要があります。この補正操作のことをスムージング(smoothing)と呼びます。今回のように一様な値を加えるスムージングを加算スムージングと呼びます。加算スムージングでは単語の出現回数に一定数の値を加え,出現回数0の単語をなくす方法です。なかでも,今回のように1を加えるものをラプラス法,実数に一般化したものをリッドストーン法と呼びます。加算スムージングは単純であり簡単に実現できますが,一般的に精度が悪いことが知られています。精度の高いスムージングの方法としては線形補間法やヘルドアウト補間法などがあります。probしかし,ゼロ頻度問題を解決してもまだ1つ問題があります。確率値は1以下の非常に小さな値であり,しかも文章の中にはたくさんの単語が含まれています。積を求めていくと,とても小さな値になってしまい,アンダーフローを起こす可能性があるのです。それに対応するために対数をとり,積の計算を和の計算に変換します。ここで最終的に求めたいものは確率の値そのものではなく,事後確率の大小関係なので対数をとってもその関係は変化しないので問題はありません。メソッドでスコア(=確率値の対数)を算出しています。scoreカテゴリの推定あとは,そのカテゴリに属する確率の中からもっとも高い確率のものを決定すればいいでしょう(リスト7⁠)⁠。以上でベイジアンフィルタの実装は完了します。best実行してみようそれでは,実際に動かして確認してみましょう。実行のためにnaivebayes.pyに以下のコードを追加しましょう(リスト8⁠)⁠。今回,訓練データとして入力する文章はWikipediaにあるそれぞれの概要の文章を抜粋しました。この文章をそれぞれの項目「Python」「⁠Ruby」「⁠機械学習」のカテゴリとして分類したあとにカテゴリの推定を行います。nb.train(u'''Python(パイソン)は,オランダ人のグイド・ヴァンロッサムが作ったオープンソースのプログラミング言語。オブジェクト指向スクリプト言語の一種であり,Perlとともに欧米で広く普及している。製作したコメディ番組『空飛ぶモンティパイソン』にちなんで名付けられた。英語で爬虫類のニシキヘビの意味で,Python言語のマスコットやアイコンとして使われることがある。Pythonは汎用の高水準言語である。プログラマの生産性とコードの信頼性を重視して設計されており,核となるシンタックスおよびセマンティクスは必要最小限に抑えられている反面,利便性の高い大規模な標準ライブラリを備えている。よる文字列操作をサポートしており,日本語処理も標準で可能である。多くのプラットフォームをサポートしており(動作するプラットフォーム),また,豊富なドキュメント,豊富なライブラリがあることから,産業界でも利用が増えつつある。Perlなどのスクリプト言語が用いられてきた領域でのオブジェクト指向プログラミングを実現する。1995年12月にfj上で発表された。名称のRubyは,プログラミング言語Perlが6月の誕生石であるPearl(真珠)と同じ発音をすることから,まつもとの同僚の誕生石(7月)のルビーを取って名付けられた。learning)とは,人工知能における研究課題の一つで,人間が自然に行っている学習能力と同様の機能をコンピュータで実現させるための技術・手法のことである。ある程度の数のサンプルデータ集合を対象に解析を行い,そのデータから有用な規則,ルール,知識表現,判断基準などを抽出する。データ集合を解析するため,統計学との関連も非常に深い。機械学習は検索エンジン,医療診断,スパムメールの検出,金融市場の予測,DNA配列の分類,音声認識や文字認識などのパターン認識,ゲーム戦略,ロボット,など幅広い分野で用いられている。応用分野の特性に応じて学習手法も適切に選択する必要があり,様々な手法が提案されている。学術雑誌などで発表されることが多い。nb.classifier(words))以下の結果のように,期待していたカテゴリに分類されました(リスト9⁠)⁠。「オブジェクト指向言語」のように複数のカテゴリに登場している単語でも,それ以外の単語の出現によって正しく分類されているのが分かると思います。今回は訓練データとして各カテゴリに対して1件ずつしか用意していませんが,冒頭で説明したスパム判定ではだいたい4,000件のデータを使ってトレーニングしているようです(訓練データが増えることによって,より正確な分類ができるようになるので興味のある方はご自身で試してみてください⁠)⁠。今回実装したベイジアンフィルタはとても簡単なものです。ベイジアンフィルタは色々な言語のオープンソースプロジェクトでも開発されているので見比べてみるのも面白いかもしれません。次回のお知らせ次回の理論編では正規分布を説明します。今回のサンプルファイル今回取り上げたサンプルプログラムを一式ダウンロードできます。Python著者プロフィール恩田伊織(おんだいおり)1979年生まれの埼玉県出身。数学と関数型言語,SFとボードゲーム好きなプログラマー。好きな言語はRubyとLISP。現在は航空管制の基盤開発に従事している。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。