一、实验目的
本实验旨在通过自定义的K均值聚类算法对随机生成的二维数据进行聚类,并通过可视化方式展示聚类结果。
二、实验步骤与方法
1.导入必要的库:导入NumPy用于生成随机数据,以及Matplotlib用于绘制可视化图表。
2.定义KMeans类:实现了K均值聚类算法的类,包括初始化方法和拟合方法。
3.在拟合方法中,首先随机初始化聚类中心,然后迭代更新聚类中心和分配样本到最近的聚类中心,直至收敛或达到最大迭代次数。
4.在每次迭代过程中,绘制当前的聚类结果,包括原始数据点、各个簇的点和簇中心。
5.计算簇中心点的移动距离,若小于设定的阈值,则停止迭代。
6.生成随机数据:使用NumPy生成100个二维随机点,范围在0到10之间。
7.提示用户输入簇的个数。
8.使用自定义的K均值算法对随机数据进行聚类,并获取聚类结果。
三、实验结果与分析
在本次实验中,我设计了两种方法
第一个版本:
这种方法不会保存之前的聚类结果
所以我写了第二种
第二个版本(修正版):
import numpy as np
import matplotlib.pyplot as plt
class KMeans:
def __init__(self, n_clusters):
self.n_clusters = n_clusters
def fit(self, X):
centers = X[np.random.choice(len(X), self.n_clusters, replace=False)]
max_iterations = 100
tolerance = 1e-4
for iteration in range(max_iterations):
clusters = [[] for _ in range(self.n_clusters)]
old_centers = np.copy(centers)
for point in X:
distances = [np.linalg.norm(point - center) for center in centers]
cluster_index = np.argmin(distances)
clusters[cluster_index].append(point)
centers = [np.mean(cluster, axis=0) for cluster in clusters]
# 绘制当前的聚类结果
plt.figure()
plt.scatter(X[:, 0], X[:, 1], c='gray', label='Original Points')
for i, cluster in enumerate(clusters):
cluster_points = np.array(cluster)
plt.scatter(cluster_points[:, 0], cluster_points[:, 1], label=f'Cluster {i+1}')
plt.scatter(np.array(centers)[:, 0], np.array(centers)[:, 1], marker='x', s=200, c='black', label='Centers')
plt.title(f"Iteration {iteration + 1}")
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.pause(1)
# 计算中心点的移动距离,如果小于阈值,则停止迭代
movement = np.mean([np.linalg.norm(old_center - new_center) for old_center, new_center in zip(old_centers, centers)])
if movement < tolerance:
break
return clusters
# 生成随机数据
np.random.seed(0)
X = np.random.rand(100, 2) * 10 # 生成100个二维随机点,范围在0到10之间
# 提示用户输入簇的个数
num_clusters = int(input("请输入要求的簇的个数:"))
# 使用自定义的K-means算法进行聚类
kmeans = KMeans(num_clusters)
clusters = kmeans.fit(X)
通过运行以上代码,我们得到了以下实验结果:
·用户输入簇的个数确定了聚类的数量。
·经过迭代,聚类算法对随机生成的二维数据进行了聚类,并将每个点分配到了对应的簇中。
·每次迭代过程中,我们可以观察到簇中心的移动,直至达到收敛状态。
·最终的聚类结果通过Matplotlib进行了可视化展示,包括原始数据点、各个簇的点和簇中心。
四、结论与体会
K均值聚类是一种常用的无监督学习算法,可以有效地对数据进行聚类。通过本次实验,我们深入了解了K均值聚类的工作原理,并通过实现自定义的KMeans类对随机数据进行了聚类分析。同时,通过可视化的方式展示了聚类结果,有助于我们直观地理解算法的执行过程和聚类效果。