【MATLAB数据处理实用案例详解(18)】——利用自组织特征映射网络实现亚洲足球水平聚类

一、问题描述

中国男子足球队的比赛成绩一直牵动着广大球迷的心。很多人认定中国队已处于亚洲三流甚至末流水平;在亚洲地区的比赛中,中国队曾经有过不错的表现,但近年来接连遭遇惨败。
在这样的背景下,有必要科学地统计亚洲各队的比赛数据,有说服力地给出各个国家男子足球的水平和实力。
使用无监督学习的聚类方式。聚类不需要预先知道部分球队的水平和实力,只需要给定分类的类别数量,算法就会将所有样本按照相似性的原则划分成类
要获得较准确的聚类结果,关键在于选择恰当的样本特征。它回答了究竟选取什么样的指标才能正确反映球队的实力和水平的问题。要比较各国足球的发展水平,自然不能选择该国国内联赛的成绩,而应该将国际正式比赛中各球队的表现纳入考虑范围。
(1)对于世界杯,如果打入决赛圈,则取其最终排名(1~32);没有进入决赛圈的,如果打入预选赛十强则编码为33,如果预选赛小组未出线则编码为43。
(2)对于亚洲杯,如果取得四强,则取其最终排名(1-4);如果进入八强,则编码为5,如果进入16强则编码为9,如果预选赛未出线,则编码为17。
各球队成绩一览表如下:
在这里插入图片描述

二、自组织特征映射网络实现亚洲足球水平聚类原理

算法流程图如下:
在这里插入图片描述

三、算法步骤

3.1 定义样本

聚类共涉及16个国家,每个国家的球队成绩用一个四维向量表示:

%% 定义输入样本
N = 16;
strr = {
    
    '中国','日本','韩国','伊朗','沙特','伊拉克','卡塔尔','阿联酋','乌兹别克','泰国',...
    '越南','阿曼','巴林','朝鲜','印尼','澳大利亚'};
data = [43,43,9,9;        % 中国
    28,9,4,1;               % 日本
    17,15,3,3;              % 韩国
    25,33,5,5;              % 伊朗
    28,33,2,9;              % 沙特
    43,43,1,5;              % 伊拉克
    43,33,9,5;              % 卡塔尔
    43,33,9,9;              % 阿联酋 
    33,33,5,4;              % 乌兹别克 
    43,43,9,17;             % 泰国 
    43,43,5,17;             % 越南
    43,43,9,17;             % 阿曼
    33,33,9,9;              % 巴林
    33,32,17,9;             % 朝鲜
    43,43,9,17;             % 印尼
    16,21,5,2]';            % 澳大利亚

3.2 创建网络

使用MATLAB神经网络工具箱中的selforgmap函数进行创建:

% 2*2 自组织映射网络
net = selforgmap([2,2]);

3.3 网络训练

使用train函数对输入样本进行训练:

data = mapminmax(data);
net = init(net);
net = train(net, data([1,2,3,4],:));

3.4 测试

自组织网络的测试与有监督学习中的测试不同,在这里,训练数据与测试数据是一样的。将用于训练的矩阵输入到网络中,可以得出每一个样本的分类标签:

%% 测试
y = net(data([1,2,3,4],:));

% 将向量表示的类别转为标量
result = vec2ind(y);

3.5 显示聚类结果

聚类完成时,分为一类的样本被赋予相同的分类标签,但不同类别使用什么数字作为分类标签则是随机的。为了得到正确的显示结果,统计每一个聚类类别的特征向量数值之和,由于数值越低表示水平越高,因此根据统计结果就可以判断同类别孰优孰劣了:

%% 输出结果
% 将分类标签按实力排序
score = zeros(1,M);
for i=1:M
    t = data(:, result==i);
    score(i) = mean(t(:));
end
[~,ind] = sort(score);

result_ = zeros(1,N);
for i=1:M
    result_(result == ind(i)) = i; 
end

fprintf('  足球队            实力水平\n');
for i = 1:N
    fprintf('   %-8s      第 %d 流\n', strr{
    
    i}, result_(i)) ;
end

四、运行结果

程序运行结果如下:
神经网络训练过程:
在这里插入图片描述
分类类别:
在这里插入图片描述

五、完整代码

完整代码如下:

% football.m
% 亚洲足球水平聚类
%% 清空工作空间
clear,clc
close all;

rng(now)
M=4;
%% 定义输入样本
N = 16;
strr = {
    
    '中国','日本','韩国','伊朗','沙特','伊拉克','卡塔尔','阿联酋','乌兹别克','泰国',...
    '越南','阿曼','巴林','朝鲜','印尼','澳大利亚'};
data = [43,43,9,9;        % 中国
    28,9,4,1;               % 日本
    17,15,3,3;              % 韩国
    25,33,5,5;              % 伊朗
    28,33,2,9;              % 沙特
    43,43,1,5;              % 伊拉克
    43,33,9,5;              % 卡塔尔
    43,33,9,9;              % 阿联酋 
    33,33,5,4;              % 乌兹别克 
    43,43,9,17;             % 泰国 
    43,43,5,17;             % 越南
    43,43,9,17;             % 阿曼
    33,33,9,9;              % 巴林
    33,32,17,9;             % 朝鲜
    43,43,9,17;             % 印尼
    16,21,5,2]';            % 澳大利亚

%% 创建网络
% 2*2 自组织映射网络
net = selforgmap([2,2]);

%% 网络训练
data = mapminmax(data);
tic
net = init(net);
net = train(net, data([1,2,3,4],:));
toc

%% 测试
y = net(data([1,2,3,4],:));

% 将向量表示的类别转为标量
result = vec2ind(y);

%% 输出结果
% 将分类标签按实力排序
score = zeros(1,M);
for i=1:M
    t = data(:, result==i);
    score(i) = mean(t(:));
end
[~,ind] = sort(score);

result_ = zeros(1,N);
for i=1:M
    result_(result == ind(i)) = i; 
end

fprintf('  足球队            实力水平\n');
for i = 1:N
    fprintf('   %-8s      第 %d 流\n', strr{
    
    i}, result_(i)) ;
end

猜你喜欢

转载自blog.csdn.net/didi_ya/article/details/130422238