最优化方法实验二-- k-Means聚类实验

本文介绍了k-Means算法在手写数字图像分类中的应用,包括模型建立、求解过程和时间复杂度分析。同时提出了K-Means++优化算法以改进初始聚类中心的选择,通过实验展示了优化算法在正确率上的提升。随着样本数量增加,算法的性能受到维度灾难影响。
摘要由CSDN通过智能技术生成

 实验目的与要求

1.熟练掌握k-Means方法手写数字图像进行类;

2.用Matlab编写代码熟悉画图工具,进行实验并验证结果;

3.锻炼数学描述能力,提高报告叙述能力

 问题

三、模型建立及求解

解决问题思路,模型建立、性能分析,存在问题等方面进行阐述;

本次实验实现过程的思维逻辑如图1所示。

1、K-Means算法概述

1.1K-means算法原理

符号定义

为了方便描述算法,首先进行符号的定义,如表1所示。

模型建立

        K-means是一种无监督的学习,其主要思想为通过不断取离质心最近均值的数据,自动将相似的对象归到同一个簇中(共聚类k个簇),循环执行,直到满足聚类的收敛条件为止用于聚类分析。

        样本点与聚类中心的距离大小以两个向量的欧式距离为衡量,定义函数f和J:

f_{j}(z_{j})=\sum_{i\in G_{j}}^{}\left \| x_{i} -z_{i}\right \|_{2}^{2}, J(G_{1},...,G_{k},z_{1},...,z_{k})=\sum_{j=1}^{k}f_{j}(z_{j})

f_{j}(z_{j})为第j类样本点到该类聚类中心的距离平方之和,J(G_{1},...,G_{k},z_{1},...,z_{k})则为每一类f_{j}(z_{j})之和,K-means的优化目标为最小化数据点到其所属簇的质心的平方距离之和,即:

\min_{G_{1},...,G_{k}}\min_{z_{1},...,z_{k}}J(G_{1},...,G_{k},z_{1},...,z_{k})

模型求解

根据课程知识,引出定理1以及引理1如下:

定理1:\triangledown f(\hat{x})=0是最优问题解的必要条件

引理1:可微函数是凸函数的充要条件

由于算法最终目的是求出G_{1},...,G_{k}z_{1},...,z_{k},使其满足J最小。由定理1和引理1,以及K-means优化目标函数为凸函数,要求解该模型,则对目标函数J求关于z_{j}偏导并令其等于0:

解得聚类中心计算公式:z_{j}=\frac{1}{\left | G_{j} \right |}\sum_{i\in G_{j}}^{}x_{i},即第j类样本点均值。在算法迭代过程中,聚类中心的值将按照该公式进行更新。

算法流程

K-means算法算法流程图如图2所示。

初始化:在N个样本点中随机选取k个作为聚类中心。

标签更新:计算样本点个聚类中心的距离,找到距离最近的聚类中心,该样本分配到最近的聚类中心所在的聚类中。即c_{i}=\min_{j=1,2,...,k}\left \| x_{i}-z_{j} \right \|_{2}^{2},i=1,2,...,N

聚类中心更新:根据每个样本点标签,可以判断每个样本点属于哪一类,更新G_{j}=\left \{ i|c_{i}=j \right \}。计算第j类的样本均值并赋值给z_{j},即:z_{j}=\frac{1}{\left | G_{j} \right |}\sum_{i\in G_{j}}^{}x_{i}

迭代结束条件判断:判断更新后的聚类中心与原来的相比是否有变化,若有变化且当前迭代的轮次还未达到设置的最大迭代次数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所示,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值