FCM識別器はファジィC平均(FCM)クラスタリングを元にした識別器です。大量データを用いても短時間に識別器の訓練(最適化)が可能です。識別クラス毎の訓練データを複数のクラスターに分割して、それらの境界線からクラス間の境界線を決定します。境界線の微妙な調整を簡単に行えるように、クラスターへの分割が終わってからファジィクラスターのメンバシップ関数を用います。そして、そのパラメータを調整します。一般に大量データをクラスタリングするには計算時間が非常に長くなってしまいます。そこで、データセットの二分割を繰り返すPCA-Treeを採用しました。
データ件数は多くても良いのですが、データの次元数(変数の数)は通常50程度が適当です。そのため前処理(データの圧縮)としてここでもPCAを用いています。人工ニューラルネットワークのDeep LearningではAutoencoderと呼ばれる自動的な特徴抽出機能がありますが、そこのところをPCAで行っていると考えればいいと思います。ただし、公開していますFCM識別器のプログラムは識別機能部分だけです。
なお、この識別器を応用したものに駐車場の管理システムやゴミ焼却場のシステム(日立造船)があり、実用化され販売もされています。それらを利用される場合は㈱ニチゾウテック http://www.nichizotech.co.jp/ へお問い合わせください。
このyoutube動画はMATLAB版の使い方ですが、MEX版でも同じです。ただし、訓練データを十万件ずつ分割してディスクに書き出すのはMATLAB版だけです。訓練データとテストデータ(.matファイル)は共通です。MEX版はMATLABのversionが異なればコンパイル(Make.m)を実行する必要があります。LibSVMのMATLABインタフェースもMake.mを実行してから使うのと同じ要領です。LibSVMのデータ(.matファイル)のフォーマットはFCM識別器とは異なります。
PCAの前処理をData Reduction, Autoencoderなどの目的で用いているので、さらに簡単なkd-Treeでも識別精度はそれほど悪くなりません。Random Projectionは乱数の出方で低精度になる場合がありえます。
LibSVMでも同じデータを用いて比較しています。また、LibSVMはMATLABインターフェース版を用いていて、データは.matファイルで、その読み込み部分だけはMATLABです。
FCM識別器は for loopなどの計算の遅い箇所を部分的にC言語に書き換えてMEXを用いることで数倍(3~5倍)高速化できました。プログラム全体を自動でC言語に変換したり、コンパイルすることも可能ですが、私がやってみた範囲ではあまり速くなりませんでした。Cのコンパイラーや最適化オプションでも変わるかもしれませんが。マトリックス演算はMATLABにして(Cよりも高速とされています)、部分的にC言語に書き直して、計算が速くなるようなコーディングをした方が高速化できそうです。
FCM識別器は科学研究費 基盤研究(C)
・ファジィクラスタリングに基づく高精度識別器
・ファジィc平均識別器の高精度・高機能化
の6年間の成果です。
Automated Meter Reading https://youtu.be/E14WxtFKk8g
人工知能ブームですが、機械学習にこんなに簡単で、結構性能も良いのがあります。
学習時間はゼロですが一応機械学習です。訓練データが大量で識別に時間がかかる場合は近似最近傍探索ANNを用いることもできます。この動画のように識別のクラス数をいくらでも増やすことができます。
以下も最近傍識別器を用いています。
https://youtu.be/duK2s5xW9qk rock-paper-scissors
https://youtu.be/PKS1X3q0vaM MeterTaco
https://youtu.be/Ywbk1ASWMuo Soccer Player
https://youtu.be/L-EPZrZGWHg Pedestrian
FCM識別器はメモリーと識別時間を小さくするのに有効ですが、クラス数はあまり大きくできません。