文档章节

Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(2): 模型优化

clebeg
 clebeg
发布于 2015/11/13 15:18
字数 1380
阅读 525
收藏 5

Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(2): 模型优化

上一节:Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索模型初步实验

前言

通过上一节的介绍,已经对数据集长什么样子,模型如何工作的有了一个基本的了解,本节重点就是探讨如何优化 K-means 聚类模型。

1 K-means 聚类算法的 K 如何选择

首先探讨的第一个问题是 K-means 的类别 K 该如何确定?为了回答这个问题,需要先回答下面的问题:

  1. 如何量化模型的效果?

第一个想到的答案就是:当K确定下来之后,模型得到K个类中心,每个样本也归属到自己的类,那么每个样本距离类中心的距离也是知道的,将所有样本距离类中心的距离相加, 这个总距离数值越小越好(当然看总距离的平均值也是一样的,因为样本数量是相同的)。
这似乎很有道理,但是细细一想就发现,这个有点不靠谱,为什么?当你的类别数目等于样本数量的时候每一个样本都是类中心,那这个距离相加为0,是不是最小的?也就是说 这个总距离会随着类个数增加而减少。那这个K值如何取?
很简单,取总距离下降拐点处的 K 值。因为总距离随着 K 值的增加而减少但是减少的幅度不是每次都会很大,总会有一个K值之后,距离下降趋于平缓,这个点就是拐点。
这个思路其实和主成份分析找主成份的思路是一致的:也是找碎石图中的拐点。
下面将会以实战的方式,来具体求出这个最佳的 K 值,具体含义代码都有相应注释:

 /**
  * 欧几里德距离计算
  * zip 先将两个相同长度的向量按照对应的索引位置合为一个
  * 计算(a - b)的 平方和在求根
  * @param a 向量a
  * @param b 向量b
  * @return
  */
 def distance(a: Vector, b: Vector): Double = {
   val s = a.toArray.zip(b.toArray).map(p => p._1 - p._2)
   .map(d => d * d).sum
   Math.sqrt(s)
 }

 /**
  * 计算每一个数据点离类中心的距离
  * @param datum
  * @param model
  */
 def distToCentroid(datum: Vector, model: KMeansModel): Double = {
   val cluster = model.predict(datum)
   val centroid = model.clusterCenters(cluster)
   distance(datum, centroid)
 }
 /**
  * 重新指定聚类的个数重新聚类
  * @param data 训练样本
  * @param k 聚类类别个数
  */
 def clusteringScore(data: RDD[Vector], k: Int): Double = {
   val kmeans = new KMeans()
   kmeans.setK(k)
   val model = kmeans.run(data)
   //计算每一个点离中心点的距离
   data.map {
     datum =>
       distToCentroid(datum, model)
   }.mean()
 }

 //驱动代码:对不同K值计算总距离平均值
 (5 to 40 by 5).map(k => (k, clusteringScore(data, k))).sortBy(_._2).foreach(println)

上面的结果每次运行都有可能不一样,因为 K-means 算法是随机初始化类中心的,下面是某次运行的结果:

(5,1938.858341805931)
(10,1689.4950178959496)
(15,1381.315620528147)
(20,1318.256644582388)
(25,932.0599419255919)
(30,594.2334547238697)
(35,829.5361226176625)
(40,424.83023056838846)

从上面的结果中可以发现,随着 K 值的增加,总距离确实是在减少,但是 35 这个 K 值对应的距离却比 30 对应的距离大,这是为什么? 其实 K 均值聚类算法并不会尝试去找到全局最优,它还受到其他参数的影响,请看下面的分析。

2 参数选择

实际上 Spark 实现的是 K-means|| 初始质心选择算法。 K-means++ and K-means|| 都是尽可能选择 多样的分离的初始类中心的算法的变体,目的都是为了得到更加可靠的好的聚类结果。但是它们里面还是存在 随机的因素,导致得不到全局最优解,而在某个局部最优解就提前停止了计算。当然可以调整其他参数使得小狗狗更好, 下面分布介绍另外几个重要的参数:

  • setRuns 设置同一个 K 运行聚类算法的次数,取其中效果最好的一次(当然这个数值越大消耗资源也越大)
  • setEpsilon 这个是控制迭代停止条件的参数。当前后两次迭代的类中心小于这个值,算法认为类中心已经稳定,遂停止。减少这个值会增加迭代的次数。

下面重新调整参数,并且增加测试的次数,为了增加测试速度,每一个参数可以并行启动,而不是等另一个结束才启动, 这就是分布式上的分布式,下面直接给出代码:

 /**
  * 重新指定聚类的个数重新聚类
  * @param data 训练样本
  * @param k 聚类类别个数
  */
 def clusteringScore(data: RDD[Vector], k: Int): Double = {
   val kmeans = new KMeans()
   kmeans.setRuns(10)
   kmeans.setEpsilon(1.0e-6)
   kmeans.setK(k)
   val model = kmeans.run(data)
   data.map {
     datum =>
       distToCentroid(datum, model)
   }.mean()
 }
 //驱动代码
 (30 to 100 by 10).par.map(k => (k, clusteringScore(data, k)))
  .toList.sortBy(_._2).foreach(println)

3 参考资料

K-means 算法原理

个人微信公众号

欢迎关注本人微信公众号,会定时发送关于大数据、机器学习、Java、Linux 等技术的学习文章,而且是一个系列一个系列的发布,无任何广告,纯属个人兴趣。
Clebeg能量集结号

© 著作权归作者所有

clebeg
粉丝 45
博文 40
码字总数 40057
作品 0
广州
程序员
私信 提问
地铁译:Spark for python developers ---Spark与数据的机器学习

机器学习可以从数据中得到有用的见解. 目标是纵观Spark MLlib,采用合适的算法从数据集中生成见解。对于 Twitter的数据集, 采用非监督集群算法来区分与Apache
Spark相关的tweets . 初始输入...

abel_cao
01/17
0
0
基于Spark的机器学习实践 (十) - 降维

通过讲解PCA算法的原理,使大家明白降维算法的大致原理,以及能够实现怎么样的功能。结合应用降维算法在分类算法使用之前进行预处理的实践,帮助大家体会算法的作用。 0 相关源码 1 PCA算法及...

javaedge
04/18
0
0
Spark的39个机器学习库-中文

//Apache Spark 本身// 1.MLlib >AMPLab Spark最初诞生于伯克利 AMPLab实验室,如今依然还是AMPLab所致力的项目,尽管这些不处于Apache Spark Foundation中,但是依然在你日常的github项目中...

MoksMo
2015/11/04
881
0
什么是 Apache Spark?大数据分析平台如是说

自从 Apache Spark 2009 年在 U.C. Berkeley 的 AMPLab 默默诞生以来,它已经成为这个世界上最重要的分布式大数据框架之一。Spark 可以用多种方式部署,它为 Java、Scala、Python,和 R 编程...

oschina
2017/11/22
723
0
基于Spark的机器学习实践 (二) - 初识MLlib

1 MLlib概述 1.1 MLlib 介绍 ◆ 是基于Spark core的机器学习库,具有Spark的优点 ◆ 底层计算经过优化,比常规编码效率往往要高 ◆ 实现了多种机器学习算法,可以进行模型训练及预测 1.2 Spark ...

javaedge
04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
52分钟前
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
8
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
11
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
10
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部