什么是KMeans算法?
KMeans算法是一种常用的聚类算法,它通过迭代的方式将数据点分配到K个簇中,使得每个簇内部的点尽可能接近,而不同簇之间的点尽可能远离。简单来说,KMeans算法就像是将数据点“捏成球”,每个球代表一个簇,球内的点属于同一个簇,而球与球之间的距离表示簇之间的差异。
KMeans算法的基本原理
- 初始化簇中心:随机选择K个数据点作为初始簇中心。
- 分配数据点:将每个数据点分配到最近的簇中心,形成K个簇。
- 更新簇中心:计算每个簇中所有数据点的平均值,作为新的簇中心。
- 迭代:重复步骤2和3,直到簇中心不再发生变化或达到预设的迭代次数。
Python实现KMeans算法
安装必要的库
首先,我们需要安装numpy和matplotlib库,这两个库可以帮助我们进行数值计算和可视化。
!pip install numpy matplotlib
创建数据集
为了演示KMeans算法,我们可以创建一个简单的二维数据集。
import numpy as np
# 创建数据集
data = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])
# 绘制数据点
import matplotlib.pyplot as plt
plt.scatter(data[:, 0], data[:, 1], c='blue', marker='o')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('数据集')
plt.show()
实现KMeans算法
接下来,我们将实现一个简单的KMeans算法。
def kmeans(data, k, max_iter=100):
# 初始化簇中心
centroids = data[np.random.choice(data.shape[0], k, replace=False)]
for _ in range(max_iter):
# 分配数据点
clusters = [[] for _ in range(k)]
for point in data:
distances = np.linalg.norm(point - centroids, axis=1)
closest_index = np.argmin(distances)
clusters[closest_index].append(point)
# 更新簇中心
new_centroids = []
for cluster in clusters:
new_centroid = np.mean(cluster, axis=0)
new_centroids.append(new_centroid)
new_centroids = np.array(new_centroids)
if np.all(centroids == new_centroids):
break
centroids = new_centroids
return centroids, clusters
# 运行KMeans算法
centroids, clusters = kmeans(data, k=2)
# 绘制结果
plt.scatter(data[:, 0], data[:, 1], c='blue', marker='o')
for i, cluster in enumerate(clusters):
plt.scatter(cluster[:, 0], cluster[:, 1], c='red', marker='x')
plt.scatter(centroids[:, 0], centroids[:, 1], c='green', marker='s')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('KMeans聚类结果')
plt.show()
结果分析
在上面的代码中,我们使用KMeans算法将数据集划分为两个簇。可以看到,红色的“x”标记表示每个簇中的数据点,绿色的“s”标记表示簇中心。
总结
通过本文的介绍,相信你已经对KMeans算法有了基本的了解。在实际应用中,KMeans算法可以用于各种聚类任务,例如市场细分、客户细分等。希望本文能够帮助你轻松上手KMeans算法,并学会使用Python进行聚类分析。
