7.4 层次 kmeans 聚类

 

有工业经验表明,重要度高的出料划分生产路线时所起的作用更大,为了体现这一作用,我们尝试了层次kmeans聚类,即按出料的重要度分层次进行kmeans聚类,过程如下:

1. 将所有出料数据X在初始化类心后用kmeans聚成2类,记录下类心。

2. 1类数据不再参与聚类,对第2类数据用同样的方法聚成2类,并记录类心。

3. 按第2步的方法循环下去,直到类别数达到k或者只剩一个成员不能再聚类。

4. 预测时,每个预测数据Yi先和第1层类心计算距离,属于第1类就记录下来,属于第2类再和下一层的类心计算距离,确定是属于这一层的类别还是继续和下一层类心计算距离,如此循环,直到确认了Yi的类别为止。

SPL例程


A

B

C


1

[[0.113,0.345,0.316],

[0.118,0.314,0.322],

[0.125,0.334,0.314],

[0.139,0.254,0.371],

[0.111,0.361,0.306],

[0.179,0.257,0.332]]

/X



2

[[0.116,0.371,0.307],

[0.143,0.324,0.303]]

/Y



3

=mk=3




4

=center_seq=[]




5

=xc=A1.(0)




6

=idx_seq=to(A1.len())




7

=col_seq=to(A1.~.len())




8

=mstd@s(A1,1).~




9

for

=A1(idx_seq)

/剩下的数据


10


=transpose(B9)(col_seq)



11


=A8(col_seq).psort@z()

/Sidx


12


=B10(B11)



13


=B12.(~.ranks())

/ RK的转置


14


=as=to(B13.len()),av_idx=to(B9.len()),B13.((oidx=as\#,pma=(~--msum(B13(oidx),1).~)(av_idx).pmax(),res=av_idx(pma),av_idx.delete(pma),res))

/Cb索引


15


=B9(B14.select(~))

/Cb’


16


=B15.to(2)

/初始化类心C


17


=k_means(B9,2,300,B16)



18


=B17(1)



19


=B17(2)



20


=B19.run(~=~+A9-1)



21


=B20.group@p(~)



22


=B21(1)



23


=B21(2)



24


=idx_seq(B22)



25


=idx_seq(B23)



26


=xc(B24)=B20(B22)



27


=idx_seq=B25



28


=col_seq(B11.~)



29


=col_seq=col_seq\B28



30


=center_seq.insert(0,[B18])



31


if idx_seq.len()==1||A9==mk-1

=xc(B25)=B20(B23)


32



break


33

=center_seq

/类心集合



34

=yc=[]




35

=A33.len()




36

for A2

for A33

=B36.pmin(dis(~,A36))


37



=#B36


38



=C36+C37-1


39



if C36==1||C37==A35

=A34.insert(0,C38)

40




next A36

41

return [center_seq,xc,yc]



计算结果示例:

收率数据X

..

聚类数k=3

预测数据Y

..

第一层聚类类心C1:

..

第二层聚类类心C2:

..

X各成员所属类别Xc

..

Y所属类别Yc

..

例程中的数据比较少,第2层聚类后,用来聚类的数据就只剩1个,无法继续分层了,所以即使把类别数k改成4甚至更大,聚类的结果还是只有3类。这是层次kmeans算法决定的,所以当需要聚成确定数量的离别时,还是要使用之前介绍的初始化类心的kmeans算法。