KMeans算法步骤:
1. 确定聚类个数k
2. 随机选择k个质心
3. 对于所有样本点:
根据样本点到质心的距离分类
4. 分类完成后,如果所有样本点的类别没有变化,算法结束
如果有变化,重新计算质心(当前类中样本的平均值),回到步骤3
几个问题:
1. 聚类个数k的确定
2. 初始时质心的选取
3. 容易出现局部最优解
考虑在多维空间中将数据点分组/聚类的问题。假设有一个数据集{x1,x2,……xn}包含N个观测到的D维变量x。我们的目标是将这些数据分割为K类,K是给定的数值。可以自然而然地想到,类内距离应该比类间聚类要小。选择一个D维向量mu:k(k=1,…..K)表示K类的中心。接下来我们要找一组mu:k,使得每个数据点到距离它最近的mu:k的距离平方和最小。定义一个目标函数,也可以成为畸变函数:
其中rnk
我们的目标是找到rnk和uk来最小化函数J。可以通过在每次迭代中分别关于rnk和uk最小化J。首先选择uk的初始值,然后保持uk不变,关于rnk最小化J。第二步,保持rnk不变。关于uk最小化J。重复这两步直到收敛。
当rnk固定的时候考虑关于uk的最小化。目标函数J是uk的一个二次函数,通过将uk的导数设为0来最小化。
很容易可以得到
分母等于聚类k中的点的个数,因此这个公式就很好理解:uk等于分配到聚类k中点的期望/均值。
两个步骤:重新分配数据点和重新计算聚类中心。已知重复,直到分配数据点不再变化或者达到最大循环次数。(或者前后两次J的值相差不超过一个常量)