機械学習関連の関数
機械学習関連の関数はMathematica9でもあります.教師なし学習のクラスタリングもver9で充分可能です.Mathematica10で初めて実装されたのだと勘違いしていたので,実際にMathematica10でどんな関数が追加されたのかを確認しました.
ドキュメントセンターの機械学習では次のように紹介されています.
機械学習
Wolfram言語には,PredictやClassify等の高度に自動化された関数から,特定のメソッドや診断法に基づいた関数まで,統合された幅広い機械学習機能が含まれている.関数は,数値的,分類別,時系列,テキスト,画像等多くの種類のデータに適用できる.
一般的な教師あり学習
Classify — 組込みの分類子を使ったり,例から学習したりして,データをカテゴリに分類する
ClassifierFunction — データに適用する分類子の記号表現
Predict — 組込みの分類子を使ったり,例から学習したりして,データの値を予測する
PredictorFunction — データに適用する予測器の記号表現
ClassifierMeasurements,PredictorMeasurements — テストデータに対するの性能
ClassifierInformation,PredictorInformation — モデル情報等
PerformanceGoal ▪ Method ▪ UtilityFunction ▪ ClassPriors ▪ IndeterminateThreshold
教師あり学習のための特定のメソッド
Nearest — 最近傍を求める
LinearModelFit ▪ LogitModelFit ▪ NonlinearModelFit ▪ GeneralizedLinearModelFit ▪ ProbitModelFit
TimeSeriesModelFit — さまざまな種類の時系列をフィットする
Interpolation — データ集合の値の補間を求める
FindSequenceFunction — 離散数列を再現する関数を求める
FindHiddenMarkovStates — マルコフ(Markov)モデルで最も尤もらしい経路を求める
教師なし学習法
Eigensystem ▪ SingularValueDecomposition ▪ PrincipalComponents ▪ KarhunenLoeveDecomposition
FindClusters — 数値,テキスト,画像等のデータのクラスタを探す
ClusteringComponents — 配列と画像の値を元にクラスタを探す
FindGraphCommunities — グラフ中のコミュニティやクラスタを探す
HiddenMarkovProcess — 数値データの中のパターンを求める
SmoothKernelDistribution — データのカーネル密度推定を求める
データの準備 »
Standardize — 平均がゼロで単位分散を持つようにデータを変換する
Clip ▪ Rescale ▪ Threshold ▪ LogisticSigmoid ▪ ImageAdjust
CountsBy ▪ GroupBy ▪ SortBy ▪ DeleteDuplicates
データのフィルタリング »
MovingAverage — リスト,時系列などの移動平均を計算する
GaussianFilter ▪ MeanFilter ▪ MeanShiftFilter ▪ LowpassFilter ▪ ...
この中でMathematica10で新しく導入されたのはこちらです.
一般的な教師あり学習
Classify
ClassfierFunction
Predict
PredictorFunction
ClassifierMeasurements,
PredictorMeasurements
ClassifierInformation
PredictorInformation
UtilityFunction
IndeterminateThreshold
教師あり学習のための特定のメソッド
TimeSeriesModelFit
FindHiddenMarkovStates
教師なし学習法
HiddenMarkovProcess
データの準備 »
LogisticSigmoid
CountsBy
GroupBy
__
主に教師あり学習の関数が追加されているようです.例えばClassify関数の例題で画像のパターン認識をしています.
昼と夜を見分けられるように,分類子を訓練する:
In[1]:=
Out[1]=
In[2]:=
Out[2]=
Classify関数が画像のどんな部分を特徴抽出して判別しているのか分からないけども,なんとなくパターン認識できいてる例ですね.
Mathematicaによる教師なし機械学習 【ClusteringComponents】
Mathematica10では機械学習のための関数が多く導入されています.
機械学習は数値データのみならずテキストや画像データを入力として受けて,予測やクラスタリング,そしてパターン認識などの技術に応用されるアルゴリズムです.発展し続けるビッグデータ&データマイニング分野に役立ちます.
詳しいことは,[ドキュメントセンター] → [データの操作と解析] → [機械学習]からどうぞ.
今回は機械学習の中の教師なし学習で簡単なクラスタリングを行います.
①20コの2次元座標データを入力して散布図を描きます.以下のデータです.
data = {{0.12, 0.12}, {0.12, 0.38}, {0.25, 0.25}, {0.38, 0.12}, {0.38,
0.38}, {0.12, 0.62}, {0.12, 0.88}, {0.25, 0.75}, {0.38,
0.62}, {0.38, 0.88}, {0.62, 0.12}, {0.62, 0.38}, {0.75,
0.25}, {0.88, 0.12}, {0.88, 0.38}, {0.62, 0.62}, {0.62,
0.88}, {0.75, 0.75}, {0.88, 0.62}, {0.88, 0.88}};ListPlot[data]
次のような4つのクラスに分けてもらう,ということを目指します.
②データを加工していきます.ClusteringComponents関数で20コの座標を4つにクラス分けし,それぞれの座標に対するクラスのラベルを取得します.これによってlabelはlist変数としてクラスの番号1~4のどれかが入ります.
label = ClusteringComponents[data, 4, 1, Method -> "Optimize"]
>出力結果
label
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4}
例えば出力結果ではlabelの第1要素から第5要素までが1になっているので,dataの第1座標から第5座標が"1"のクラスに分けられたことがわかります.
最後に"1"~"4"のクラスごとにデータを分けて,改めて散布図を描けばクラスごとに色分けされます.べた書きです.
class1 = {};
class2 = {};
class3 = {};
class4 = {};
For[i = 1, i <= Length[data], i++,
Switch[label[ [i]],
1, AppendTo[class1, data[ [i]]],
2, AppendTo[class2, data[ [i]]],
3, AppendTo[class3, data[ [i]]],
4, AppendTo[class4, data[ [i]]];]
]ListPlot[{class1, class2, class3, class4}]
(*data[ [i]]に半角スペースを入れているのは,はてなブログの自動変換機能を避けるためです.そうしないとこうなる,datai.Part関数を使ってもOK.)
無事に狙い通りのクラス分けをしてくれました.
[補足1]
クラスタ数を入力できるように書き直しました.
c = 4;(*クラスタ数*)
label = ClusteringComponents[data, c, 1, Method -> "Optimize"](*空のクラスをクラスタ数だけ生成*)
class = Table[{}, {i, 1, c}];
(*データをクラスに分ける*)
For[i = 1, i <= c, i++,
pos = Flatten[Position[label, i]];
For[j = 1, j <= Length[pos], j++,
AppendTo[classi, datapos[ [j]]]
]
]ListPlot[class]
[補足2]
label = ClusteringComponents[data, 4, 1, Method -> "KMeans"]
クラスタリングのメソッドをKMeans法に変えてみるとこのような結果に.
青色と黄色のクラスが予想通りにはなっていません.
KMeans法は,始めに乱数を用いて各データをランダムにクラスに割り当てをします.そして逐次,クラスを改善していく手法であり,乱数によってはこちらが期待した結果にならない場合があることが原因のようです.
ClusteringComponents[data2, 4, 1, Method -> "KMeans",
"RandomSeed" -> 10]
ランダムシードを色々変えてみるとうまくいきます.
ClusteringComponentsだけでクラスタリングに必要な作業がすべてできるので簡単です.
[追記1]
教師なしクラスタリングを一挙に行うFindClusters関数というのがありました.
class = FindClusters[data, 4]
{{{0.12, 0.12}, {0.12, 0.38}, {0.25, 0.25}, {0.38, 0.12}, {0.38,
0.38}}, {{0.12, 0.62}, {0.12, 0.88}, {0.25, 0.75}, {0.38,
0.62}, {0.38, 0.88}}, {{0.62, 0.12}, {0.62, 0.38}, {0.75,
0.25}, {0.88, 0.12}, {0.88, 0.38}}, {{0.62, 0.62}, {0.62,
0.88}, {0.75, 0.75}, {0.88, 0.62}, {0.88, 0.88}}}ListPlot[class]
・ClusteringComponents関数は与えられたデータをクラスに分けてそのラベルのリストを出力する
・FindClusters関数は与えられたデータをクラスごとにリストでまとめたものを出力する
Mathematica10 トライアル版インストール
計算ソフトMathematica10が2014年7月21日導入されました.新機能などはこちらから.30日間の無料評価版(free 30-day trial version)がインストールできます.以下の手順でインストールできます.
1.ダウンロードの準備
http://www.wolfram.com/mathematica/new-in-10/ ←こちらから
ダウンロードにはMathematicaを販売しているWolframのIDが必要です.
言語は英語と日本語の2種類がありLanguageから選択できます.英語を選べばヘルプなど当然すべてが英語になります.Mathematicaの使用にはヘルプにとてもお世話になるので日本語の方が良いです.
2.セットアップファイルをダウンロード
Wolfram IDの発行などが,うまくできればこのような画面がでます.
・Windows version
・Mac version
・Linux version
の3つが選べます.僕はWindowsのものを選択.画面左側のアクティベートキーを後で使うのでブラウザ画面をこのまま残しておくと楽です(同じ内容が登録したメールアドレスに届くので消しても問題ないですが).
日本語のWindows版を選んだ場合は,「Mathematica_10.0.0_Japanese_WIN.zip」という圧縮されたzipファイルがダウンロードできますので,ダウンロード後は解凍が必要です.ファイルは3GBを超えているのでダウンロードに時間がかかると思います.
(メモ:zipファイルの容量が大きいのでLhaplusだと解凍に失敗するかもしれません.僕はできて友達はだめだったのでLhaplusのversionによるのかも.ダメだった場合は諦めずに別の解凍ソフトを使いましょう!例えばExplzhなら解凍できるようです).
英語のWindows版は「Mathematica_10.0.0_WIN.exe」がダウンロードできます.
3.インストール
セットアップファイルを実行します.カチカチと次へ次へ.
4.アクティベート
Mathematica10を初めて起動すると,アクティベートキーの入力を求められます.ダウンロード画面もしくはWolframに登録したメールアドレスにアクティベートキーがあるのでそれを入力すればOKです.
「新規ドキュメント」から新しいファイルが作れますよ!