机器学习——聚类算法-KMeans聚类
在机器学习中,聚类是一种无监督学习方法,用于将数据集中的样本划分为若干个簇,使得同一簇内的样本相似度高,不同簇之间的样本相似度低。KMeans聚类是一种常用的聚类算法之一,本文将介绍KMeans算法的原理、流程、聚类质量评价方法、优缺点以及KMeans++算法,并通过Python实现一个简单的KMeans聚类算法示例。
KMeans算法流程
KMeans算法的流程如下:
-
初始化质心: 从数据集中随机选择K个样本作为初始质心。
-
样本分配: 将每个样本分配到距离最近的质心所属的簇中。
-
更新质心: 计算每个簇的新质心,即该簇中所有样本的平均值。
-
重复步骤2和步骤3,直到满足停止条件为止: 常见的停止条件包括质心不再改变、达到最大迭代次数等。
聚类质量评价方法
常用的聚类质量评价方法包括簇内离差平方和(WCSS)、轮廓系数等。其中,簇内离差平方和(WCSS)用于评估簇内样本的紧密程度,其定义如下:
W C S S = ∑ i = 1 K ∑ x ∈ C i ∥ x − μ i ∥ 2 WCSS = \sum_{i=1}^{K} \sum_{x \in C_i} \|x - \mu_i\|^2 WCSS=i=1∑Kx∈Ci∑∥x−μi∥2
其中, K K K是簇的个数, C i C_i Ci 是第 i i i个簇, μ i \mu_i μi是第 i i i个簇的质心, ∥ x − μ i ∥ \|x - \mu_i\| ∥x−μi∥是样本 x x x到质心 μ i \mu_i μi的欧氏距离。
KMeans聚类的优缺点
优点:
- 简单易实现,计算复杂度低。
- 对大数据集有较好的伸缩性。
缺点:
- 需要事先指定簇的个数K。
- 对初始质心的选择敏感,可能会陷入局部最优解。
- 对噪声和异常值敏感。
KMeans++算法
KMeans++算法是KMeans算法的改进版,通过改进初始质心的选择,提高了算法的效率和稳定性。KMeans++算法的初始质心选择步骤如下:
- 随机选择一个样本作为第一个质心。
- 对于每个样本,计算其与已选择质心的最小距离(即最近质心)。
- 根据每个样本与最近质心的距离的平方,按照概率分布选择下一个质心。
- 重复步骤2和步骤3,直到选择足够数量的质心。
Python实现算法
以下是使用Python实现的简单KMeans聚类算法示例:
import numpy as np
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 生成样本数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)# 定义KMeans聚类算法
class KMeans:def __init__(self, n_clusters, max_iters=300):self.n_clusters = n_clustersself.max_iters = max_itersdef fit(self, X):n_samples, n_features = X.shapecentroids_indices = np.random.choice(n_samples, self.n_clusters, replace=False)centroids = X[centroids_indices]for _ in range(self.max_iters):distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))labels = np.argmin(distances, axis=0)new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(self.n_clusters)])if np.all(centroids == new_centroids):breakcentroids = new_centroidsself.labels_ = labelsself.cluster_centers_ = centroids# 使用KMeans算法聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)# 可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', color='red', s=200, label='Centroids')
plt.title('KMeans Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()
以上代码使用make_blobs
函数生成了一个样本数据集,并使用自定义的KMeans
类实现了KMeans聚类算法。最后,通过可视化展示了聚类的结果。
总结
KMeans聚类是一种常用的无监督学习算法,通过迭代计算样本的簇心和样本的簇分配,将样本划分为不同的簇。本文介绍了KMeans算法的原理、流程、聚类质量评价方法、优缺点以及KMeans++算法,并通过Python实现了一个简单的KMeans聚类算法示例。KMeans聚类算法可以应用于许多领域,如数据分析、模式识别和图像分割等。