5
from scipy.cluster.hierarchy import dendrogram, linkage,fcluster
import numpy as np
import matplotlib.pyplot as plt

# data
np.random.seed(4711)  # for repeatability of this tutorial
a = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[100,])
b = np.random.multivariate_normal([0, 20], [[3, 1], [1, 4]], size=[50,])
X = np.concatenate((a, b),)

plt.scatter(X[:,0], X[:,1])

ここに画像の説明を入力

# fit clusters
Z = linkage(X, method='ward', metric='euclidean', preserve_input=True)

# plot dendrogram

ここに画像の説明を入力

max_d = 50
clusters = fcluster(Z, max_d, criterion='distance')

# now if I have new data
a = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[10,])
b = np.random.multivariate_normal([0, 20], [[3, 1], [1, 4]], size=[5,])
X_test = np.concatenate((a, b),)
print(X_test.shape)  # 150 samples with 2 dimensions
plt.scatter(X_test[:,0], X_test[:,1])
plt.show()

ここに画像の説明を入力

新しいデータの距離を計算し、トレーニング データのクラスターを使用してクラスターを割り当てる方法は?

コード参照: joernhees.de

4

1 に答える 1

4

あなたはそうしない。

クラスタリングには、トレーニング ステージとテスト ステージがありません。これは探索的アプローチです。データを探索します。また、アルゴリズムを再実行して新しいデータを探索することもできます。しかし、このアルゴリズムの性質上、新しいデータを古い構造に有意義に「割り当てる」ことはできません。このデータによって、発見された構造が完全に変更される可能性があるからです。

分類が必要な場合は、分類子を使用します。

クラスタリング アルゴリズムは、分類子の代わりにはなりません。新しいインスタンスを分類する場合は、分類子を使用し、たとえば次のワークフローを使用します。

  1. クラスタリングを使用してデータを探索する (何度も)
  2. ドメインの専門家が意味があると判断したクラスターでトレーニング データにラベルを付けます (クラスター化を検証してください!)。
  3. 分類器のトレーニング
  4. 分類器を使用して、新しいインスタンスに同じ方法でラベルを付けます

もちろん、いくつかの例外があります。k-means と Ward では (ただし、たとえばシングルリンクではそうではありません)、nearest-centroid-classifier、発見されたモデルを新しいデータに直接適用できます。それでも、これはクラスタリングを静的分類器に「変換」することを意味し、結果は完全なデータセットで局所最適でなくなる可能性があります (参照: 概念のドリフト)

于 2015-12-29T02:33:19.510 に答える