以前にクラスタリングを実装する (C#) を投稿しましたが、
クラスタリングの機能をライブラリ化して Bellona.Analysis (GitHub) を作成しました。
NuGet にも同じ名前で登録してあります。
基本となるアルゴリズムは k 平均法 (k-means 法) です。
しかし通常の k 平均法では、
- 生成されるクラスターの数をあらかじめ指定しなければならない
- 初期クラスターの重心をランダムで決定するため、再現性がない
- 偏りがあって納得感のない結果になることもある
という問題点がありました。
そこでこのライブラリでは、クラスター数をあらかじめ指定する通常の方法に加えて、
クラスター数が自動で決定される方法も用意しました。
クラスター数を自動で決定するために、各クラスター内において値のばらつき具合を判定して調整します。
すなわち、ある偏差値を閾値として、それを超える値がクラスター内に存在する場合はクラスターを分割します。
これにより、クラスターとして納得感のない状態を回避します。
また、クラスター数が 1 の状態から開始してクラスターを分割していくため、自然にどこかで収束し、
同じデータを使えば同じ結果が得られます。
基本的な使い方は次の通りです。
using System; | |
using System.Drawing; | |
using Bellona.Analysis.Clustering; | |
namespace ClusteringConsole | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
// 色のデータを用意します (実際にはもっと多く)。 | |
var colors = new[] { Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Indigo, Color.Violet }; | |
// ClusteringModel.CreateAuto メソッドでモデルを初期化します。 | |
// ラムダ式で、特徴量を表すベクトルを指定します。 | |
// Train メソッドで学習させます。 | |
var model = ClusteringModel.CreateAuto<Color>(c => new double[] { c.R, c.G, c.B }) | |
.Train(colors); | |
// 学習結果のモデルから、クラスターにアクセスします。 | |
var cluster0 = model.Clusters[0]; | |
// 各クラスターには 0 から始まる ID が付けられます。 | |
Console.WriteLine(cluster0.Id); | |
// クラスターに含まれる要素を列挙します。 | |
foreach (var record in cluster0.Records) | |
Console.WriteLine(record.Element.Name); | |
// 別の色をクラスターに割り当てます (この場合、学習はしません)。 | |
var assignedCluster = model.Assign(Color.Gold); | |
} | |
} | |
} |
Train メソッドには、オプション引数として
最大クラスター数 (maxClustersNumber) および最大偏差値 (maxStandardScore) を指定できます。
maxStandardScore の既定値を 1.645 としています。これは、正規分布において 90% 以内を意味します。
データの性質に応じて、この maxStandardScore をチューニングするとよいでしょう。
(maxStandardScore の単位は標準偏差 σ です。偏差値 50, 60, 70 はそれぞれ 0, σ, 2σ に対応します。)
// 最大クラスター数および最大偏差値を指定して学習させます。 | |
// 1.5σ は偏差値 65 を意味します。 | |
var model = ClusteringModel.CreateAuto<Color>(c => new double[] { c.R, c.G, c.B }) | |
.Train(colors, 20, 1.5); |
なお、クラスター数が 1 の状態から開始してクラスターを分割していくため、処理時間はかなりかかります。
したがってデータ数が大きい場合は、まずクラスター数が固定されたモデルで学習させ、
次に自動モードに変換して再学習するとよいでしょう。
// クラスター数を固定するには、ClusteringModel.CreateFromNumber メソッドでモデルを初期化します。 | |
var fixedModel = ClusteringModel.CreateFromNumber<Color>(c => new double[] { c.R, c.G, c.B }, 10) | |
.Train(colors); | |
// ClusteringModel オブジェクトを AutoClusteringModel オブジェクトに変換します。 | |
var autoModel = fixedModel.ToAutoModel() | |
.Train(new Color[0]); |
サンプル
Bellona.Analysis を利用したサンプルのソースコードは ClusteringSample にあります。
System.Drawing.Color 構造体に含まれる色:
日本の都道府県庁所在地の緯度・経度:
バージョン情報
.NET Framework 4.5