K-Means 聚类算法是一种经典的机器学习算法,常用于数据聚类。本文将详细介绍 K-Means 算法的原理及其在 Python 中的实现方法。
基本原理
K-Means 算法的目标是将数据集分成 K 个簇,使得每个簇中的数据点尽可能靠近簇的中心点(质心),而不同簇之间的数据点尽可能远离。
Python 实现步骤
- 导入必要的库:
import numpy as np
import matplotlib.pyplot as plt
- 生成数据集:
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]])
- 初始化质心:
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)
- 计算每个数据点到质心的距离:
def calculate_distances(data, centroids):
distances = np.sqrt(((data - centroids[:, np.newaxis])**2).sum(axis=2))
return distances
distances = calculate_distances(data, centroids)
- 将数据点分配到最近的质心:
def assign_clusters(distances, k):
clusters = np.argmin(distances, axis=0)
return clusters
clusters = assign_clusters(distances, k)
- 更新质心:
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)
- 重复步骤 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 算法详解。