机器学习——聚类算法-KMeans聚类

在机器学习中,聚类是一种无监督学习方法,用于将数据集中的样本划分为若干个簇,使得同一簇内的样本相似度高,不同簇之间的样本相似度低。KMeans聚类是一种常用的聚类算法之一,本文将介绍KMeans算法的原理、流程、聚类质量评价方法、优缺点以及KMeans++算法,并通过Python实现一个简单的KMeans聚类算法示例。

KMeans算法流程

KMeans算法的流程如下:

  1. 初始化质心: 从数据集中随机选择K个样本作为初始质心。

  2. 样本分配: 将每个样本分配到距离最近的质心所属的簇中。

  3. 更新质心: 计算每个簇的新质心,即该簇中所有样本的平均值。

  4. 重复步骤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=1KxCixμi2

其中, 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++算法的初始质心选择步骤如下:

  1. 随机选择一个样本作为第一个质心。
  2. 对于每个样本,计算其与已选择质心的最小距离(即最近质心)。
  3. 根据每个样本与最近质心的距离的平方,按照概率分布选择下一个质心。
  4. 重复步骤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_clusters
        self.max_iters = max_iters

    def fit(self, X):
        n_samples, n_features = X.shape
        centroids_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):
                break

            centroids = new_centroids

        self.labels_ = labels
        self.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()

机器学习——聚类算法-KMeans聚类-LMLPHP

以上代码使用make_blobs函数生成了一个样本数据集,并使用自定义的KMeans类实现了KMeans聚类算法。最后,通过可视化展示了聚类的结果。

总结

KMeans聚类是一种常用的无监督学习算法,通过迭代计算样本的簇心和样本的簇分配,将样本划分为不同的簇。本文介绍了KMeans算法的原理、流程、聚类质量评价方法、优缺点以及KMeans++算法,并通过Python实现了一个简单的KMeans聚类算法示例。KMeans聚类算法可以应用于许多领域,如数据分析、模式识别和图像分割等。

04-03 18:54