机器学习中的 K-均值聚类算法及其优缺点

K-均值聚类算法是一种常用的无监督学习方法,用于将数据集划分为K个簇(clusters)。其主要目标是使每个簇内部的样本尽量相似,而不同簇之间的样本尽量不同。

K-均值聚类算法的步骤:

  1. 初始化:随机选择K个数据点作为初始簇中心(centroids)。
  2. 分配簇:将每个数据点分配给离它最近的簇中心。
  3. 更新中心:重新计算每个簇的中心点,即簇内所有数据点的均值。
  4. 重复:重复步骤2和3,直到簇中心不再变化或变化很小,或达到最大迭代次数。

优点:

  1. 简单易懂:算法简单,易于实现和理解。
  2. 高效:在处理大型数据集时,K-均值算法的计算效率较高,尤其是使用欧几里得距离时。
  3. 可扩展性:适合处理大规模数据,且计算复杂度相对较低。

缺点:

  1. 选择K的困难:K的值需要提前指定,而如何选择合适的K值通常没有明确的标准。
  2. 对初始值敏感:不同的初始簇中心可能导致不同的聚类结果。使用K-means++方法可以改善这一点。
  3. 假设簇形状:K-均值假设簇是凸形的,且大小相近,对非凸形和大小差异较大的簇聚类效果差。
  4. 对噪声敏感:K-均值对异常值和噪声点敏感,这可能会影响最终的聚类结果。

适用场景:

K-均值聚类广泛应用于市场细分、社交网络分析、图像分割等领域,适合用于那些簇之间有明显界限的数据集。

通过合理选择K值和预处理数据,可以提升K-均值聚类的效果,使其更好地适应具体应用场景。

下面通过一个简单的例子,详细介绍 K-均值聚类算法,并提供相应的 Python 代码。

示例:K-均值聚类算法

假设我们有一个二维数据集,数据点分布在平面上,我们想将这些数据点分为三个簇。

1. 数据准备

我们将使用 numpymatplotlib 来生成和可视化数据。接着使用 sklearn 库实现 K-均值聚类。

2. 安装所需库

首先确保安装了所需的库。可以通过以下命令安装:

pip install numpy matplotlib scikit-learn

3. 代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 生成示例数据
np.random.seed(42)
# 创建三个簇的数据
data1 = np.random.randn(100, 2) + np.array([5, 5])
data2 = np.random.randn(100, 2) + np.array([0, 0])
data3 = np.random.randn(100, 2) + np.array([-5, 5])

# 合并数据
data = np.vstack([data1, data2, data3])

# 可视化数据点
plt.scatter(data[:, 0], data[:, 1], s=30)
plt.title("Generated Data Points")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()

# 使用 K-均值聚类
k = 3  # 设定簇的数量
kmeans = KMeans(n_clusters=k)
kmeans.fit(data)

# 获取聚类结果
centroids = kmeans.cluster_centers_  # 簇中心
labels = kmeans.labels_  # 每个数据点的簇标签

# 可视化聚类结果
plt.scatter(data[:, 0], data[:, 1], c=labels, s=30, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=100, marker='X')  # 绘制簇中心
plt.title("K-Means Clustering Result")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()
4. 代码解析
  1. 生成示例数据

    • 使用 numpy 生成三个簇的数据,每个簇的数据点在不同的中心附近分布。
  2. 可视化数据点

    • 使用 matplotlib 绘制生成的数据点,以便于观察数据的分布。
  3. K-均值聚类

    • 创建 KMeans 对象,并设置 n_clusters=3 来指定要划分的簇数量。
    • 使用 fit 方法进行聚类分析。
  4. 获取结果

    • cluster_centers_ 属性返回最终的簇中心。
    • labels_ 属性返回每个数据点对应的簇标签。
  5. 可视化聚类结果

    • 使用不同的颜色表示不同的簇,并用红色 "X" 标记簇中心。

结果

运行上述代码后,你将看到两个图:

  1. 第一个图展示了生成的随机数据点。
  2. 第二个图展示了 K-均值聚类的结果,其中不同颜色代表不同的簇,红色 "X" 表示簇的中心。

总结

K-均值聚类算法是一种直观且实用的聚类方法。通过选择合适的K值并使用适当的初始值,可以得到良好的聚类效果。上述示例展示了K-均值聚类的基本流程及其实现。

上一篇:scalatest scalamock 之 mock案例


下一篇:【MATLAB】TOA/TDOA测距定位,三维任意(>3)个锚节点,对一个未知点进行定位-引言