人工智能算法|K均值聚类算法Python实现
发布人:shili8
发布时间:2023-05-22 17:31
阅读次数:98
K均值聚类算法是一种常用的无监督学习算法,它可以将数据集分成K个簇,每个簇内的数据点相似度较高,而不同簇之间的数据点相似度较低。本文将介绍如何使用Python实现K均值聚类算法。
1. 导入必要的库
在开始实现K均值聚类算法之前,我们需要导入一些必要的库,包括numpy、matplotlib和sklearn。
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs
2. 生成数据集
为了演示K均值聚类算法的实现过程,我们需要生成一个数据集。这里我们使用sklearn库中的make_blobs函数生成一个包含100个数据点的二维数据集,其中数据点被分成3个簇。
X y = make_blobs(n_samples=100 centers=3 n_features=2 random_state=42)
3. 初始化聚类中心
在K均值聚类算法中,我们需要先随机初始化K个聚类中心。这里我们将K设为3,然后从数据集中随机选择3个数据点作为聚类中心。
K = 3 centers = X[np.random.choice(X.shape[0] K replace=False)]
4. 计算数据点到聚类中心的距离
接下来,我们需要计算每个数据点到K个聚类中心的距离。这里我们使用欧几里得距离来计算距离。
def euclidean_distance(x1 x2): return np.sqrt(np.sum((x1 - x2) ** 2)) distances = np.zeros((X.shape[0] K)) for i in range(K): for j in range(X.shape[0]): distances[j i] = euclidean_distance(X[j] centers[i])
5. 分配数据点到最近的聚类中心
根据计算出的距离,我们可以将每个数据点分配到距离它最近的聚类中心所在的簇中。
clusters = np.argmin(distances axis=1)
6. 更新聚类中心
接下来,我们需要更新每个簇的聚类中心。对于每个簇,我们将其所有数据点的坐标取平均值,然后将这个平均值作为新的聚类中心。
for i in range(K): centers[i] = np.mean(X[clusters == i] axis=0)
7. 重复步骤4-6,直到聚类中心不再变化
我们重复执行步骤4-6,直到聚类中心不再变化为止。这里我们设置一个最大迭代次数,以防止算法陷入死循环。
max_iterations = 100 for i in range(max_iterations): distances = np.zeros((X.shape[0] K)) for j in range(K): for k in range(X.shape[0]): distances[k j] = euclidean_distance(X[k] centers[j]) clusters = np.argmin(distances axis=1) new_centers = np.zeros((K X.shape[1])) for j in range(K): new_centers[j] = np.mean(X[clusters == j] axis=0) if np.all(centers == new_centers): break centers = new_centers
8. 可视化聚类结果
最后,我们可以使用matplotlib库将聚类结果可视化。不同颜色的数据点表示不同的簇。
plt.scatter(X[: 0] X[: 1] c=clusters) plt.scatter(centers[: 0] centers[: 1] marker='*' s=200 c='#050505') plt.show()
完整代码如下:
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs def euclidean_distance(x1 x2): return np.sqrt(np.sum((x1 - x2) ** 2)) X y = make_blobs(n_samples=100 centers=3 n_features=2 random_state=42) K = 3 centers = X[np.random.choice(X.shape[0] K replace=False)] max_iterations = 100 for i in range(max_iterations): distances = np.zeros((X.shape[0] K)) for j in range(K): for k in range(X.shape[0]): distances[k j] = euclidean_distance(X[k] centers[j]) clusters = np.argmin(distances axis=1) new_centers = np.zeros((K X.shape[1])) for j in range(K): new_centers[j] = np.mean(X[clusters == j] axis=0) if np.all(centers == new_centers): break centers = new_centers plt.scatter(X[: 0] X[: 1] c=clusters) plt.scatter(centers[: 0] centers[: 1] marker='*' s=200 c='#050505') plt.show()
运行结果如下图所示:
![K均值聚类算法Python实现结果](