Сравнение BIRCH и MiniBatchKMeans#

Этот пример сравнивает время выполнения BIRCH (с шагом глобальной кластеризации и без него) и MiniBatchKMeans на синтетическом наборе данных, содержащем 25 000 образцов и 2 признака, сгенерированных с помощью make_blobs.

Оба MiniBatchKMeans и BIRCH являются очень масштабируемыми алгоритмами и могут эффективно работать на сотнях тысяч или даже миллионах точек данных. Мы выбрали ограничить размер набора данных в этом примере в интересах сохранения разумного использования ресурсов нашего Continuous Integration, но заинтересованный читатель может получить удовольствие, отредактировав этот скрипт для повторного запуска с большим значением для n_samples.

Если n_clusters установлено в None, данные сокращаются с 25 000 образцов до набора из 158 кластеров. Это можно рассматривать как этап предварительной обработки перед финальным (глобальным) этапом кластеризации, который дополнительно сокращает эти 158 кластеров до 100 кластеров.

BIRCH without global clustering, BIRCH with global clustering, MiniBatchKMeans
BIRCH without global clustering as the final step took 0.43 seconds
n_clusters : 158
BIRCH with global clustering as the final step took 0.47 seconds
n_clusters : 100
Time taken to run MiniBatchKMeans 0.18 seconds

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

from itertools import cycle
from time import time

import matplotlib.colors as colors
import matplotlib.pyplot as plt
import numpy as np
from joblib import cpu_count

from sklearn.cluster import Birch, MiniBatchKMeans
from sklearn.datasets import make_blobs

# Generate centers for the blobs so that it forms a 10 X 10 grid.
xx = np.linspace(-22, 22, 10)
yy = np.linspace(-22, 22, 10)
xx, yy = np.meshgrid(xx, yy)
n_centers = np.hstack((np.ravel(xx)[:, np.newaxis], np.ravel(yy)[:, np.newaxis]))

# Generate blobs to do a comparison between MiniBatchKMeans and BIRCH.
X, y = make_blobs(n_samples=25000, centers=n_centers, random_state=0)

# Use all colors that matplotlib provides by default.
colors_ = cycle(colors.cnames.keys())

fig = plt.figure(figsize=(12, 4))
fig.subplots_adjust(left=0.04, right=0.98, bottom=0.1, top=0.9)

# Compute clustering with BIRCH with and without the final clustering step
# and plot.
birch_models = [
    Birch(threshold=1.7, n_clusters=None),
    Birch(threshold=1.7, n_clusters=100),
]
final_step = ["without global clustering", "with global clustering"]

for ind, (birch_model, info) in enumerate(zip(birch_models, final_step)):
    t = time()
    birch_model.fit(X)
    print("BIRCH %s as the final step took %0.2f seconds" % (info, (time() - t)))

    # Plot result
    labels = birch_model.labels_
    centroids = birch_model.subcluster_centers_
    n_clusters = np.unique(labels).size
    print("n_clusters : %d" % n_clusters)

    ax = fig.add_subplot(1, 3, ind + 1)
    for this_centroid, k, col in zip(centroids, range(n_clusters), colors_):
        mask = labels == k
        ax.scatter(X[mask, 0], X[mask, 1], c="w", edgecolor=col, marker=".", alpha=0.5)
        if birch_model.n_clusters is None:
            ax.scatter(this_centroid[0], this_centroid[1], marker="+", c="k", s=25)
    ax.set_ylim([-25, 25])
    ax.set_xlim([-25, 25])
    ax.set_autoscaley_on(False)
    ax.set_title("BIRCH %s" % info)

# Compute clustering with MiniBatchKMeans.
mbk = MiniBatchKMeans(
    init="k-means++",
    n_clusters=100,
    batch_size=256 * cpu_count(),
    n_init=10,
    max_no_improvement=10,
    verbose=0,
    random_state=0,
)
t0 = time()
mbk.fit(X)
t_mini_batch = time() - t0
print("Time taken to run MiniBatchKMeans %0.2f seconds" % t_mini_batch)
mbk_means_labels_unique = np.unique(mbk.labels_)

ax = fig.add_subplot(1, 3, 3)
for this_centroid, k, col in zip(mbk.cluster_centers_, range(n_clusters), colors_):
    mask = mbk.labels_ == k
    ax.scatter(X[mask, 0], X[mask, 1], marker=".", c="w", edgecolor=col, alpha=0.5)
    ax.scatter(this_centroid[0], this_centroid[1], marker="+", c="k", s=25)
ax.set_xlim([-25, 25])
ax.set_ylim([-25, 25])
ax.set_title("MiniBatchKMeans")
ax.set_autoscaley_on(False)
plt.show()

Общее время выполнения скрипта: (0 минут 3.205 секунд)

Связанные примеры

Сравнение алгоритмов кластеризации K-Means и MiniBatchKMeans

Сравнение алгоритмов кластеризации K-Means и MiniBatchKMeans

Эмпирическая оценка влияния инициализации k-means

Эмпирическая оценка влияния инициализации k-means

Сравнение различных алгоритмов кластеризации на игрушечных наборах данных

Сравнение различных алгоритмов кластеризации на игрушечных наборах данных

Агломеративная кластеризация с разными метриками

Агломеративная кластеризация с разными метриками

Галерея, созданная Sphinx-Gallery