Python でのOPTICSアルゴリズムのまともな実装を探しています。これを使用して、密度ベースの点のクラスター ((x,y) ペア) を形成します。
(x,y) ペアを取り、クラスターのリストを出力するものを探しています。リスト内の各クラスターには、そのクラスターに属する (x, y) ペアのリストが含まれています。
Python でのOPTICSアルゴリズムのまともな実装を探しています。これを使用して、密度ベースの点のクラスター ((x,y) ペア) を形成します。
(x,y) ペアを取り、クラスターのリストを出力するものを探しています。リスト内の各クラスターには、そのクラスターに属する (x, y) ペアのリストが含まれています。
OPTICS の完全かつ正確な Python 実装については知りません。ここに掲載されているリンクは、OPTICS のアイデアの大まかな概算にすぎません。また、高速化のためにインデックスを使用しないため、 で実行されるO(n^2)
可能性が高くなりO(n^3)
ます。
OPTICS には、当たり前のアイデア以外にも、いくつかのトリッキーな機能があります。特に、しきい値処理は、ここに掲載されている絶対しきい値ではなく、相対しきい値 ("xi") を使用して行うことを提案しています (その時点で、結果はほぼ DBSCAN の結果になります!)。
元の OPTICS の論文には、アルゴリズムの出力を実際のクラスターに変換するための提案されたアプローチが含まれています。
http://www.dbs.informatik.uni-muenchen.de/Publikationen/Papers/OPTICS.pdf
Weka での OPTICS の実装は、基本的に保守されておらず、不完全です。実際にクラスターを生成するのではなく、クラスターの順序を計算するだけです。このために、データベースの複製を作成します - それは実際には Weka コードではありません。
最初に OPTICS を公開したグループによって、ELKI in Javaで利用可能なかなり広範な実装があるようです。この「公式」バージョンに対して他の実装をテストすることをお勧めします。
編集:以下は、OPTICSの完全な実装ではないことがわかっています。
クイック検索を行ったところ、次のものが見つかりました(光学)。その品質を保証することはできませんが、アルゴリズムは非常に単純なように見えるので、すぐに検証/適応できるはずです。
光学アルゴリズムの出力でクラスターを構築する方法の簡単な例を次に示します。
def cluster(order, distance, points, threshold):
''' Given the output of the options algorithm,
compute the clusters:
@param order The order of the points
@param distance The relative distances of the points
@param points The actual points
@param threshold The threshold value to cluster on
@returns A list of cluster groups
'''
clusters = [[]]
points = sorted(zip(order, distance, points))
splits = ((v > threshold, p) for i,v,p in points)
for iscluster, point in splits:
if iscluster: clusters[-1].append(point)
elif len(clusters[-1]) > 0: clusters.append([])
return clusters
rd, cd, order = optics(points, 4)
print cluster(order, rd, points, 38.0)
技術的には OPTICS ではありませんが、 https://github.com/lmcinnes/hdbscanで入手できる Python 用の HDBSCAN* 実装があります。これは、最大イプシロンが無限大で、クラスター抽出方法が異なる OPTICS と同等です。実装により、生成されたクラスター階層へのアクセスが提供されるため、必要に応じて、より従来の OPTICS メソッドを使用して、そこからクラスターを抽出することもできます。
イプシロン パラメータを制限していないにもかかわらず、この実装は kd-tree および ball-tree ベースの最小スパニング ツリー アルゴリズムを使用して O(n log(n)) パフォーマンスを達成し、非常に大きなデータセットを処理できることに注意してください。
Python と OPTICS の C++ 実装を含むライブラリpyclusteringが存在します。
http://www.chemometria.us.edu.pl/index.php?goto=downloadsの「密度ベースのクラスタリング アプローチ」を 参照してください。
空間充填曲線または空間インデックスを見たいとします。sfc は、2 次元の複雑さを 1 次元の複雑さに減らします。Nick のヒルベルト曲線四分木空間インデックス ブログを見たいとします。私の sfc の実装を phpclasses.org (hilbert-curve) からダウンロードしたいと考えています。