一、 实验目的与要求
1.熟练掌握k-Means方法对手写数字图像进行分类;
2.用Matlab编写代码,熟悉其画图工具,进行实验,并验证结果;
3.锻炼数学描述能力,提高报告的叙述能力。
二、 问题
三、模型建立及求解
解决问题思路,模型建立、性能分析,存在问题等方面进行阐述;
本次实验实现过程的思维逻辑如图1所示。
1、K-Means算法概述
1.1K-means算法原理
①符号定义
为了方便描述算法,首先进行符号的定义,如表1所示。
②模型建立
K-means是一种无监督的学习,其主要思想为通过不断取离质心最近均值的数据,自动将相似的对象归到同一个簇中(共聚类k个簇),循环执行,直到满足聚类的收敛条件为止,常用于聚类分析。
样本点与聚类中心的距离大小以两个向量的欧式距离为衡量,定义函数f和J:
为第j类样本点到该类聚类中心的距离平方之和,则为每一类之和,K-means的优化目标为最小化数据点到其所属簇的质心的平方距离之和,即:
③模型求解
根据课程知识,引出定理1以及引理1如下:
定理1:是最优问题解的必要条件
引理1:可微函数是凸函数的充要条件
由于算法最终目的是求出与,使其满足J最小。由定理1和引理1,以及K-means优化目标函数为凸函数,要求解该模型,则对目标函数J求关于的偏导并令其等于0:
解得聚类中心计算公式:,即第j类样本点均值。在算法迭代过程中,聚类中心的值将按照该公式进行更新。
④算法流程
K-means算法算法流程图如图2所示。
初始化:在N个样本点中随机选取k个作为聚类中心。
标签更新:计算样本点到每个聚类中心的距离,找到距离最近的聚类中心,将该样本分配到最近的聚类中心所在的聚类中。即:
聚类中心更新:根据每个样本点标签,可以判断每个样本点属于哪一类,更新。计算第j类的样本均值并赋值给,即:
迭代结束条件判断:判断更新后的聚类中心与原来的相比是否有变化,若有变化且当前迭代的轮次还未达到设置的最大迭代次数t,则继续重复标签更新与聚类中心更新操作,否则结束算法。
⑤示例
需要注意的是,聚类中心不一定是某一个样本点,而是同一类样本点的均值。k-means算法依赖于初始随机生成的聚类中心,只可得到目标函数J的局部最优。解决方案为使用不同初始聚类中心,运行k-means算法若干次,取目标函数J值最小的一次作为最终聚类结果。
如图3所示为一次K-means算法示例,聚类数量为2,“×”代表聚类中心。可以看到样本点成功分成两类,类间距离足够大,类内距离足够小,聚类中心在每类样本中心处。
1.2时间复杂度
初始化阶段:随机选择k个样本点作为初始聚类中心,时间复杂度为O(k)。
标签更新阶段:计算样本点与聚类中心欧氏距离时间复杂度为O(2d)。而需要每个样本点到k个聚类中心距离,总时间复杂度为O(2d*k*N)。
聚类中心更新阶段:遍历每个样本点,判断其所属类别并更新下标集合G,时间复杂度为O(N);计算每类样本点均值时,加法进行了N-k次,除法进行了k次,时间复杂度为O(N)。总时间复杂度为O(2N)。
设迭代次数为t,此时总的时间复杂度为O(k+(2d*k*N+2N)*t) =O(d*k*N*t)。可以看到时间复杂度同时受样本维度和数量、迭代次数和聚类类别数量的影响。
1.3结果测试
导入train_images.mat的前100张28×28像素的手写数字图像,将图像拉成向量,进行聚类,共10类。运行K-means进行聚类100次,选出目标函数J最小的一次结果,该次结果迭代了10次,将已聚类的样本向量进行PCA降维,降至二维,进行可视化。结果如图3所示,每一种颜色代表一个类别。可以看到聚类效果并不好。
根据lables.mat文件统计每个聚类后每个类别中最多的标签数,以该标签作为该类类别,计算正确分到该类的样本数量之和,除以总样本数即正确率。
计算这100次聚类算法的正确率,统计结果如图4所示,可以观察到,这100次聚类的正确率波动较大,最高的为63.18%,最低的为56%,相差约7%。
逐渐增加样本数量至5000张图像,统计正确率如图5所示,可以看到随着样本数量的增加,K-means聚类算法的正确率呈波动下降。通过查阅资料,出现这种情况的原因可能是由于维度灾难,即随着样本数量的增加,数据空间的维度也会增加。在高维空间中,样本点之间的距离变得更加稀疏,导致距离度量变得不可靠。K-means算法使用欧氏距离作为样本点之间的距离度量,当维度较高时,欧氏距离的影响力减弱,导致聚类结果不准确。
随着样本数量的增加,统计不同样本数量对应下的运行时间如图6所示。可以看到随着样本数量的增加,耗费时间基本呈线性增长,而出现的小波动,分析其原因可能是迭代次数有所不同。
2、K-Means++
由测试结果可知,K-Means算法十分依赖于初始随机生成的聚类中心,只可得到目标函数J的局部最优。所以提出的优化算法K-Means++,旨在更好地选择初始质心,以提高聚类效果。相比于传统的K-Means算法在选择初始质心时通常是随机选择数据点作为质心,K-Means++算法通过以下步骤选择初始质心:
①从数据集中随机选择一个样本点作为第一个质心;
②对于每个样本点x,计算其与已选择的聚类中心之间的最短距离D(x)
③选择下一个质心,使其以概率Proportional to D(x)的方式从剩余的数据点中选择。即距离较远的数据点更有可能被选择为下一个质心;
④重复步骤2和步骤3,直到选择k个质心。
当初始化完成,使用传统的K-Means算法进行迭代的分配和更新步骤,直到收敛。
编写K-means++代码,在N=100时运行100次,于K-means正确率比较,如图7所示,