13.10 试为图13.7算法第10行写出违约检测算法(用以检测是否有约束未被满足)
根据题意可知,我们的目的是检测将xi划入聚类簇Cr是否会违背M与C中的约束。
在这里不能只简单考虑该样本是否满足与某些约束条件内样本的“必连”和“勿连”条件,而是需要分析到底是待聚类样本违约还是其约束集合中的样本存在违约,同时需要考虑必连样本的传递性。
必连约束违约检测
对于必连样本,考虑如下图1的情况,左右两图中的r,rm代表样本xi和它的一个必连(相连)样本xm对应的两个聚类中心,虚线代表聚类簇边界(即聚类中心垂直平分线),圆的大小代表各点离相应聚类中心的距离,显然,此时有样本违反了必连约束。
首先考虑图(1)和图(3),此时∥xi−r∥>∥xm−rm∥,按照欧氏距离聚类,我们会觉得xi,xm分类都很正确,但由于两样本是必连的,所以肯定有一个的聚类结果是错误的。此时,我们可以将xi,xm同时分到r,rm簇中,然后比较孰优孰劣,那么距离更相近的样本,聚到一类可能性更高,假设各簇r,rm到图中自己的对应样本xi,xm的聚类概率均为100%,向外逐渐减小,则显然在圆圈外的样本离圆圈越近,其被聚到这一簇的可能性越高。由此原则可知,对于黑色的一对必连样本,
∥xi−rm∥−∥xm−rm∥>∥xm−r∥−∥xi−r∥,
此时
xm违反了相连约束,
xi并未违反必连约束,我们是要对
xi聚类,因此在这种情况下
xi并未违反必连约束;而当
xm与
r的距离比
xi还小时(甚至出现(3)这种情况),依然是
xm违反了相连约束。
而对于灰色的一对必连样本,我们按照∥xi−rm∥−∥xm−rm∥的大小同时扩展黑色的簇边界为灰色的簇边界,显然两条簇边界具有相同的聚类可能性,但由于xm落到了灰色大圆外,使得
∥xi−rm∥−∥xm−rm∥≤∥xm−r∥−∥xi−r∥,
此时
xi违反了相连约束。
对于图(2)和图(4),∥xi−r∥≤∥xm−rm∥,此时同理可得:当
∥xi−rm∥−∥xm−rm∥>∥xm−r∥−∥xi−r∥,
此时
xm违反了相连约束。
当
∥xi−rm∥−∥xm−rm∥≤∥xm−r∥−∥xi−r∥,
此时
xi违反了相连约束。

综上所述可知,对于必连样本,若存在xm满足
∥xi−rm∥+∥xi−r∥≤∥xm−rm∥+∥xm−r∥
那么xi违反必连约束。
勿连约束违约检测
对于勿连约束条件,我们可考虑如下所示的两种情况,即勿连样本的最近聚类簇中心一致,但我们需要分析是待聚类样本xi还是勿连样本xc违反了勿连约束。
对于左图,显然∥xi−r∥<∥xc−r∥,根据上述方法同样的原理可知,若xc的最佳聚类簇为r,则距离r更近的xi更应该属于簇r,因此出现矛盾,而若xi的最佳聚类簇为r,则距离r更远的xc不见得属于簇r,因此此时应当是xc违反勿连约束。
而对于右图,显然情况相反,∥xi−r∥>∥xc−r∥,与上段同理可知:此时应当是xi违反勿连约束。

综上可知,对于勿连样本,若存在xc满足
∥xi−r∥>∥xc−r∥
那么xi违反勿连约束。
违约检测算法
显然,对于(x1,x2),(x2,x3)∈M,满足相连的传递性,因此可先将满足相互连通关系的{xj}∪xi记为集合Xm,且满足X1+X2+…Xm=M.
同理,对于(x1,x2),(x2,x3)∈C,不满足传递性,因此可直接将含有xi的{xj}记为Xc,满足X1+X2+…Xc=C.
基于上述对必连约束和勿连约束的检测,可以得到如下的违约检测算法。
01: is_violate=False
02: 找到xi所属的连通关系集合Xm={xm}
03: ifX≠∅:
04: forxm∈Xm:
05: 基于K找到与xm距离最近的簇rm=argminj∈K∥xm−μj∥
06: ifrm≠rand∥xm−μrm∥+∥xm−μr∥≥∥xi−μrm∥+∥xi−μr∥:
07: is_violate=True
08: break
09: if ¬is_violate:
10: 找到xi所属的勿连关系集合Xc={xc}
11: ifX≠∅:
12: for xc∈Xc:
13: 基于K找到与xc距离最近的簇rc=argminj∈K∥xc−μj∥
14: if rm=rand∥xc−μr∥<∥xi−μr∥:
15: is_violate=True
16: break