Python で Clustering を使用する方法

Python で Clustering を使用する方法

Aspose.PDF FOSS for Python は、小規模で汎用的な階層的凝集クラスタリングユーティリティをバンドルしています — 任意の単一 PDF 操作から独立して — 関連する DataPoint オブジェクトを Cluster インスタンスにグループ化し、クラスタの重心を計算します。各データポイントが何を表すかはユーザーが決定し、座標は自分で提供します;ユーティリティが自動的に埋め込むことはありません。ライブラリは以下のコマンドでインストールできます。

ステップバイステップガイド

ステップ 1: パッケージをインストールする

Aspose.PDF FOSS パッケージをインストールする:

git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .

Cluster をインポートし、確認メッセージを出力してインストールを検証します:

from aspose_pdf import Cluster
print("aspose-pdf-foss-for-python is ready.")

ステップ 2: 必要なクラスをインポートする

クラスタリングユーティリティを構成する3つのクラスをインポートします:

from aspose_pdf import Cluster, ClusterCollection, DataPoint

ステップ 3: データポイントを作成する

A DataPoint は name 文字列と value の浮動小数点数リストを組み合わせます — 座標または特徴ベクトルで、独自のグルーピングロジックにとって意味のあるものを決定してください:

from aspose_pdf import DataPoint

point_a = DataPoint("item-1", [12.0, 45.0])
point_b = DataPoint("item-2", [13.5, 44.0])
point_c = DataPoint("item-3", [98.0, 5.0])

print(point_a.name, point_a.value)

DataPoint は value を特定の PDF 概念に結びつけません — ページ座標、フォントメトリクス、またはその他の数値特徴ベクトルのいずれも同様に機能します。


ステップ 4: データポイントをクラスタにグループ化する

完全なメンバーシップリストを Cluster コンストラクタに渡します。構築後に Cluster に項目を追加するメソッドはないため、先にメンバーシップを決定してください:

from aspose_pdf import Cluster

nearby = Cluster([point_a, point_b])
print(nearby.count)              # 2
print(nearby.contains(point_a))  # True

contains() は等価性でマッチします — DataPoint は name と value を合わせて等価性を定義するため、同じ名前と値を持つ別の DataPoint インスタンスも含まれていると報告されます。


ステップ5:クラスタの重心を計算

DataPoint.get_centroid(cluster) は、クラスタ内のすべての DataPoint.value の各次元の平均を取る静的メソッドで、結果を "centroid" という名前の新しい DataPoint として返します:

from aspose_pdf import DataPoint

centroid = DataPoint.get_centroid(nearby)
print(centroid.name)   # "centroid"
print(centroid.value)  # per-dimension average across the cluster

クラスタ内のすべての DataPoint.value リストは同じ長さである必要があります — get_centroid は位置ごとに平均を取り、長さが一致しているか検証しません。Cluster.empty() や、count == 0 を含む任意のクラスタで呼び出すと、ValueError が発生します。


ステップ6:クラスタをクローンするか、共有の空インスタンスを再利用する

clone() は同じアイテムを保持する独立した Cluster を返します;Cluster.empty() は常に新しいインスタンスを割り当てる代わりに、同じキャッシュされた空クラスタインスタンスを返します:

from aspose_pdf import Cluster

backup = nearby.clone()
print(backup is nearby)          # False -- independent copy
print(backup.contains(point_a))  # True -- same items

placeholder = Cluster.empty()
print(placeholder.count)         # 0

ステップ7:複数のクラスタを ClusterCollection にグループ化する

ClusterCollection は、単一の len()-aware コンテナの背後に複数の Cluster オブジェクトを束ねます:

from aspose_pdf import Cluster, ClusterCollection

outliers = Cluster([point_c])
collection = ClusterCollection([nearby, outliers])
print(len(collection))  # 2

ClusterCollection はクラスタを取り出すメソッドを公開していません — コンストラクタに渡したリストへの参照を保持しておけば、後でクラスタを反復処理できます。

一般的な問題と対策

既存のものに項目を追加する方法はありません Cluster

Clusterは構築時(Cluster(items))にメンバーシップリストのみ受け取ります。まずDataPointオブジェクトの完全なリストを作成し、次にClusterを構築してください — その後に呼び出すadd()やappend()は存在しません。

DataPoint.get_centroid() raises ValueError

これは、渡されたクラスターが空(count == 0)である場合に発生します。Cluster.empty()も含まれます。cluster.countを確認してからget_centroidを呼び出すか、空のクラスターがワークフローで有効な入力である場合は例外をハンドルしてください。

重心の値が正しくありません

get_centroidは各DataPoint.valueの位置を順に合計し、点の数で割ります — クラスター内のすべてのvalueリストが同じ長さであるかはチェックしません。次元が一致しないDataPointオブジェクトを混在させると、例外を発生させずに不正確な平均が静かに生成されます。

Expecting Cluster.empty() 毎回新しい空のクラスターを作成する

Cluster.empty() はシングルトンアクセッサです — 呼び出すたびに同じキャッシュされたインスタンスが返されます。別々の独立した空クラスターが必要な場合は、Cluster()(引数なし)を代わりに使用してください。

ライブラリが自動的にポイントをグループ化することを期待しています

DataPoint、Cluster、および ClusterCollection は、ポイント、クラスター、重心計算を表すデータ構造です — このモジュールには、どのポイントが一緒になるかを決定するリンクや距離関数は含まれていません。Cluster を構築する前に、独自のコードでクラスターのメンバーシップを決定してください。

よくある質問

このモジュールは距離に基づいてデータポイントを自動的にグループ化しますか?

いいえ。Cluster、DataPoint、および ClusterCollection は、既に決定されたグループと重心の計算を表す基本構成要素です — 組み込みの凝集や距離ベースの割り当てステップはありません。

Cluster() と Cluster.empty() の違いは何ですか?

Cluster(items=None) は呼び出されるたびに新しいインスタンスを作成します。Cluster.empty() はクラスメソッドで、呼び出すたびに同じキャッシュされた共有の空クラスターインスタンスを返します。

作成した後で Cluster にアイテムを追加できますか?

いいえ。Cluster は構築以外では contains()、clone()、および count プロパティのみを公開します — コンストラクタが実行された時点でメンバーシップは固定されます。

get_centroid() は任意の次元数で動作しますか?

はい、クラスター内のすべての DataPoint.value リストの長さが同じである限り可能です。get_centroid は各次元を個別に平均し、その結果を新しい DataPoint として返します。

ClusterCollection は単純な Python クラスタのリストに対して何を追加しますか?

主に len() サポートを備えた型付きコンテナです。構築元のリストに既にあるもの以外に、イテレーション、検索、マージの動作は追加されません。

参照

 日本語