6

私は凝集クラスタリング アルゴリズムについて知っています。これは、各データ ポイントを個別のクラスタとして開始し、ポイントを結合してクラスタを形成する方法です。

現在、n次元空間と、これらの各次元にわたる値を持ついくつかのデータ ポイントがあります。次のようなビジネス ルールに基づいて、2 つのポイント/クラスターをクラスター化したいと考えています。

  • 次元 1 でのクラスター間の距離が < T1 で、次元 2 での距離が < T2 である場合、... および次元 n での距離 < Tn の場合、2 つのポイント c1 と c2 をクラスター化します。
  • 次元 1 のルールが満たされ、次元 2 のルールが満たされている場合、他の次元を気にせずにそれらをクラスター化します...

.... および同様のカスタム ルール。

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

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

ありがとうアビシェクS

4

2 に答える 2

5

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

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

Weka で利用可能なその他のクラスタラーは次のとおりです。

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;
  }

さまざまな次元 (Weka では属性と呼ばれます) を別々に扱うことができることを示しています。したがって、ディメンション/属性ごとに異なる距離を定義できます。

一部のインスタンスが一緒にクラスター化されないようにするためのビジネス ルールについて。Double.positiveInfinityビジネスルールが満たされない場合に戻る距離関数を作成できると思います。

于 2012-05-27T13:52:20.533 に答える
2

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

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

于 2012-05-30T15:32:39.367 に答える