對數字的 2D 嵌入進行各種凝聚分群#

說明對數字資料集的 2D 嵌入進行凝聚分群的各種鏈接選項。

此範例的目標是直觀地展示度量的工作方式,而不是為數字找到好的群集。這就是為什麼範例在 2D 嵌入上運作。

此範例向我們展示的是凝聚分群的「富者更富」行為,這種行為往往會產生大小不均的群集。

這種行為對於平均鏈接策略來說很明顯,最終會產生一些資料點很少的群集。

單一鏈接的情況甚至更病態,有一個覆蓋大多數數字的非常大的群集、一個帶有大多數零數字的中等大小(乾淨)群集,以及所有其他群集都從邊緣附近的雜訊點中提取。

其他鏈接策略會產生更均勻分佈的群集,因此可能對資料集的隨機重新取樣不那麼敏感。

  • ward linkage
  • average linkage
  • complete linkage
  • single linkage
Computing embedding
Done.
ward :  0.06s
average :       0.05s
complete :      0.05s
single :        0.02s

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

from time import time

import numpy as np
from matplotlib import pyplot as plt

from sklearn import datasets, manifold

digits = datasets.load_digits()
X, y = digits.data, digits.target
n_samples, n_features = X.shape

np.random.seed(0)


# ----------------------------------------------------------------------
# Visualize the clustering
def plot_clustering(X_red, labels, title=None):
    x_min, x_max = np.min(X_red, axis=0), np.max(X_red, axis=0)
    X_red = (X_red - x_min) / (x_max - x_min)

    plt.figure(figsize=(6, 4))
    for digit in digits.target_names:
        plt.scatter(
            *X_red[y == digit].T,
            marker=f"${digit}$",
            s=50,
            c=plt.cm.nipy_spectral(labels[y == digit] / 10),
            alpha=0.5,
        )

    plt.xticks([])
    plt.yticks([])
    if title is not None:
        plt.title(title, size=17)
    plt.axis("off")
    plt.tight_layout(rect=[0, 0.03, 1, 0.95])


# ----------------------------------------------------------------------
# 2D embedding of the digits dataset
print("Computing embedding")
X_red = manifold.SpectralEmbedding(n_components=2).fit_transform(X)
print("Done.")

from sklearn.cluster import AgglomerativeClustering

for linkage in ("ward", "average", "complete", "single"):
    clustering = AgglomerativeClustering(linkage=linkage, n_clusters=10)
    t0 = time()
    clustering.fit(X_red)
    print("%s :\t%.2fs" % (linkage, time() - t0))

    plot_clustering(X_red, clustering.labels_, "%s linkage" % linkage)


plt.show()

腳本的總執行時間: (0 分鐘 1.583 秒)

相關範例

在玩具資料集上比較不同的階層式連結方法

在玩具資料集上比較不同的階層式連結方法

具有和不具有結構的聚合式分群

具有和不具有結構的聚合式分群

手寫數字上的流形學習:局部線性嵌入、Isomap…

手寫數字的流形學習:局部線性嵌入、Isomap...

視覺化股票市場結構

視覺化股票市場結構

由 Sphinx-Gallery 產生的圖庫