feilong 发表于 2018-5-12 12:11:46

Spark 高级分析:第五章第11,12节 执行聚类

本帖最后由 feilong 于 2018-5-12 12:17 编辑

问题导读

1.如何执行聚类?
2.如何解释分析结果?
3.Spark畜类K-Means聚类外还有哪几种实现?
4.聚类除了异常检测还有哪些应用实例?


http://www.aboutyun.com/static/image/hrline/4.gif



上一篇:Spark 高级分析:第五章第9,10节 分类变量,使用标签和熵
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24449



最后,有了信心,我们可以将完全标准化的数据集用k = 150进行聚类。同样,每个集群的标签都可以打印出来以获得对结果集群的某种意义。集群似乎主要包含一个标签:
0 back. 6
0 neptune. 821239
0 normal. 255
0 portsweep. 114
0 satan. 31
...
90 ftp_write. 1
90 loadmodule. 1
90 neptune. 1
90 normal. 41253
90 warezclient. 12
...
93 normal. 8
93 portsweep. 7365
93 warezclient. 1

现在,我们可以做一个实际的异常探测器。异常检测相当于测量一个新的数据点与它最近的质心的距离。如果这个距离超过某个阈值,它就是反常的。这个阈值可以被选择为距离已知数据的100 -最远数据点的距离:
val distances = normalizedData.map(
datum => distToCentroid(datum, model)
)
val threshold = distances.top(100).last
最后一步是在所有新的数据点到达时应用这个阈值。例如,
Spark流可以用于将这个函数应用到来自诸如Flume、Kafka或HDFS文件的小批量输入数据。超过阈值的数据点可能触发一个警告,发送电子邮件或插入到数据库中。

作为一个例子,我们将把它应用到原始数据集,来查看一些数据点,我们可能认为,在输入中最不正常。为了解释结果,我们保留原始的输入行与解析的特征向量:
val model = ...
val originalAndData = ...
val anomalies = originalAndData.filter { case (original, datum) =>
val normalized = normalizeFunction(datum)
distToCentroid(normalized, model) > threshold
}.keys
有趣的是,赢家是以下数据点,这是数据中最反常的数据,根据这个模型:
val model = ...
val originalAndData = ...
val anomalies = originalAndData.filter { case (original, datum) =>
val normalized = normalizeFunction(datum)
distToCentroid(normalized, model) > threshold
}.keys
网络安全专家将更能解释为什么这是或实际上不是一个奇怪的连接。这看起来很不寻常,至少因为它被贴上了“正常”的标签。但是,在很短的时间内,涉及到200多个不同的连接,并以不同寻常的TCP状态结束,S1。


KMeansModel本身就是异常探测系统的本质。前面的代码演示了如何将其应用到数据以检测异常。同样的代码可以在Spark Streaming中使用,以在接近实时的情况下获得新数据,并可能触发警报或复审。

MLlib还包含了一个名为StreamingKMeans的变体,它可以随着新数据到达StreamingKMeansModel而增量地更新集群。这可以用来继续学习新的数据如何影响集群,而不仅仅是评估针对现有集群的新数据。它也与Spark Streaming集成。

这个模型只是一个简单的模型。例如,在这个示例中使用了Euclidean距离,因为它是此时Spark MLlib支持的惟一距离函数。在未来,可能可以使用距离函数来更好地解释特征之间的分布和相关性,如Mahalanobis距离。

也有更复杂的聚类质量评估指标,可以应用,甚至没有标签,选择k,比如剪影系数。它们不仅评估一个集群中的点的接近程度,而且还评估指向其他集群的紧密程度。

最后,也可以应用不同的模型,而不是简单的K-means聚类;例如,一个高斯混合模型或DBSCAN可以捕获数据点和集群中心之间更微妙的关系。

这些实现可能在未来的Spark MLlib或其他基于Spark的库中可用。

当然,聚类也不仅仅是异常检测。实际上,它通常与实际聚类重要的用例有关!例如,聚类还可以根据用户的行为、偏好和属性来对客户进行分组。每个集群本身可能代表了一种有用的可区分的客户类型。这是一种更数据驱动的方式来细分客户,而不是依赖于任意的、通用的部门,比如“20-34岁”和“女性”。




页: [1]
查看完整版本: Spark 高级分析:第五章第11,12节 执行聚类