2012-05-27 11 views
5

私はアグロメラティブクラスタリングアルゴリズムについて知っています。個々のクラスタとして各データポイントから始まり、ポイントを結合してクラスターを形成する方法です。最初からカスタムアグロメレーションアルゴリズムを実装する

今、私は、これらの次元のそれぞれに値を持つ次元空間といくつかのデータポイントを持っています。次元1間でクラスタ間の距離が< T1で、寸法を横断する距離2 < T2場合、二つの点C1とC2

  • クラスタ..:私のようなビジネスルールに基づいて、2つのポイント/クラスタをクラスタ化します寸法と距離nの間の距離< Tn。
  • 次元1全体のルールが満たされていると次元2間のルールが満たされた場合には、他の寸法を気にすることなく、それらをクラスタ化...

....と同様のカスタムルール。

さらに、特定の次元の任意の2つのクラスタ間の距離を定義して測定する独自の方法があります。ディメンションは文字列を保持している可能性があり、私は自分の文字列距離メトリックを定義したいと思います。別の次元では、位置の名前を保持することができ、この次元に沿った2つの点の間の距離は、名前を付けられた場所の間の地理的距離などであり、他の次元についても同様である。

カスタム距離メトリックを定義するこの方法を実装し、凝集クラスタリングを実装するためのフレームワーク/ソフトウェアがありますか?もちろん、アグロメラクティブクラスタリングは、ビジネスルールがいつでも満たされなくなったときに停止し、最後にn次元空間にクラスタが形成されます。

おかげ アビシェークS

+0

私はJAVAを使用したい、それが:-) –

答えて

4

あなたはWekaでそれを行うことができます。

Distance Functionを実装し、setDistanceFunction(DistanceFunction distanceFunction)メソッドを使用してHierarchical Clustererに渡す必要があります。

ウェカで使用可能な他のclusterersは以下のとおりです。くもの巣、EM、FarthestFirst、FilteredClusterer、MakeDensityBasedClusterer、RandomizableClusterer、RandomizableDensityBasedClusterer、RandomizableSingleClustererEnhancer、SimpleKMeans、SingleClustererEnhancer。

NormalizableDistanceクラスからの例の距離関数、:

/** Index in ranges for MIN. */ 
    public static final int R_MIN = 0; 

    /** Index in ranges for MAX. */ 

    public static final int R_MAX = 1; 

    /** Index in ranges for WIDTH. */ 
    public static final int R_WIDTH = 2; 

    /** the instances used internally. */ 
    protected Instances m_Data = null; 

    /** True if normalization is turned off (default false).*/ 
    protected boolean m_DontNormalize = false; 

    /** The range of the attributes. */ 
    protected double[][] m_Ranges; 

    /** The range of attributes to use for calculating the distance. */ 
    protected Range m_AttributeIndices = new Range("first-last"); 

    /** The boolean flags, whether an attribute will be used or not. */ 
    protected boolean[] m_ActiveIndices; 

    /** Whether all the necessary preparations have been done. */ 
    protected boolean m_Validated; 


public double distance(Instance first, Instance second, double cutOffValue, PerformanceStats stats) { 
    double distance = 0; 
    int firstI, secondI; 
    int firstNumValues = first.numValues(); 
    int secondNumValues = second.numValues(); 
    int numAttributes = m_Data.numAttributes(); 
    int classIndex = m_Data.classIndex(); 

    validate(); 

    for (int p1 = 0, p2 = 0; p1 < firstNumValues || p2 < secondNumValues;) { 
     if (p1 >= firstNumValues) 
     firstI = numAttributes; 
     else 
     firstI = first.index(p1); 

     if (p2 >= secondNumValues) 
     secondI = numAttributes; 
     else 
     secondI = second.index(p2); 

     if (firstI == classIndex) { 
     p1++; 
     continue; 
     } 
     if ((firstI < numAttributes) && !m_ActiveIndices[firstI]) { 
     p1++; 
     continue; 
     } 

     if (secondI == classIndex) { 
     p2++; 
     continue; 
     } 
     if ((secondI < numAttributes) && !m_ActiveIndices[secondI]) { 
     p2++; 
     continue; 
     } 

     double diff; 

     if (firstI == secondI) { 
     diff = difference(firstI, 
        first.valueSparse(p1), 
        second.valueSparse(p2)); 
     p1++; 
     p2++; 
     } 
     else if (firstI > secondI) { 
     diff = difference(secondI, 
        0, second.valueSparse(p2)); 
     p2++; 
     } 
     else { 
     diff = difference(firstI, 
        first.valueSparse(p1), 0); 
     p1++; 
     } 
     if (stats != null) 
     stats.incrCoordCount(); 

     distance = updateDistance(distance, diff); 
     if (distance > cutOffValue) 
     return Double.POSITIVE_INFINITY; 
    } 

    return distance; 
    } 

あなたは別途(ウェカの属性と呼ばれます)は、さまざまな次元を扱うことができることを示します。したがって、各ディメンション/属性に対して異なる距離を定義できます。

いくつかのインスタンスをクラスタリングすることを避けるためのビジネスルールについて。私はビジネスルールが満たされていないときにDouble.positiveInfinityを返す距離関数を作成できると思います。

+0

は、私たちすることができます利用可能か、私の場合は、好ましくは、フレームワークを使用しますさまざまな次元で別々に距離関数を設定しますか?また、ビジネスルールが一致する場合にのみ2つのポイント/クラスタをクラスタリングするビジネスルールを記述できますか? –

+0

私は自分の答えを更新しました。今、あなたのすべての質問に答えてくれることを願っています:) –

+0

ありがとう、Vitalij。コードを説明することは可能ですか?メソッドで宣言されていないため、いくつかの変数(m_Data、m_ActiveIndicesなど)が何であるかを知ることができません。これらの変数が何であるか教えてくれる参考チュートリアルがありますか? –

2

ELKIの別のオプションです。 Weka(これは主に分類に役立ちます)よりもはるかに多くのクラスタリングアルゴリズムを備えています。 Wikiチュートリアルでは、カスタム距離関数を実装する方法について説明しています(階層型クラスタリングで使用できるはずです): distance function tutorial

「ビジネスルール」は距離関数を指定するための非常に一般的な方法ではないことに注意してください...

+0

さまざまな次元で計算された距離のビジネスルールを指定します。これらのビジネスルールを指定できるフレームワークを知っていますか?そして、ビジネスルールが一致する場合にのみ、フレームワークは2つのデータポイント/クラスターをクラスター化しますか? –

+0

Anony、ELKIを使ってプログラムする方法を知ることができますか?それはとても面白そうです。 –

+0

投稿したチュートリアルのリンクを試しましたか?そして、私はビジネスルールに触れることはありません。彼らは、理由のために "ビジネス"と呼ばれるものです。 –

関連する問題