人机交互及可视化技术——K-means

一、实验目的

本实验旨在通过自定义的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类对随机数据进行了聚类分析。同时,通过可视化的方式展示了聚类结果,有助于我们直观地理解算法的执行过程和聚类效果。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值