关键词

k-means 聚类算法与Python实现代码

下面是详细讲解“k-means聚类算法与Python实现代码”的完整攻略。

k-means聚类算法

k-means聚类算法是一种常用的无监督学算法,用于将点分成k个簇。该算法的核心思想是最小化数据点与簇中心之间的距离来最佳簇中,从而将数据点分成k个簇。

下面是k-means聚类算法的Python实现代码:

import numpy np

def kmeans(X, k, max_iter=100):
    n, m = X.shape
    centers = X[np.random.choice(n, k, replace=False)]
    for i in range(max_iter):
 clusters = [[] for _ in range(k)]
        for x in X:
            distances = np.linalg.norm(x - centers, axis=1)
            cluster = np.argmin(distances)
            clusters[cluster].append(x)
        new_centers = np.array([np.mean(cluster, axis=0) for cluster in clusters])
        if np.allclose(centers, new_centers):
            break
        centers = new_centers
    return centers, clusters

上述代码中,首先导入了numpy库,用于进行数值计算。

然后,定义了一个kmeans函数,函数接受一个数据矩阵X、簇的数量k和最大迭代次数max_iter,返回簇中心和簇的列表。

接着,初始化变量n和m,分别表示数据矩阵X的行数和列数。

然后,随机选择k个数据点作为初始簇中心。

接着,使用循环迭代max_iter次,将数据点分配到最近的簇中心,并计算新的簇中心。

然后,如果新的簇中与旧的簇中心非常接近,则退出循环。

最后,返回簇中心和簇的列表。

示例

下面是一个使用k-means聚类算法将数据点分成两个簇的Python示例:

import matplotlib.pyplot as

X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
k = 2

centers, clusters = kmeans(X, k)

for i, cluster in enumerate(clusters):
    cluster = np.array(cluster)
    plt.scatter(cluster[:, 0], cluster[:, 1], label=f'Cluster {i+1}')
plt.scatter(centers[:, 0], centers[:, 1], marker='x', color='black', label='Centers')
plt.legend()
plt.show()

上述代码中,首先导入了matplotlib库,用于绘制图形。

然后,定义了一个数据矩阵X和簇的数量k。

接着,调用kmeans函数将数据点分成k个簇,并返回中心和簇的列表。

然后,使用for循环遍历簇的列表,使用scatter函数绘制每个簇的数据点。

接着,使用scatter函数绘制簇中心。

最后,使用legend函数显示图例,使用show函数显示图形。

下面是一个使用k-means聚类算法将数据点分成三个簇的Python例:

import matplotlib.pyplot as plt

X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
k = 3

centers, clusters = kmeans(X, k)

for i, cluster in enumerate(clusters):
    cluster = np.array(cluster)
    plt.scatter(cluster[:, 0], cluster[:, 1], label=f'Cluster {i+1}')
plt.scatter(centers[:, 0], centers[:, 1], marker='x', color='black', label='Centers')
plt.legend()
plt.show()

上述代码中,首先导入了matplotlib库,用于绘制图形。

然后,定义了一个数据矩阵X和簇的数量k。

接着,调用kmeans函数将数据点分成k个,并返回簇中心和簇的列表。

然后,使用for循环遍历簇的列表,使用scatter函数绘制每个簇的数据点。

接着,使用scatter函数绘制簇中心。

最后,使用legend函数显示图例,使用show函数显示图形。

总结

k-means聚类法是一种常用的无监督学习算法,用于将数据点分成k个簇。Python中可以使用numpy库中的linalg.norm函数计算数据点与簇中心之间的距离,使用numpy库中的mean函数计算新的簇中心。在实现过程中,需要随机选择k个数据点作为初始簇中心,使用for循环迭代max_iter,将数据点分配到最近的簇中心,并计算新的簇中心。最后,使用matplotlib库绘制数据点和簇中心的点图。

本文链接:http://task.lmcjl.com/news/15066.html

展开阅读全文