k中心点算法
思想:k-means是每次选簇的均值作为新的中心,迭代直到簇中对象分布不再变化。其缺点是对于离群点是敏感的,因为一个具有很大极端值的对象会扭曲数据分布。那么我们可以考虑新的簇中心不选择均值而是选择簇内的某个对象,只要使总的代价降低就可以。
PAM(partitioning around medoid,围绕中心点的划分)是具有代表性的k-medoids算法。
它最初随机选择k个对象作为中心点,该算法反复的用非代表对象(非中心点)代替代表对象,试图找出更好的中心点,以改进聚类的质量。
例子:
空间有5点{A,B,C,D,E}, 各点之间距离关系如表,根据pam算法进行聚类分析。
样本点 | A | B | C | D | E |
---|---|---|---|---|---|
A | 0 | 1 | 2 | 2 | 3 |
B | 1 | 0 | 2 | 4 | 3 |
C | 2 | 2 | 0 | 1 | 5 |
D | 2 | 4 | 1 | 0 | 3 |
A | 3 | 3 | 5 | 3 | 0 |
假设分为2类,以A,B为中心点,初始聚类为{A,C,D}和{B,E}。接下来进行交换(以非代表对象代替代表对象),我们需要计算TCAC、TCAD、TCAE、TCBC、TCBD、TCBE。
TCij表示用非中心点j替换中心点i所产生的代价。
计算TCAC:当A被C替换后,设一指针p遍历所有对象,判断他们是否聚到别的类里。
- 先看A是否变化:C成为中心点后,A离B比A离C近,故A被划分到B簇里。所产生的代价为d(A,B)-d(A,A)=1(d(i,j)表示i划分到中心点j的距离;差值表示属于新的中心点-属于旧的中心点产生的代价。)
- 看B是否变化:C成为中心点后,B当然离自己是最近的,不变
- 看C是否变化:C成为中心点后,C划分到C簇里,代价为d(C,C)-d(C,A)=-2
- 看D是否变化:C成为中心点后,D离C最近,故划分到C里,代价为d(D,C)-d(D,A)=-1;
- 看E是否变化:C成为中心点后,E离B最近,为0
TCAC就等于上述的代价之和,为1+0-2-1+0=-2。
同理需要计算TCAD=-2、TCAE=-1、TCBC=-2、TCBD=-2、TCBE=-2
然后选取代价最小的替换,这里有多个选择,随便选择一个就行。选C的话,新的簇为{C,D}和{A,B,E}。新的簇中心为C,B,继续迭代计算直到收敛。
为了判定一个非代表对象orandom是否是当前一个代表对象oi的好的替代,对于每一个非中心点p,需要考虑下面4中情况:
第一种情况:p当前隶属于代表对象oj(A类中心点),如果oj被orandom所代替作为代表对象,并且p离其他代表对象oi(B类的中心点)最近,则p重新分配给oi。(i!=j)
第二种情况:p当前隶属于代表对象oj(A类中心点),如果oj被orandom所代替作为代表对象,并且p离orandom(新的中心点)最近,则p重新分配给orandom。(i!=j)
第三种情况:p当前隶属于代表对象oi(B类中心点),如果oj被orandom所代替作为代表对象,并且p仍然离oi最近,则p不发生变化。(i!=j)
第四种情况:p当前隶属于代表对象oi(B类中心点),如果oj被orandom所代替作为代表对象,并且p离orandom最近,则p重新分配给orandom。(i!=j)