4

ELKI をプログラムで使用して、k-medoids クラスタリング アルゴリズムを実行する必要があります。アルゴリズムに入力したい類似度行列があります。

ELKI アルゴリズムを実行するためのコード スニペットはありますか? Database基本的に、オブジェクトとRelationオブジェクトの作成方法、カスタム距離関数の作成方法、アルゴリズム出力の読み取り方法を知る必要があります。

残念ながら、ELKI チュートリアル ( http://elki.dbs.ifi.lmu.de/wiki/Tutorial ) は GUI バージョンと新しいアルゴリズムの実装に焦点を当てており、Javadoc を見てコードを書こうとするのはイライラします。

誰かが k-medoid 用の使いやすいライブラリを知っている場合、それはおそらくこの質問に対する良い答えです。

4

2 に答える 2

5

ドキュメントへの貢献に感謝します。(更新:今のところ、この投稿を新しい ELKI チュートリアル エントリに変更しました。)

ELKI は、さまざまな理由から、Java を他のアプリケーションに埋め込まないことを提唱しています。これが、MiniGUI (またはそれが構築するコマンド ライン) の使用をお勧めする理由です。カスタム コードの追加は、カスタムとして、ResultHandlerまたは単に を使用しResultWriterて結果のテキスト ファイルを解析することによって行うのが最適です。

本当にコードに組み込みたい場合(特に、複数のリレーションが必要で、異なるインデックス構造を相互に評価したい場合など、便利な状況がいくつかあります)、取得するための基本的なセットアップを次に示します。DatabaseRelation:

// Setup parameters:
ListParameterization params = new ListParameterization();
params.addParameter(FileBasedDatabaseConnection.INPUT_ID, filename);
// Add other parameters for the database here!

// Instantiate the database:
Database db = ClassGenericsUtil.parameterizeOrAbort(
    StaticArrayDatabase.class,
    params);
// Don't forget this, it will load the actual data...
db.initialize();

Relation<DoubleVector> vectors = db.getRelation(TypeUtil.DOUBLE_VECTOR_FIELD);
Relation<LabelList> labels = db.getRelation(TypeUtil.LABELLIST);

より一般的なプログラムを作成する場合は、 を使用しますNumberVector<?>

ELKI を「ライブラリ」として使用することを (現在) 推奨しない理由:

  1. API はまだ大きく変更されています。オプションを追加し続けていますが、(まだ) 安定した API を提供することはできません。コマンドライン/MiniGUI/パラメータ化は、デフォルト値の処理により、はるかに安定しています.パラメータ化はデフォルト以外のパラメータのみをリストするため、これらが変更された場合にのみ気付くでしょう.

    上記のコード例では、このパターンも使用していることに注意してください。パーサーやデータベースなどを変更しても、このプログラムには影響しません!

  2. メモリ使用量:データ マイニングはメモリを大量に消費します。MiniGUI またはコマンド ラインを使用すると、タスクが終了したときに適切なクリーンアップが行われます。Java から呼び出した場合、変更が非常に多く、参照をどこかに保持し、最終的に大量のメモリ リークが発生します。したがって、完了時にオブジェクトが適切にクリーンアップされていることを確認せずに、上記のパターンを使用しないでください

    コマンド ラインから ELKI を実行すると、次の 2 つの機能が無料で利用できます。

    1. メモリリークはありません。タスクが終了すると、プロセスは終了し、すべてのメモリが解放されます。

    2. 同じデータに対して 2 回再実行する必要はありません。その後の分析では、アルゴリズムを再実行する必要はありません。

  3. ELKI は、正当な理由により組み込み可能なライブラリとして設計されていません。ELKI には多くのオプションと機能があり、これには実行時のメモリ使用量と、特にコードの複雑さの両方で代償が伴います (ただし、R や Weka を簡単に上回ることはできますが!)。ELKI は、データ マイニング アルゴリズムの研究用に設計されており、任意のアプリケーションに簡単に組み込めるようにするためではありません。代わりに、特定の問題がある場合は、ELKI を使用して適切に機能するアプローチを見つけ問題に最適化された方法でそのアプローチを再実装する必要があります

ELKI の最良の使用方法

ヒントとコツは次のとおりです。

  1. MiniGUI を使用してコマンド ラインを作成します。「GUI」のロギング ウィンドウには、対応するコマンド ライン パラメータが表示されることに注意してください。コマンドラインから ELKI を実行するのはスクリプト作成が簡単で、たとえば Grid Engine を介して複数のコンピュータに簡単に配布できます。

    #!/bin/bash
    for k in $( seq 3 39 ); do
        java -jar elki.jar KDDCLIApplication \
            -dbc.in whatever \
            -algorithm clustering.kmeans.KMedoidsEM \
            -kmeans.k $k \
            -resulthandler ResultWriter -out.gzip \
            -out output/k-$k 
    done
    
  2. インデックスを使用します。多くのアルゴリズムでは、インデックス構造が大きな違いを生む可能性があります! (ただし、どのインデックスをどのアルゴリズムに使用できるかを調査する必要があります!)

  3. などの拡張ポイントの使用を検討してくださいResultWriter。この API にフックするのが最も簡単な場合があります。次に、それを使用して、独自の好みの形式で出力または分析するResultUtil結果を選択します。

    List<Clustering<? extends Model>> clusterresults =
        ResultUtil.getClusteringResults(result);
    
  4. オブジェクトを識別するには、ラベルとLabelList関係を使用します。デフォルトのパーサーは、数値属性に沿ったテキスト、つまり次のようなファイルを検出すると、これを行います。

    1.0 2.0 3.0 ObjectLabel1
    

    ラベルでオブジェクトを簡単に識別できます。

更新: 更新については、この投稿から作成された ELKI チュートリアルを参照してください。

于 2013-03-11T09:19:56.620 に答える
3

ELKIのドキュメントはかなりまばらです(例に単純な「helloworld」プログラムが含まれていない理由はわかりません)

Java-MLを試すことができます。そのドキュメントはもう少しユーザーフレンドリーで、K-medoidがあります。

Java-MLを使用したクラスタリングの例| http://java-ml.sourceforge.net/content/clustering-basics

K-medoid | http://java-ml.sourceforge.net/api/0.1.7/

于 2013-03-11T05:05:11.857 に答える