### 机器学习实验五实验报告知识点总结 #### 一、实验背景与目标 本实验的主要目的是探索和理解K-means算法的基本原理及其在实际数据集上的应用情况。实验选取了西瓜数据集4.0作为研究对象,通过设置不同的参数(如不同的K值以及不同的初始中心点),对算法的效果进行评估和对比分析。主要关注点在于: - 不同的K值对聚类效果的影响; - 不同的初始中心点选择如何影响最终的聚类结果; - 分析哪些类型的初始中心点更有利于获得较好的聚类结果。 #### 二、K-means算法原理 K-means是一种无监督学习方法,用于将一组未标记的数据分为K个类别或簇。算法主要包括以下几个步骤: 1. **初始化**:随机选择K个数据点作为初始聚类中心。 2. **分配**:将每个数据点分配给最近的聚类中心,形成K个簇。 3. **更新**:重新计算每个簇的中心(即簇内所有点的均值)。 4. **迭代**:重复步骤2和3,直到聚类中心不再发生显著变化或达到最大迭代次数。 #### 三、代码解析 ##### 1. K-means 类定义 ```python class K_means: def __init__(self, k, data, loop_times, error): self.k = k self.data = data self.loop_times = loop_times self.error = error ``` - `__init__` 方法用于初始化K-means类的实例,包括设定聚类数量`k`、数据集`data`、最大迭代次数`loop_times`以及允许的最大误差`error`等参数。 ##### 2. 距离计算 ```python def distance(self, p1, p2): return np.linalg.norm(np.array(p1) - np.array(p2)) ``` - `distance` 方法用于计算两点之间的欧氏距离,使用了NumPy库中的`linalg.norm`函数来简化计算过程。 ##### 3. 拟合过程 ```python def fitting(self): # 初始化聚类中心 mean_vectors = random.sample(self.data, self.k) initial_main_vectors = mean_vectors # 绘制初始聚类中心 for vec in mean_vectors: plt.scatter(vec[0], vec[1], s=100, color='black', marker='s') # 迭代过程 times = 0 while times < self.loop_times: # 更新聚类中心 clusters = list(map(lambda x: [x], mean_vectors)) change_flag = 1 for sample in self.data: dist = [] for vec in mean_vectors: dist.append(self.distance(vec, sample)) clusters[dist.index(min(dist))].append(sample) new_mean_vectors = [] for c, v in zip(clusters, mean_vectors): cluster_num = len(c) new_mean_vector = sum(c) / cluster_num if all(np.true_divide((new_mean_vector - np.array(v)), np.array(v)) < np.array([self.error, self.error])): new_mean_vectors.append(np.array(v)) else: change_flag = 0 new_mean_vectors.append(new_mean_vector.tolist()) if change_flag == 1: mean_vectors = new_mean_vectors else: break times += 1 # 输出结果 time2 = time.perf_counter() print('本次选取的{}个初始向量为{}'.format(self.k, initial_main_vectors)) print('共进行{}轮'.format(times)) print('共耗时{:.2f}s'.format(time2 - time1)) ``` - `fitting` 方法实现了完整的K-means算法流程,包括初始化聚类中心、迭代更新聚类中心直至收敛或达到最大迭代次数,并输出最终结果。 #### 四、实验结果与讨论 1. **K值的影响**:通过设置不同的K值进行实验,可以观察到随着K值的增加,聚类的结果变得更加细分,但同时可能会出现过拟合的问题,导致某些簇包含的数据点较少甚至单个数据点的情况。 2. **初始中心点的选择**:实验结果显示,初始中心点的选择对于最终聚类结果有较大的影响。如果初始中心点选择得当,算法更容易收敛于全局最优解。反之,如果初始中心点选择不当,则可能陷入局部最优解。 3. **好的初始中心点**:一般而言,均匀分布在数据集各个区域的初始中心点更有利于获得较好的聚类结果。此外,可以通过预先对数据集进行一定的预处理(如标准化、降维等),来提高聚类的质量。 通过本实验的学习,我们可以更加深入地理解K-means算法的工作机制,并能够根据具体的应用场景选择合适的参数配置,从而优化聚类效果。
- 粉丝: 106
- 资源: 63
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
- 3
- 4
前往页