コードの細かい説明は全部コメントで書いておきました。パターンあってクッソ長かったので画像にしておきます。スクショしてつなげただけなのでそろってなくて汚いですがご了承を。対称なものは除くとかすれば面白いかもしれませんね。C++Tweet[Background]EMアルゴリズムという手法があります。気が向いたら細かい説明を載せますが、簡単に説明すると、「観測できない隠れた変数」である潜在変数を含む確率モデルにおいて、最尤解を求めるアルゴリズムです。今回はこのEMアルゴリズムを実装しました。すべてC++で実装しました。使うデータですが、三つのガウス分布から100点ずつ点を生成します。1]生成した点をプロットした結果が以下の図の通りです。2]では実際に分類を行いますが、まずはいくつのクラスに分類するのが最も良いのかを見てみます。2~10クラスに分類してみて、それぞれにおけるすべての点の対数尤度を合計したものを見てみます。2]横軸にクラス数、縦軸に対数尤度を取ったグラフが下のようになります。見たところ3が最もよさそうです。(8などのほうが高そうですが、3以降は上昇が緩く飽和してそうなので、過学習を避けるためにも3に設定します。元データを3クラスで作っていると知ってしまっているのもありますが......。3]では、3クラスで分類し、学習が進んでいる様子をgifで出力するようにしてみます。用いて、各段階での学習した中心と分散とをpngファイルに出力するようにし、Giamを用いてgifにまとめました。出力するやり方がよくわからなかった。してやれば終わりです。C++Tweet[Background]友達が神経衰弱の手数の確率分布を手計算で求めていたのでなんとなくシミュレーションプログラムを書いてしまいました。[Code]軽い気持ちでC++で書き始めてしまったのですが、結果Cの関数しか使いませんでした。勢いでパパッと書いてしまったので不要な部分や回り道をしている部分があるかも知れません。美しいコードが書けるように精進したいです......。0;}[Result]結果です。16手が最大のように見えますが、なんだか最悪でも15手という噂を聞いてしまったので不安です。※追記mallocした意味ないですね。デバッグの時に血迷ってmallocしちゃいました。あとコード埋め込みをCとして行っていたのでC++に変更しました。04:09プログラミング初心者が書く神経衰弱シミュレーションTweet広告を非表示にするもっと読むコメントを書く次のページプロフィールid:tube_wormあかつきさやかと読みます。ロジオン・ロマーヌイチ・ラスコーリニコフとルルーシュ・ランペルージに強く共感します。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。