返回

k-means聚类算法及其在Python中的实现

人工智能

K-Means 聚类算法:一种强大而简单的聚类技术

在数据科学和机器学习领域,聚类 是一项关键任务,它涉及将数据点分组到具有相似特征的类别中。在这个过程中,K-Means 聚类算法 以其简单有效而闻名,成为一项颇受青睐的技术。

K-Means 聚类算法简介

K-Means 聚类算法 是一种无监督学习算法,它可以将数据点划分为 K 个簇,使得每个簇内的成员彼此相似,而不同簇之间的成员则彼此不同。算法的运作方式如下:

  1. 随机初始化: 首先,随机选择 K 个数据点作为簇中心。
  2. 分配数据点: 接下来,将每个数据点分配到离它最近的簇中心。
  3. 更新簇中心: 然后,计算每个簇的平均值,并将其作为该簇的新中心。
  4. 重复步骤: 重复步骤 2 和 3,直到簇中心不再变化或达到最大迭代次数。

K-Means 聚类算法步骤

为了更深入地了解 K-Means 聚类算法,让我们分解其步骤:

步骤 1:随机初始化

算法从随机选择 K 个数据点作为初始簇中心开始。这些中心决定了初始簇的位置。

步骤 2:分配数据点

在这个步骤中,算法将每个数据点分配到离它最近的簇中心。距离通常使用欧几里德距离来衡量。

步骤 3:更新簇中心

接下来,算法计算每个簇中所有数据点的平均值。这个平均值成为该簇的新中心,代表了簇的中心位置。

步骤 4:重复步骤

算法重复步骤 2 和 3,直到满足以下条件之一:

  • 簇中心不再变化,表明聚类已收敛。
  • 达到最大迭代次数,表明算法已达到其限制。

K-Means 聚类算法 Python 实现

以下 Python 代码提供了 K-Means 聚类算法的简单实现:

import numpy as np
import matplotlib.pyplot as plt

# 加载数据
data = np.loadtxt('data.csv', delimiter=',')

# 随机初始化 K 个簇中心
k = 3
centroids = data[np.random.choice(data.shape[0], k, replace=False)]

# 将每个数据点分配到离它最近的簇中心
clusters = np.zeros(data.shape[0], dtype=int)
for i in range(data.shape[0]):
    distances = np.linalg.norm(data[i] - centroids, axis=1)
    clusters[i] = np.argmin(distances)

# 计算每个簇的平均值,并将每个簇中心更新为该平均值
for i in range(k):
    centroids[i] = np.mean(data[clusters == i], axis=0)

# 重复步骤2和步骤3,直到簇中心不再变化或达到最大迭代次数为止
max_iter = 100
for _ in range(max_iter):
    # 将每个数据点分配到离它最近的簇中心
    for i in range(data.shape[0]):
        distances = np.linalg.norm(data[i] - centroids, axis=1)
        clusters[i] = np.argmin(distances)

    # 计算每个簇的平均值,并将每个簇中心更新为该平均值
    for i in range(k):
        centroids[i] = np.mean(data[clusters == i], axis=0)

# 绘制结果
plt.scatter(data[:, 0], data[:, 1], c=clusters)
plt.show()

结论

K-Means 聚类算法是一种强大的无监督学习算法,它用于将数据点分组到具有相似特征的类别中。该算法因其简单性、效率和对大数据集的适用性而受到赞赏。它在各个领域都有应用,包括机器学习、图像处理和数据挖掘。

常见问题解答

  1. K-Means 聚类算法的局限性是什么?

K-Means 聚类算法的一个限制是需要预先指定簇的数量 K。确定正确的 K 值可能具有挑战性,不同的 K 值可能会产生不同的聚类结果。

  1. 如何处理具有不同形状或密度的簇?

K-Means 聚类算法假设簇是球形的和大小相似的。对于具有不同形状或密度的簇,可能需要使用更复杂的聚类算法。

  1. K-Means 聚类算法是否对异常值敏感?

是的,K-Means 聚类算法对异常值敏感。异常值可能会导致簇中心偏离,从而影响聚类结果。

  1. 如何确定 K-Means 聚类算法何时收敛?

K-Means 聚类算法的收敛可以通过监控簇中心的移动来确定。当簇中心停止移动或移动到一个阈值以下时,算法被认为已收敛。

  1. K-Means 聚类算法的替代方法是什么?

K-Means 聚类算法的替代方法包括层次聚类、密度聚类和谱聚类。这些替代方法适用于具有不同形状或密度的簇,或者对异常值不那么敏感。