利用python实现聚类分析K-means算法的详细过程

  • Post category:Python

利用Python实现聚类分析K-means算法的详细过程

K-means算法是一种常用的聚类分析算法,它的主要思想是将数据集划分为K个簇,使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。本文将详细讲解如何使用Python实现K-means算法,并提供两个示例说明。

K-means算法原理

K-means算法的基本思想是将数据集划分为K个簇,使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。具体来说,算法的步骤如下:

  1. 随机初始化K个簇的中心点;
  2. 将每个数据点分配到距离其最近的簇中心点所在的簇;
  3. 计算每个簇的新中心点;
  4. 重复步骤2和步骤3,直到簇中心点不再发生变化或达到最大迭代次数。

其中,簇中心点是指簇内所有数据点的平均值。

Python实现K-means算法

在Python中,我们可以使用NumPy库和Matplotlib库来实现K-means算法。下面是一个简单的示例代码,用于对一个二维数据集进行聚类分析。

import numpy as np
import matplotlib.pyplot as plt

# 随机生成二维数据集
X = np.random.randn(100, 2)

# 定义K值和最大迭代次数
K = 3
max_iters = 100

# 随机初始化K个簇的中心点
centroids = X[np.random.choice(len(X), K, replace=False)]

# 运行K-means算法
for i in range(max_iters):
    # 将每个数据点分配到距离其最近的簇中心点所在的簇
    distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
    labels = np.argmin(distances, axis=0)

    # 计算每个簇的新中心点
    for j in range(K):
        centroids[j] = X[labels == j].mean(axis=0)

# 可视化聚类结果
colors = ['r', 'g', 'b']
for i in range(K):
    plt.scatter(X[labels == i, 0], X[labels == i, 1], c=colors[i])
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='k')
plt.show()

在这个示例中,我们首先随机生成一个二维数据集。然后,我们定义K值和最大迭代次数,并随机初始化K个簇的中心点。接下来,我们运行K-means算法,将每个数据点分配到距离其最近的簇中心点所在的簇,并计算每个簇的新中心点。最后,我们使用Matplotlib库可视化聚类结果。

示例1:使用K-means算法对Iris数据集进行聚类分析

在这个示例中,我们将使用K-means算法对Iris数据集进行聚类分析。Iris数据集是一个经典的分类问题数据集,包含150个样本,每个样本有4个特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度,共有3个类别。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

# 加载Iris数据集
iris = load_iris()
X = iris.data

# 定义K值和最大迭代次数
K = 3
max_iters = 100

# 随机初始化K个簇的中心点
centroids = X[np.random.choice(len(X), K, replace=False)]

# 运行K-means算法
for i in range(max_iters):
    # 将每个数据点分配到距离其最近的簇中心点所在的簇
    distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
    labels = np.argmin(distances, axis=0)

    # 计算每个簇的新中心点
    for j in range(K):
        centroids[j] = X[labels == j].mean(axis=0)

# 可视化聚类结果
colors = ['r', 'g', 'b']
for i in range(K):
    plt.scatter(X[labels == i, 0], X[labels == i, 1], c=colors[i])
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=200, linewidths=3, color='k')
plt.show()

在这个示例中,我们首先加载Iris数据集。然后,我们定义K值和最大迭代次数,并随机初始化K个簇的中心点。接下来,我们运行K-means算法,将每个数据点分配到距离其最近的簇中心点所在的簇,并计算每个簇的新中心点。最后,我们使用Matplotlib库可视化聚类结果。

示例2:使用K-means算法对手写数字数据集进行聚类分析

在这个示例中,我们将使用K-means算法对手写数字数据集进行聚类分析。手写数字数据集是一个经典的图像分类问题数据集,包含1797个样本,每个样本是一个8×8的灰度图像,表示一个手写数字。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits

# 加载手写数字数据集
digits = load_digits()
X = digits.data

# 定义K值和最大迭代次数
K = 10
max_iters = 100

# 随机初始化K个簇的中心点
centroids = X[np.random.choice(len(X), K, replace=False)]

# 运行K-means算法
for i in range(max_iters):
    # 将每个数据点分配到距离其最近的簇中心点所在的簇
    distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
    labels = np.argmin(distances, axis=0)

    # 计算每个簇的新中心点
    for j in range(K):
        centroids[j] = X[labels == j].mean(axis=0)

# 可视化聚类结果
fig, ax = plt.subplots(2, 5, figsize=(8, 3))
centers = centroids.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
    axi.set(xticks=[], yticks=[])
    axi.imshow(center, interpolation='nearest', cmap=plt.cm.binary)
plt.show()

在这个示例中,我们首先加载手写数字数据集。然后,我们定义K值和最大迭代次数,并随机初始化K个簇的中心点。接下来,我们运行K-means算法,将每个数据点分配到距离其最近的簇中心点所在的簇,并计算每个簇的新中心点。最后,我们使用Matplotlib库可视化聚类结果,将每个簇的中心点表示为一个8×8的灰度图像。

总结

本文详细讲解了如何使用Python实现K-means算法,并提供了两个示例说明。K-means算法是一种常用的聚类分析算法,它的主要思想是将数据集划分为K个簇,使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。在实际应用中,我们可以根据具体的需求选择不同的K值和距离度量方法,并结合其他聚类分析算法进行综合处理。