当前位置:实例文章 » Python实例» [文章]人工智能算法|K均值聚类算法Python实现

人工智能算法|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实现结果](

相关标签:人工智能算法
其他信息

其他资源

Top