问题:
试设计一个能自动确定聚类数的改进k均值算法,编程实现并在西瓜数据集4.0上运行。
数据集:
西瓜数据集4.0
数据集描述:
该数据集共有30个样本,每个样本有密度和含糖度两个特征。
思路:
如何确定k的取值:
这里希望每一类别内部样本点距离较小而不同聚类之间的误差较大,所以用:
作为损失函数,其值越小越好,希望取得局部最优点,当值在k时增大,则k=k-1时最优
如何选择较好的k个均值:
随机选取的问题:
若是均值随机选,则很可能寻找到两个距离很近的均值点,在迭代过程中,这两个均值点会逐渐靠近最后重合,使得最后聚类数目减少。
算法思想:
首先随机选取L个均值点,接着根据这L个均值点对样本聚类,减去那些聚类内样本较小的点。接着在剩下的L1个店中随机选取一个均值点,并且寻找距离该点最远的均值点,依次迭代直至选取到K个均值点。
算法流程:
k_means算法:
- 初始化:首先选取k个均值点
- 将样本点划分到距离自己最近的均值点所在类别
- 根据聚类结果更新均值点
- 重复步骤2.3直至均值点不再改变
- 输出聚类结果
结果:
通过对损失函数计算,得到当k=3时,聚类结果最优,聚类结果以及图形化展示如下:
源码 :
损失函数计算:
clu_unique=np.unique(cluster)
D