利用Python如何实现K-means聚类算法

  • Post category:Python

K-means聚类算法是一种常用的无监督学习算法,它可以将数据集划分为多个簇,每个簇内的数据点相似度较高,而不同簇之间的数据点相似度较低。在本攻略中,我们将介绍如何使用Python实现K-means聚类算法。

步骤1:导入库

在使用Python实现K-means聚类算法之前,我们需要导入相关的库。在本攻略中,我们将NumPy库和Matplotlib库来处理数据和可视化结果。

# 示例1:导入库
import numpy as np
import matplotlib.pyplot as plt

步骤2:生成数据集

在实现K-means聚类算法之前,我们需要生成一个数据集。本攻略中,我们将使用NumPy库中的random模块来生成一个包含100个数据点的二维数据集。

# 示例2:生成数据集
np.random.seed(0)
X = np.random.randn(100, 2)

步骤3:初始化聚类中心

在K-means聚类算法中,我们需要初始化聚类中心。在本攻略中,我们将随机选择两个数据点作为聚类中心。

# 示例3:初始化聚类中心
k = 2
centers = X[np.random.choice(len(X), k, replace=False)]

步骤4:计算距离并分配簇

在K-means聚类算法中,我们需要计算每个数据点与聚类中心的距离,并将其分配到最近的簇中。在本攻略中,我们将使用欧几里得距离来计算距离。

# 示例4:计算距离并分配簇
def assign_clusters(X, centers):
    distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
    return np.argmin(distances, axis=0)

clusters = assign_clusters(X, centers)

步骤5:更新聚类中心

在K-means聚类算法中,我们需要更新聚类中心,使其成为个簇内所有数据点的平均值。在本攻略中,我们将使用NumPy库中的mean()函数来计算平均值。

# 示例5:更新聚类中心
def update_centers(X, clusters):
    return np.array([X[clusters == k].mean(axis=0) for k in range(len(set(clusters)))])

centers = update_centers(X, clusters)

步骤6:迭代计算

在K-means聚类算法中,我们需要迭代计算,直到聚类中心不再变化为止。在本攻略中,我们将使用一个while循环来实现迭代计算。

# 示例6:迭代计算
while True:
    old_clusters = clusters
    clusters = assign_clusters(X, centers)
    if np.array_equal(clusters, old_clusters):
        break
    centers = update_centers(X, clusters)

步骤7:可视化结果

在K-means聚类算法中,我们可以使用Matplotlib库来可视化聚类结果。在本攻略中,我们将使用不同颜色的散点图来表示不同簇内的数据点。

# 示例7:可视化结果
plt.scatter(X[clusters == 0, 0], X[clusters == 0, 1], color='red')
plt.scatter(X[clusters == 1 0], X[clusters == 1, 1], color='blue')
plt.scatter(centers[:, 0], centers[:, 1], color='black', marker='x', s=100)
plt.show()

完整代码

# 示例8:完整代码
import numpy as np
import matplotlib.pyplot as plt

# 生成数据集
np.random.seed(0)
X = np.random.randn(100, 2)

# 初始化聚类中心
k = 2
centers = X[np.random.choice(len(X), k, replace=False)]

# 计算距离并分配簇
def assign_clusters(X, centers):
    distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
    return np.argmin(distances, axis=0)

clusters = assign_clusters(X, centers)

# 更新聚类中心
def update_centers(X, clusters):
    return np.array([X[clusters == k].mean(axis=0) for k in range(len(set(clusters)))])

centers = update_centers(X, clusters)

# 迭代计算
while True:
    old_clusters = clusters
    clusters = assign_clusters(X, centers)
    if np.array_equal(clusters, old_clusters):
        break
    centers = update_centers(X, clusters)

# 可视化结果
plt.scatter(X[clusters == 0, 0], X[clusters == 0, 1], color='red')
plt.scatter(X[clusters == 1, 0], X[clusters == 1, 1], color='blue')
plt.scatter(centers[:, 0], centers[:, ], color='black', marker='x', s=100)
plt.show()

示例说明

在示例代码中,我们首先生成了一个包含100个数据点的二维数据集。接着,我们随机选择了两个数据点作为聚类中心,并计算每个数据点与聚类中心的距离,并将其分配到最近的簇中。然后,我们更新了聚类中心,使其成为每个簇内所有数据点的平均值。接着,我们使用一个while循环来迭代计算,直到聚类中心不再变化为止。最后,我们使用Matplotlib库来可视化聚类结果,其中不同颜色的散点图表示不同簇内的数据点,黑色的叉号表示聚类中心。

在这个示例中,我们使用了NumPy库和Matplotlib库来处理数据和可视化结果。我们还使用了欧几里得距离来计算距离,并使用mean()函数来计算平均值。我们还使用了while循环来实现迭代计算,直到聚类中心不再变化为止。

示例6:使用sklearn库实现K-means聚类算法

除了手动实现K-means聚类算法,我们还可以使用sklearn库中的KMeans类来实现K-means聚类算法。下面是一个使用sklearn库实现K-means聚类算法的示例代码。

# 示例9:使用sklearn库实现K-means聚类算法
from sklearn.cluster import KMeans

k = 2
model = KMeans(n_clusters=k)
model.fit(X)

plt.scatter(X[model.labels_ == 0, 0], X[model.labels_ == 0, 1], color='red')
plt.scatter(X[model.labels_ == 1, 0], X[model.labels_ == 1, 1], color='blue')
plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1], color='black', marker='x', s=100)
plt.show()

在这个示例中,我们首先创建了一个KMeans对象,并使用fit()方法来训练模型。然后,我们使用labels_属性来获取每个数据点所属的簇,并使用cluster_centers_属性来获取聚类中心。最后,我们使用Matplotlib库来可视化聚类结果。