当谈到聚类算法时,K-means 算法是一个非常常见且有用的工具。它用于将数据集划分为不同的簇,每个簇包含数据点,这些数据点在特征空间上彼此相似。在这篇博客文章中,我们将深入了解 K-means 算法的工作原理,并提供 Python 代码实现。
什么是 K-means 算法?
K-means 算法是一种无监督学习算法,用于将数据集中的数据点划分为 K 个不同的簇,其中 K 是用户定义的超参数。这个算法的目标是使每个数据点都属于离它最近的簇的中心点,从而最小化数据点与簇中心点之间的距离。
K-means 算法的主要步骤如下:
-
初始化:随机选择 K 个数据点作为初始的簇中心点。
-
分配:对每个数据点,计算它与每个簇中心点的距离,并将它分配到距离最近的簇中心点所在的簇。
-
更新:对于每个簇,计算新的簇中心点,通常是该簇中所有数据点的平均值。
-
重复:重复步骤 2 和步骤 3,直到簇中心点不再改变,或者达到最大迭代次数。
-
结束:算法收敛,每个数据点都分配到了一个簇中,得到了 K 个簇。
Python 代码实现
下面是使用 Python 实现 K-means 算法的示例代码:
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(0)
X = np.random.rand(100, 2)
# 使用 K-means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
# 获取簇中心点和分配结果
centers = kmeans.cluster_centers_
labels = kmeans.labels_
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
这个示例使用 Scikit-Learn 库来执行 K-means 算法。首先,我们生成了一个随机的二维数据集 X
,然后使用 K-means 聚类算法将其分成 3 个簇。最后,我们可视化了结果,用不同的颜色表示不同的簇,用红色的 "x" 标记表示簇中心点。
我们也可以不使用其内置算法,根据前面说的步骤一步一步使用代码展现:
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(0)
X = np.random.rand(100, 2)
# 定义K值和迭代次数
K = 3
max_iterations = 100
# 随机初始化簇中心点
centers = X[np.random.choice(X.shape[0], K, replace=False)]
# 迭代更新簇中心点
for _ in range(max_iterations):
# 计算每个数据点到每个簇中心点的欧氏距离
distances = np.linalg.norm(X[:, np.newaxis, :] - centers, axis=2)
# 分配每个数据点到最近的簇
labels = np.argmin(distances, axis=1)
# 更新簇中心点为每个簇的平均值
new_centers = np.array([X[labels == k].mean(axis=0) for k in range(K)])
# 如果簇中心点不再改变,结束迭代
if np.all(centers == new_centers):
break
centers = new_centers
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()
这个示例实现了一个基本的K-means算法,包括随机初始化簇中心点、分配数据点到最近的簇、更新簇中心点等步骤。最后,我们通过可视化显示了结果,用不同的颜色表示不同的簇,用红色的 "x" 标记表示簇中心点。请注意,这只是一个简单的示例,K-means算法还有很多变种和改进方法,可以根据具体的需求和数据集选择合适的算法。
在后续我也会将我自己的一些创新点和相关代码分享给大家,包括一些XK-Means、LK-Means等创新算法,可用在不同场景,我使用其对YOLOv5所需锚框重新聚类,有效涨点!!!请大家持续关注!!
结论
K-means 算法是一种强大的聚类算法,用于将数据点划分为不同的簇。通过本文,你了解了它的基本工作原理,并通过 Python 代码实现了一个简单的示例。如果你对 K-means 算法感兴趣,可以进一步探索它的高级应用和调优技巧,以满足特定的数据分析需求。感谢阅读!
如果你有任何问题或需要进一步的解释,请随时提出。