Machine Learning Academy · Урок

K-средних: центроиды, присваивание и обновление

Вы вручную проследите за тремя итерациями алгоритма K-средних, присвоите точки ближайшим центроидам, пересчитаете центроиды и увидите сходимость на двумерной диаграмме рассеяния.

Урок 1 из 413 шагов

«K-средних: центроиды, присваивание и обновление» — бесплатный урок Machine Learning Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Machine Learning Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Machine Learning Academy содержит 4 уроков всего.

Части этого урока еще не переведены и отображаются на английском.

What Is K-Means Clustering?

K-Means is an unsupervised algorithm that partitions n data points into k non-overlapping clusters. Unlike supervised learning, there are no labels — the algorithm discovers structure purely from the feature values. K-Means is fast, scalable, and widely used for customer segmentation, image compression, and anomaly detection.

The Three-Step Algorithm

K-Means repeats three steps until convergence: 1) Initialise — randomly place k centroids in feature space. 2) Assignment — assign every point to the nearest centroid. 3) Update — move each centroid to the mean of its assigned points. The loop stops when assignments no longer change.

Computing Distance to Centroids

In each assignment step, the Euclidean distance from every point to every centroid is computed. A point is assigned to the centroid with the smallest distance. For a point x and centroid c, the squared distance is sum((x_i - c_i)^2). Using squared distance avoids the expensive square-root and gives the same ordering.

import numpy as np

def assign_clusters(X, centroids):
    # X: (n, d), centroids: (k, d)
    distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=2)  # (n, k)
    return np.argmin(distances, axis=1)  # label for each point

X = np.array([[1, 2], [3, 4], [5, 6], [8, 8]])
centroids = np.array([[2, 2], [7, 7]])
labels = assign_clusters(X, centroids)
print(labels)  # [0, 0, 0, 1]

The Update Step: Recomputing Centroids

After assignment, each centroid is relocated to the arithmetic mean of all points currently in its cluster. If a cluster becomes empty (no points assigned), the centroid is usually re-initialised randomly or removed. This mean-shift minimises the total within-cluster sum of squares (WCSS) — also called inertia.

import numpy as np

def update_centroids(X, labels, k):
    d = X.shape[1]
    new_centroids = np.zeros((k, d))
    for c in range(k):
        points = X[labels == c]
        if len(points) > 0:
            new_centroids[c] = points.mean(axis=0)
    return new_centroids

X = np.array([[1, 2], [3, 4], [5, 6], [8, 8]])
labels = np.array([0, 0, 0, 1])
print(update_centroids(X, labels, k=2))

Tracing Convergence by Hand

Consider four 1D points: 1, 2, 8, 9 and k=2. Init: centroids = [1, 8]. Iter 1 assignment: 1→C0, 2→C0, 8→C1, 9→C1. Iter 1 update: C0=1.5, C1=8.5. Iter 2 assignment: unchanged. Converged in 2 iterations! In higher dimensions convergence may take more steps, but the logic is identical.

Inertia: Measuring Cluster Compactness

Inertia (WCSS) is the sum of squared distances between each point and its cluster centroid. Lower inertia means tighter, more compact clusters. K-Means minimises inertia at each update step, but the algorithm is not guaranteed to find the global minimum — it can get stuck in local optima depending on initialisation.

from sklearn.cluster import KMeans
import numpy as np

X = np.array([[1, 2], [1, 4], [1, 0],
              [10, 2], [10, 4], [10, 0]])

km = KMeans(n_clusters=2, random_state=42)
km.fit(X)

print('Inertia:', km.inertia_)
print('Labels:', km.labels_)
print('Centroids:', km.cluster_centers_)

K-Means++ Initialisation

Random centroid initialisation often leads to slow convergence or poor local optima. K-Means++ (the scikit-learn default via init='k-means++') seeds centroids more intelligently: the first centroid is chosen randomly, and each subsequent centroid is selected with probability proportional to its squared distance from the nearest already-chosen centroid. This spreads starting points and consistently finds better solutions.

from sklearn.cluster import KMeans
import numpy as np

X = np.random.randn(300, 2)

# Default: k-means++ initialisation
km = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=0)
km.fit(X)
print('Inertia with k-means++:', round(km.inertia_, 2))

# Compare with random init
km_rand = KMeans(n_clusters=3, init='random', n_init=10, random_state=0)
km_rand.fit(X)
print('Inertia with random init:', round(km_rand.inertia_, 2))

Visualising Cluster Assignments

Plotting cluster assignments on a 2D scatter shows the Voronoi partition — the decision boundaries where each point's nearest centroid changes. Plotting centroids as large stars and colouring points by cluster label makes convergence intuitive. This visualisation also reveals when clusters overlap or have unequal sizes.

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.6, random_state=0)
km = KMeans(n_clusters=3, random_state=0)
labels = km.fit_predict(X)

plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='tab10', s=30)
plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1],
            c='black', s=200, marker='*', label='Centroids')
plt.legend()
plt.title('K-Means Clusters')
plt.show()

Multiple Restarts and n_init

Because K-Means can converge to local optima, scikit-learn runs the algorithm n_init times with different random seeds and keeps the result with the lowest inertia. The default is n_init=10. For small datasets 10 is usually sufficient; for large or tricky datasets you may raise it to 20 or 50. Always check the final inertia against the best-run inertia to diagnose poor convergence.

from sklearn.cluster import KMeans
import numpy as np

X = np.random.randn(500, 5)

km = KMeans(n_clusters=4, n_init=20, random_state=0)
km.fit(X)

print('Best inertia over 20 runs:', round(km.inertia_, 2))
print('Number of iterations until convergence:', km.n_iter_)

Limitations of K-Means

K-Means has several well-known weaknesses: 1) Assumes spherical clusters — it struggles with elongated or crescent shapes. 2) Sensitive to outliers — a distant outlier pulls the centroid away from the true cluster mean. 3) Requires k upfront — you must know or estimate the number of clusters before fitting. 4) Feature scale matters — always standardise features before running K-Means so large-scale variables do not dominate distances.

Running K-Means with scikit-learn

In practice, using sklearn.cluster.KMeans is the standard approach. Key parameters: n_clusters (k), init (default 'k-means++'), n_init, max_iter (default 300), and random_state. After fitting, km.labels_ contains cluster assignments, km.cluster_centers_ holds centroid positions, and km.inertia_ reports WCSS.

from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

X, _ = load_iris(return_X_y=True)

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

km = KMeans(n_clusters=3, random_state=42)
km.fit(X_scaled)

print('Cluster sizes:', {i: (km.labels_ == i).sum() for i in range(3)})
print('Inertia:', round(km.inertia_, 2))

Quick Check

Test your understanding of K-Means clustering concepts from this lesson.

Lesson Recap

In this lesson you learned: K-Means iterates assignment and update steps until cluster memberships stabilise, inertia (WCSS) measures compactness and is minimised by each update, and K-Means++ initialisation and multiple restarts help avoid poor local optima. Next up we explore how to choose the right value of k using the elbow method and silhouette score.

Можно начать бесплатно

Изучай Python с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «K-средних: центроиды, присваивание и обновление» бесплатный?

Да — полный текст урока «K-средних: центроиды, присваивание и обновление» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Machine Learning Academy, подпишись на CoddyKit PRO. Курс Machine Learning Academy содержит 4 уроков всего.

Чему я научусь в уроке «K-средних: центроиды, присваивание и обновление»?

Вы вручную проследите за тремя итерациями алгоритма K-средних, присвоите точки ближайшим центроидам, пересчитаете центроиды и увидите сходимость на двумерной диаграмме рассеяния. Ты практикуешь Machine Learning Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Machine Learning Academy?

Предыдущий опыт не требуется. Machine Learning Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «K-средних: центроиды, присваивание и обновление»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Machine Learning Academy?

Да. Каждый урок Machine Learning Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. K-средних: центроиды, присваивание и обновление
  2. Выбор K: метод локтя и показатель силуэта
  3. DBSCAN: внутренние, граничные и шумовые точки
  4. Кластеризация для сегментации клиентов: пример от начала до конца
← Назад к Machine Learning Academy