7.1 出料收率和生产路线
工业上,某些装置的出料收率波动比较大,其中的一些出料量还需要特别关注,这些需要关注的出料往往与生产路线对应,比如催化装置中,汽油的收率大时,认为是汽油路线,柴油的收率大时,认为是柴油路线…现在希望把历史收率数据分成指定数量的类别,让它们对应到相应的生产路线,后续在建模(质量守恒约束下的线性模型)时,选择相同生产路线下的数据作为输入数据,从而提高模型的准确性。
某种进料不同出料的收率数据用X表示:
其中n是出料数,m是序号。每一行是某一天生产数据的不同出料的收率,每一列是某种出料每天的收率。
我们希望对收率数据X分类,但历史数据并没有标记好的分类数据,只能用无监督聚类,生产路线数对应分类数,kmeans聚类就可以满足聚类需求。
把收率数据X聚成的k类,聚类过程如下:
1. 随机选择k个数据作为初始类心C。
其中Ct是C的第t类的类心,是X中的某个随机成员。
2. 计算每个数据到这k个类心的距离,到哪个类心距离最近,就把该数据划为第k类。
xci=t,t=pmin(dis(Xi,Ct))
其中xci是X的第i行Xi的类别标记,Ct是第t类的类心,dis()是距离计算方法。
同一生产路线的收率相差不大,如果把X中的每一行看成高维空间中的一个点,同一生产路线下的点应该聚集在一起,不同生产路线的点又相对远离,所以我们选择欧式距离作为距离度量方法。
3. 更新类心。
计算每个类别中各种出料收率的均值,把它作为新的类心CN。
CNt=avg(Xtj),j∈[1,2,…,n],t∈[1,2,…,k]
其中CNt是第t类的新类心,Xtj是属于第t类的X的第j种出料收率。
4. 重复第2、3步,直到类心不在移动或达到最大迭代次数N。
即类心的距离和小于一个很小的数ε:
sum(dis(CNt, COt))<ε|| iter==N,t∈[1,2,…,k]
其中COt是上次迭代类心的第t类的类心,ε是一个很小的数,iter是迭代的次数,dis()是距离计算方法。
迭代结束后,X中每个点到哪个类心Ct的距离最近就属于哪一类。
xci=t,t=pmin(dis(Xi,Ct))
SPL例程
A | B | C | D | |
1 | [[1,2,3,4],[2,3,1,2],[1,1,1,-1],[1,0,-2,-6]] | /X | ||
2 | =k=2 | /类别数 | ||
3 | =iter=300 | /迭代次数 | ||
4 | =center=null | /初始类心C | ||
5 | =it=0 | |||
6 | =func(A7,A1,A2,A3,A4) | |||
7 | func | |||
8 | if !D7 | =D7=A7.sort(rand()).to(k) | /随机类心 | |
9 | =it+=1 | |||
10 | return func(A7,A7,B7,C7,D7) | |||
11 | else | =A7.((d=~,D7.(dis(~,d)))) | ||
12 | =C11.(~.pmin()) | |||
13 | =A7.group(C12(#)) | |||
14 | =C13.((cent=mmean(~,1).~,if(ifa(cent),cent,[cent]))) | |||
15 | =C14.sum(dis(~,D7(#))) | /新旧类心距离和 | ||
16 | 1E-4 | /ε | ||
17 | if C15<C16||it==C7 | |||
18 | =C14 | |||
19 | =C12 | |||
20 | return [D18,D19] | |||
21 | else | =D7=C14 | ||
22 | =it+=1 | |||
23 | return func(A7,A7,B7,C7,D7) |
计算结果示例:
输入数据X:
聚类数k=2
最大迭代次数iter=300
聚类结果:
类心C:
成员所属类别Xc:
不难验证,X1,X2到C1的距离近,它们的均值就是C1,X3,X4到C2的距离近,它们的均值就是C2。