Kmeans聚类算法评估足球比赛

栏目: 编程工具 · 发布时间: 6年前

内容简介:K-means 算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means 算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标最小。算法采用误差平方和准则函数作为聚类准则函数。本节课首先讲解Kmeans 算法思想,然后再用Kmeans 分析足球赛事。该项目难度一般,属于中等偏

一、实验介绍

1.1 内容介绍

K-means 算法采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means 算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标最小。算法采用误差平方和准则函数作为聚类准则函数。本节课首先讲解Kmeans 算法思想,然后再用Kmeans 分析足球赛事。

1.2 实验知识点

  • Scala 基础编程
  • Spark Mlib 的 Kmeans 算法应用

1.3 实验环境

  • Ubuntu14.04
  • Spark2.1.1
  • Xfce终端

1.4 适合人群

该项目难度一般,属于中等偏下难度,该项目适合有一定的 Spark 基础,对 MLib 有一定的了解,并热爱机器学习。

二、K-means 算法

2.1 问题引入

K-Means 算法主要解决的问题如下图所示。图中有一些散乱的点,用肉眼隐约可以看到大致有三个点集。但是我们怎么通过计算机程序找出这几个点群来呢?于是就出现了我们的 K-Means 算法(Wikipedia链接)。

Kmeans聚类算法评估足球比赛

我们希望根据这些不同的点的分布,分为几个簇,把这些点就近划分到不同的簇,这些簇就是接下来我们说的 K 值,下图是我用圆圈标上了这些点可能属于的簇集,更醒目一些,当然这里K值取值不是唯一的如图:

Kmeans聚类算法评估足球比赛

2.2 算法思想

通过不断的迭代来寻找 k 值,形成一种划分方式,使得用这k个类簇的均值来代表相应各类样本时所得的总体误差最小。同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。k-means 算法的基础是最小误差平方和准则,

其函数是:

Kmeans聚类算法评估足球比赛

上式中中,μc(i) 表示第i个聚类的均值。划分到各类簇内的样本越相似,其与该类均值间的误差平方越小,然后对所有类计算所得到的误差平方再次累加求和,即我们希望 J 值越小越好。

2.3 算法实现步骤

k-means 算法是将样本聚类成 k 个簇中心,这里的 k 值是我们给定的,也就是我们希望把数据分成几个类别,具体算法描述如下:

1) 为需要聚类的数据,随机选取 k 个聚类质心点

2) 求每个点到聚类质心点的距离,计算其应该属于的类,迭代直到收敛于某个值 {

对于每一个样例 i,:

Kmeans聚类算法评估足球比赛

对于每一个类 j,重新计算该类的质心,从而确定新的簇心,一直迭代到某个值或达到要求:

Kmeans聚类算法评估足球比赛

三、项目实现

接下来,我们进入实现阶段,进行实际操作给大家讲解相应的知识。

3.1 进入开发环境

进入到实验环境,双击桌面上的 Xfce,效果如下图

Kmeans聚类算法评估足球比赛

3.2 数据集介绍

实验中数据参考根据张洋的算法杂货铺,并做适当的修改。

序号    国别  2006年世界杯    2007年亚洲杯    2010年世界杯

1       韩国       17           3               15
2       沙特       28           2               40
3       卡塔尔     50           9               40
4       泰国       50           9               50 
5       越南       50           5               50
6       中国       50           9               50
7       巴林       40           9               40 
8       阿联酋     50           9               40 
9       伊朗       25           5               40 
10      日本       28           4               9

根据图片可以得知这 15 支球队在 2006 年~ 2010 年的比赛情况,其中包括两次世界杯和一次亚洲杯。图片中的数据做了如下预处理:对于亚洲杯,前四名取其排名,十六强赋予 9,八强赋予 5,预选赛没出现的赋予 17。对于世界杯,进入决赛圈则取其最终排名,没有进入决赛圈的,打入预选赛十强赛赋予 40,预选赛小组未出线的赋予 50。这样做方便我们接下来使用数据。

根据图片中的数据,我们可以把图片上的数据存储为 data.txt

首先,我们打开桌面上的 Xfce终端 ,切换到hadoop用户下:

su -l hadoop #密码为hadoop

Kmeans聚类算法评估足球比赛

使用 vi 命令创建 data.txt

sudo vi data.txt

添加如下内容,字段之间用空格分隔,并保存。

Kmeans聚类算法评估足球比赛 使用 more 命令显示内容。

more data.txt

Kmeans聚类算法评估足球比赛

3.3 启动 spark shell

请在终端中输入如下代码:

spark-shell

Kmeans聚类算法评估足球比赛

进入到 Spark 的 REPL 环境,相当于就是 Spark 的 Console。

3.4 导入数据并转换数据

下面我们就进入到实验的关键位置,进行数据的导入。

3.4.1 导入数据

拓展:Spark textFile 进行数据的导入,将外部数据导入到 Spark 中来,并将其转换成 RDD。

键入如下命令:

val dataset = sc.textFile("/home/hadoop/data.txt")

Kmeans聚类算法评估足球比赛

从图中我们可以看到我们引入了 /home/hadoop 下面的 data.txt 文件。在最后我们也了解到了当前的数据格式为 RDD[ String ] 类型的数据。

现在我们可以看看当前 dataset 的数据样式。我们查看 dataset 的前十五行数据。

拓展:这里使用到 RDD Action 操作,take(num)函数,take 的作用就是获取 RDD 中下标 0 到 num-1 的元素。foreach 遍历,并打印

键入命令:

dataset.take(10).foreach(println)

Kmeans聚类算法评估足球比赛

3.4.2 使用 import 命令导入依赖:

import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.clustering.KMeans

Kmeans聚类算法评估足球比赛

然后我们将这些数据以空格分割开,拆分数据,将其转换 Vector 格式。

val data = dataset.map  {
        l =>
            Vectors.dense(l.split(' ').map(_.toDouble))
    }

Kmeans聚类算法评估足球比赛

由于需要多次使用该数据,用 cache 进行缓存,用 collect 查看数据。

data.cache()
data.collect

结果如下图:

Kmeans聚类算法评估足球比赛

划分子集,及迭代次数,这里选择 3 次,迭代次数根据机器状况决定,这里选择 100 次。

val km = KMeans.train(data,3,100)

Kmeans聚类算法评估足球比赛

分别打印这三个子集的质心

km.clusterCenters.foreach { println }

Kmeans聚类算法评估足球比赛

3.4.3 打印数据及对应的子集

data.foreach {
     p =>
     println(p + " belongs to subset: " + km.predict(p))
        }

Kmeans聚类算法评估足球比赛

由质心,数据及对应的子集,知道 3 个子集的索引分别是 0、1、2,如果对数据排序, 应该是2、0、1。显然在子集[ 2 ]中有 2 个国家,分别是沙特,伊朗,这两个国家足球水平较好点,接着在子集[ 0 ]中也有两个国家,分别为韩国,日本,这两个国家足球水平一般,最后在在子集[ 1 ]剩下 8 个国家,其中包含中国[ 50, 50, 9 ],说明中国足球有点差,不太理想,需要加油,至此实验就结束啦。

注意:本实验仅仅为了演示,实验结果不代表任何政治立场。

3.5 算法总结

K-Means 算法必须先确定K值,K 值的选定是非常难以估计的,在一定程度上影响结果。而 K-Means++ 算法给出了解决这个问题的方案,有兴趣的可以看一下。

本节课主要讲解了 K-Means,并基于算法进行一个简单案例讲解。

四、参考文档


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编程风格

编程风格

[美] Cristina Videira Lopes / 顾中磊 / 人民邮电出版社 / 2017-8 / 55.00元

本书对一个常见的编程问题定义了不同的约束,分别使用33种方法实现了同一个词频统计任务,从而形成了风格迥异的编程风格。作者以惯用的计算机语言与简单的任务为画笔,描绘了一次生动难忘的编程之旅,帮助读者加深了对语言的理解,也提供了崭新的编程思路。一起来看看 《编程风格》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码