K-Means 聚类算法是一种经典的机器学习算法,常用于数据聚类。本文将详细介绍 K-Means 算法的原理及其在 Python 中的实现方法。

基本原理

K-Means 算法的目标是将数据集分成 K 个簇,使得每个簇中的数据点尽可能靠近簇的中心点(质心),而不同簇之间的数据点尽可能远离。

Python 实现步骤

  1. 导入必要的库:
import numpy as np
import matplotlib.pyplot as plt
  1. 生成数据集:
data = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0], [8.0, 2.0], [2.0, 1.0], [2.0, 2.0]])
  1. 初始化质心:
def initialize_centroids(data, k):
    indices = np.random.choice(data.shape[0], k, replace=False)
    centroids = data[indices]
    return centroids

k = 3
centroids = initialize_centroids(data, k)
  1. 计算每个数据点到质心的距离:
def calculate_distances(data, centroids):
    distances = np.sqrt(((data - centroids[:, np.newaxis])**2).sum(axis=2))
    return distances

distances = calculate_distances(data, centroids)
  1. 将数据点分配到最近的质心:
def assign_clusters(distances, k):
    clusters = np.argmin(distances, axis=0)
    return clusters

clusters = assign_clusters(distances, k)
  1. 更新质心:
def update_centroids(data, clusters, k):
    new_centroids = np.array([data[clusters == i].mean(axis=0) for i in range(k)])
    return new_centroids

new_centroids = update_centroids(data, clusters, k)
  1. 重复步骤 4 到 6,直到质心不再发生变化。

示例代码

以下是一个简单的 K-Means 算法实现的示例代码:

def k_means(data, k, max_iterations=100):
    centroids = initialize_centroids(data, k)
    for _ in range(max_iterations):
        distances = calculate_distances(data, centroids)
        clusters = assign_clusters(distances, k)
        new_centroids = update_centroids(data, clusters, k)
        if np.all(centroids == new_centroids):
            break
        centroids = new_centroids
    return clusters, centroids

clusters, centroids = k_means(data, k)

扩展阅读

更多关于 K-Means 算法的介绍,您可以参考 本站 K-Means 算法详解