如何用Python编写K-均值聚类算法?
K-均值聚类算法是一种常用的数据挖掘和机器学习算法,能够将一组数据按照其属性进行分类和聚类。本文将介绍如何用Python编写K-均值聚类算法,并提供具体的代码示例。
在开始编写代码之前,我们需要了解K-均值聚类算法的基本原理。
K-均值聚类算法的基本步骤如下:
- 初始化k个质心。质心是指聚类的中心点,每个数据点都会被归到与其最近的质心所代表的类别。
- 根据每个数据点与质心的距离,将其分配到最近的质心所代表的类别。
- 更新质心的位置,将其设置为该类别中所有数据点的平均值。
- 重复步骤2和步骤3,直到质心的位置不再变化为止。
现在我们可以开始编写代码了。
导入必要的库
首先,我们需要导入必要的库,如numpy和matplotlib。
import numpy as np import matplotlib.pyplot as plt
数据准备
我们需要准备一组用于聚类的数据。这里我们使用numpy随机生成一组二维数据。
data = np.random.randn(100, 2)
初始化质心
我们需要为聚类算法初始化k个质心。这里我们使用numpy随机选择k个数据点作为初始质心。
k = 3 centroids = data[np.random.choice(range(len(data)), k, replace=False)]
计算距离
我们需要定义一个函数来计算数据点与质心的距离。这里我们使用欧几里得距离。
def compute_distances(data, centroids): return np.linalg.norm(data[:, np.newaxis] - centroids, axis=2)
分配数据点到最近的质心
我们需要定义一个函数来将每个数据点分配到最近的质心所代表的类别。
def assign_clusters(data, centroids): distances = compute_distances(data, centroids) return np.argmin(distances, axis=1)
更新质心的位置
我们需要定义一个函数来更新质心的位置,即将其设置为该类别中所有数据点的平均值。
def update_centroids(data, clusters, k): centroids = [] for i in range(k): centroids.append(np.mean(data[clusters == i], axis=0)) return np.array(centroids)
迭代聚类过程
最后,我们需要迭代聚类过程,直到质心的位置不再变化为止。
def kmeans(data, k, max_iter=100): centroids = data[np.random.choice(range(len(data)), k, replace=False)] for _ in range(max_iter): clusters = assign_clusters(data, centroids) new_centroids = update_centroids(data, clusters, k) if np.all(centroids == new_centroids): break centroids = new_centroids return clusters, centroids
运行聚类算法
现在我们可以运行聚类算法,得到每个数据点所属的类别和最终的质心。
clusters, centroids = kmeans(data, k)
可视化结果
最后,我们可以使用matplotlib将结果可视化。将每个数据点按照其所属的类别进行颜色标记,并将质心的位置用红色圆圈表示。
plt.scatter(data[:, 0], data[:, 1], c=clusters) plt.scatter(centroids[:, 0], centroids[:, 1], s=100, c='red', marker='o') plt.show()
通过以上的代码示例,我们可以用Python实现K-均值聚类算法。你可以根据自己的需求调整聚类的个数k,以及其他参数。希望本文对你理解和实现K-均值聚类算法有所帮助!