任务
- 数据:
m
个样本,
x(i) 是n维的向量,{ x(1),...,x(m) } - 目标聚类
算法
- 随机初始化
k
个聚类中心
μ1,..μk ,(对结果还是很有影响的,后面会采取一些措施弥补这种影响)。 -
- 对于每个样本,
do:
c(i):=argminj||x(i)−μj|| - 对于每个聚类中心,
do:
μj:=∑mi=11{c(i)==j}x(i)∑mi=11{c(i)==j} - 重复第二第三步,类别标签不再改变为止。
- 对于每个样本,
do:
解析
算法的主要就是在完成两个步骤,
第一,不断的计算样本与聚类中心的距离,为当前每个样本进行分类
第二,根据新的样本,更新聚类中心。
收敛性的判断,评价的方法可以样本点到自己聚类中心距离的和(可以说明一定会收敛,函数值通过交替更新,一定是不断减小的,类似于EM思想,但是不一定是全局最优)
J(c,μ)=∑i=1m||x(i)−μc(i)||
建议
- 实际运行过程中,运行多次,选取其中较好的一个,一般都会取得不错的效果(该算法的强大之处,很多时候是非常work的)。
- 在实际聚类过程中,聚类数目还是很难确定的,可以采取一些已有算法,分析得到其大致取值。
- 对于大样本,可能计算复杂度较高,需要做一些计算优化,但是基本思想很重要。
- 计算距离也有很多方法,实际工作时候,可能需要尝试不同的距离公式。
来源于CS229