只能人工已经给定有多少个类(选定K个类),第一步任意选择K个中心点,然后计算每个点属于哪一个类,第二步将每一个点分配到每一个类之后,第三步更新每一个类中心点的位置(把每个类的求一个平均值,作为这一个类的中心点)。在数学上,有N个点,每个点都是低维度的,选定了K个中心,这些类的中心点由来表示,属于一维的,用rnk表达每一个数据点属于哪一个,第n个点属于第k类,那么rnk就等于1,其余的rn0,rn1,,,全都为0,实际上和rnk我们都是不知道的,需要求它们。K-Means实际上就是在优化这个损失函数J。
怎么去解这个损失函数呢?(实际上就是怎么去最小化这个损失函数),分两步,一个是E-step(expectation),就是固定,去解rnk,另一个是M-step(maximization),就是固定rnk,去解。第一步,E-step,固定,去每个点都是独立的,可以先考虑一个点,要使得J最小,就可以找最近的一个点k,使得rnk为1,其它为0,就可以得到最小的J。
第二步,M-step,固定rnk,J是 的二次函数,只需要对求导且令其为0,就可以解出。
的这个等式,实际上就是(一个类的中心点)属于这个类的数据点的平均值。图片解释如下
K-means初始化不应该随意选点,应该选数据点里面的一个点; K-means初始化的点会影响结果,通常会选择多跑几遍K-means,最后选J最小的那个。在E-step的时候,我们求n个点到k个中心点的邻居(第二节课讲的可以用kdtree\Octree去加速),还有一种变种的K-means叫做Mini-batch,也就是在每一次迭代里面,都选择不同的cirsimple,减少迭代时间,但可能会产生更坏的结果。
如果min-batch等于1,也就是每次只选一个数据点,实际上就变成Sequential Update算法,以前是每次迭代都考滤全部点,这时候只考虑一个点xn,对于xn我们先找到他属于哪一个类,也就是求出,然后用这个公式更新,是根据经验选择的,其他都不考虑,只考虑最近的。如果是很多个数据点,那就是Min-batch K-means(速度更快)。
K-means加强版或者改进版的方法,K-Medoids(K中心点),K-Medoids不易被噪声干扰,E-step与K-means一样,但M-step时,K中心点不是选择平均值,它会历遍所有点,选择的中心点是离其他所有点的距离之和最小的(所选的中心点一定是某一个数据点)。数学上写成了以下形式,这个V函数可以是离散的、不可导的、无法求解的。
K-means应用,一个做压缩的例子。
问题:K是未知的;易受噪声影响;一个点必须属于一个类,给出的是确定的,不是概率