在2010年的一篇介绍K-means聚类分析的博文中,博主使用K-means聚类分析了“中国男足近几年在亚洲到底处于几流水平。 ”其收集了亚洲十六支队伍在2006年世界杯、2010年世界杯、2007年亚洲杯的参赛成绩(亚洲杯不含澳大利亚)。
基于战绩探讨国足在亚洲队伍中到底处于何种水平,实质上可以看作一个聚类问题,且易于被理解为一个“无监督”的聚类问题——这是出于足球缺乏绝对的定量判断标准的考虑而下的判断:由于比赛的变动无常性,难以定量地给出“一流球队”标签作为参照。但是通过无监督的分类,并不需要预先给出特定球队的水平,而可以依据相似性原则将数据集划分为N类,给出水平相近的球队的划分结果。
本文主要是以足球战绩为例,探讨自组织特征映射神经网络(Self-Organizing Feature Map, SOFM) 和K-means聚类方法之间的区别。重点在于原理讨论,结果仅供娱乐。
数据获取与处理
选取16支亚洲球队(包含澳大利亚),以一个五维向量 标表示各球队成绩,不同的维度表示不同的大赛,如下所列:2006年世界杯、2010年世界杯、2007年亚洲杯、2011年亚洲杯、2016年亚洲杯。对于比赛成绩的编码方法同上K-Means博文:
-
对于世界杯,进入决赛则取其最终排名;没有进入决赛的,打入预选赛十强赛赋40;预选赛小组未出线的赋50.
-
对于亚洲杯,前四名取其排名;八强赋5;十六强赋9;预选赛没出现的赋17.
可得16支球队的特征向量如表1所示。
自组织神经网络
自组织映射(Self-Organizing Map, SOM)可以通过学习输入空间中的数据,生成一个低维、离散的映射(Map),某种程度上,可看成一种降维算法。
自组织映射神经网络是一种无监督的人工神经网络(Artificial Neural Network,ANN),不同于一般神经网络基于损失函数的反向传递来训练,它运用竞争学习(Competitive Learning)策略,依靠神经元之间互相竞争逐步优化网络。同时,使用近邻关系函数(Neighborhood Function)来维持输入空间的拓扑结构。
假设网络输入层包含个神经元,核心层包含个神经元,输入向量为,则其权重为矩阵,网络输出为
在个输出神经元中,有一个神经元取最大值,成为获胜神经元。假设获胜神经元为,则相应的权值按下式进行调整:
即网络权值以为步长向输入的样本值靠近。在下一轮计算中, 以更大的概率胜出为获胜神经元,当取适当值时,网络权值经过逐步学习,最终等于输入样本向量,由此达到了学习向量的目的。从映射的角度来看,由于每个输入样本都对应一个特定的神经元,即可实现输入样本的分类。
MATLAB给出了简易搭建自组织特征映射网络的函数selforgmap,官方文档给出了易懂的关于自组织映射神经网络的介绍、范例说明。
实验
程序的实现主要分为输入样本、创建自组织映射网络并进行网络训练、聚类、有序输出等步骤。
收集的数据以矩阵形式定义,每个国家的成绩表示为矩阵中单行的五维向量。
%% 输入样本
N_team = 16;
team = {'中国','日本','韩国','伊朗','沙特','伊拉克','卡塔尔','阿联酋','乌兹别克','泰国','越南','阿曼','巴林','朝鲜','印尼','澳大利亚'};
data_init = [50,50,9,9,7; % 中国
28,9,4,1,5; % 日本
17,15,3,3,2; % 韩国
25,40,5,9,6; % 伊朗
28,40,2,9,10; % 沙特
50,50,1,5,4; % 伊拉克
50,40,9,5,13; % 卡塔尔
50,40,9,9,3; % 阿联酋
40,40,5,4,8; % 乌兹别克
50,50,9,17,17; % 泰国
50,50,5,17,17; % 越南
50,50,9,17,12; % 阿曼
40,40,9,9,11; % 巴林
40,32,17,9,13; % 朝鲜
50,50,9,17,17; % 印尼
16,21,5,2,1]'; % 澳大利亚
进行数据预处理,将数据按比赛(矩阵的列)归一化。
% 数据归一化
data = mapminmax(data_init);
用MATLAB神经网络工具箱创建自组织特征映射网络,并指定竞争层大小,进行网络训练。其中,值得注意的是:选择合宜的聚类参数。过分细致的类别分类是没有意义的,这将使每个队伍几乎独占一类;而粗略的二分也缺乏分类意义。
指定聚类的类别数为4,设置网络竞争层包含4个节点,为2×2结构。训练结束后,每个输入向量应属于一个竞争层节点。
%% 创建自组织映射网络
sofm_net = selforgmap([2,2]);
%% 网络训练
sofm_net = init(sofm_net);
sofm_net = train(sofm_net, data([1,2,3,4,5],:));
完成数据聚类后,同类数据被赋相同的标签。然而,这个标签事实上是随机的,并不具有有序的水平排名的意义。统计聚类类别的战绩以使其有序化,存储于元胞数组中制表输出。
% 统计每一个聚类类别的战绩,使得原本无序的标签有序化
score = zeros(1, 5);
for i = 1:5
temp = data(:, rslt == i);
score(i) = mean(temp(:));
end
[~, index] = sort(score);
rlst_temp = zeros(N_team, 1);
for i = 1:5
rlst_temp(rslt == index(i)) = i;
end
%% 制表输出
rlst_cell = cell(N_team, 2);
for i = 1:N_team
rlst_cell{i, 1} = team{i};
rlst_cell{i, 2} = rlst_temp(i);
end
cell2table(rlst_cell, 'VariableNames', {'team', 'level'})
运行脚本文件,有自组织网络结构的示意图如图所示。
聚类结果如下表所示。
分类结果与人们通常认为的球队实力排行,可以在很大程度上相互印证:
-
一流队伍中,日、澳、韩都是传统强队,在亚洲杯中都保持很好的成绩,战绩上明显领先其他队伍。
-
第二等的队伍中,伊朗、沙特、乌兹别克斯坦、巴林,要么在世界杯中能够取得名次,要么在亚洲杯中排名较前,都属于实力比较强的队伍。
而主流关注较少的朝鲜,尽管在亚洲杯中表现波动较大,亦获分类于第二等队伍,预想其在世界杯预选赛中的良好表现为之增色不少。
-
第三等的队伍表现平平,或成绩浮动较大(典型为伊拉克);
-
第四层次的球队则常被认为亚洲弱旅。
分类结果,与大众的智识理解、与使用K-means方法聚类的结果,都是相互印证的。分类结果的区别在于,自组织网络结构将球队分为4类,将张的“亚洲三流”球队进一步划分为“第三层次”与“第四层次”。
聚类方法讨论
值得讨论的是实验中对比参照的两种聚类手段(自组织特征映射网络SOM,K均值聚类K-means)之间的相似与区别:
-
可以看到,在此处的少量数据集合上,SOM和K-means都给出了基本一致的分类结果。(只不过SOM对三流队伍进行进一步的细分)或许可以给出一种数学原理上的对照理解,来说明这种分类是如何可能的:
-
对于SOM,相似的输入样本对应于同一个在竞争中获胜的神经元(即实现了分类),同时该神经元对应的权值依输入向量的方向进行调整,最终稳定为输入向量的平均值。权值向量可以类比K-means的聚类中心。在新的样本输入时,样本与权值矢量相乘的过程,即可类比K-means聚类中心距离的迭代计算过程。
对于K-means,值得注意的是,其聚类结果存在不稳定的可能性。这是因为其聚类算法对初始值、噪音、孤立数据点敏感,容易陷入局部最优,这是K-means算法在应用效果上受到的限制。
而SOM,可以将输入数据映射到低维空间上,无监督地降维找到数据的主要统计特征,能起到增强有用信息、降噪的作用。
-
然而,SOM网络模型并不能提供分类后精确的聚类信息。但K-means在给出聚类数目与中心点的情况下,可以提供较高的精确性。
具体场景下的聚类任务,应注意结合算法的优缺点进行应用。