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(X, centers):
distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
return np.argmin(distances, axis=0)
clusters = assign(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(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(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(X, centers):
distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))
return np.argmin(distances, axis=0)
clusters = assign(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(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[:, 1], color='black', marker='x', s=100)
plt.show()
示例说明
在示例代码,我们首先生成了一个包含100个数据点的二维数据集。接着,我们随选择了两个数据点作为聚类中心,并计算每个数据点与聚类中心的距离,并将其分配到最近的簇中。然后,我们更新聚类中心,使其成为每个簇内所有数据点的平均值。接着,我们使用一个while循环来迭代计算,直聚类中心不再变化为止。最后,我们使用Matplotlib库来可视化聚类结果,其中不同颜色的散点图表示不同簇内的数据点,黑色的叉号表示聚类中心。
在这个示例中,我们使用了NumPy库和Matplotlib库来处理数据和可视化结果。我们还了欧几里得距离来计算距离,并使用mean()函数来计算平均值。我们还使用了while循环来实现迭代计,直到聚类中心不再变化为止。
示例:使用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库来可视化聚类结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用Python如何实现K-means聚类算法 - Python技术站