K-means聚类算法是一种经典的聚类算法,广泛应用于数据挖掘、机器学习等领域。它通过将数据集划分为k个簇,使得每个簇内的数据点尽可能接近,而不同簇之间的数据点尽可能远。本文将详细介绍K-means聚类算法的原理、步骤以及如何使用可视化代码来理解和掌握这一聚类技巧。
K-means聚类算法原理
K-means聚类算法的基本思想是将数据集中的每个数据点分配到最近的簇中心,然后根据簇内的数据点重新计算簇中心。这个过程不断迭代,直到满足停止条件。
假设
- 数据集:D = {x1, x2, …, xn},其中xi表示数据集中的第i个数据点。
- 簇数:k。
步骤
- 初始化簇中心:随机选择k个数据点作为初始簇中心。
- 分配数据点:将每个数据点分配到最近的簇中心,形成k个簇。
- 更新簇中心:计算每个簇中所有数据点的均值,作为新的簇中心。
- 重复步骤2和3:重复分配数据点和更新簇中心的过程,直到满足停止条件。
停止条件
- 簇中心的变化小于某个阈值。
- 达到预设的迭代次数。
K-means聚类算法可视化代码
为了更好地理解K-means聚类算法,以下是一个使用Python语言和matplotlib库实现的可视化代码示例。
import numpy as np
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(0)
x = np.random.normal(1, 1, 100)
y = np.random.normal(1, 1, 100)
data = np.vstack((x, y)).T
# 初始化簇中心
k = 3
centroids = data[np.random.choice(data.shape[0], k, replace=False)]
# 计算距离
def distance(a, b):
return np.sqrt(np.sum((a - b) ** 2))
# 分配数据点
def assign_data(data, centroids):
labels = []
for point in data:
distances = [distance(point, centroid) for centroid in centroids]
labels.append(distances.index(min(distances)))
return labels
# 更新簇中心
def update_centroids(data, labels, centroids):
new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)])
return new_centroids
# 迭代
def k_means(data, centroids, max_iter=100):
labels = assign_data(data, centroids)
for _ in range(max_iter):
centroids = update_centroids(data, labels, centroids)
labels = assign_data(data, centroids)
return centroids, labels
# 可视化
def plot_clusters(data, centroids, labels):
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], s=300, c='red', marker='x')
plt.title('K-means Clustering')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
# 运行K-means算法
centroids, labels = k_means(data, centroids)
plot_clusters(data, centroids, labels)
总结
通过本文的介绍和可视化代码示例,相信你已经对K-means聚类算法有了更深入的理解。在实际应用中,K-means聚类算法可以帮助我们更好地分析数据,发现数据中的隐藏规律。希望这篇文章能帮助你轻松掌握K-means聚类技巧。
