您的位置:首页 > 其它

spark-机器学习实践-K近邻应用实践一

2016-09-18 22:46 253 查看

http://www.cnblogs.com/gnool/p/5883209.html

K近邻应用-异常检测应用
  原理:
     根据数据样本进行KMeans机器学习模型的建立,获取簇心点,以簇为单位,离簇心最远的第五个点的距离为阈值,大于这个值的为异常点,即获得数据异常。
如图:

 
  数据样本:

    数据样本的数据格式为:标号,特征值1,特征值2(没有具体含义,自动生成的数据只为能够简单的说明异常检测是怎么一回事,以及机器学习到底是如何应用在实际生产环境中)
可视化展示:
我们将数据样本投射到可视化环境中的可以看到数据呈现以下图形:

数据被分为3簇,在我们训练模型是K值为3簇。由于数据非常集中,数据量也非常少,同时特征向量为二维特征向量,故投影成平面图形我们一眼可以看出数据分为几簇,当样本数据的特征值很多时,就得靠计算得出K值(这里先不提)
应用代码实践:
 

//获取样本数据
val rawData = sc.textFile("D:/logdata/kmeans.txt")
//将样本数据转化为模型可操作的向量集
val labelAndData = rawData.map { line =>
val buffer = line.split(',').toBuffer
val label = buffer.remove(0)
val vector = Vectors.dense(buffer.map(_.toDouble).toArray)
(label, vector)
}
//将样本数据向量集缓存
val data = labelAndData.values.cache()
//建立Kmeans学习模型
val kmeans = new KMeans()
kmeans.setK(3)
//训练数据
val model = kmeans.run(data)
//打印簇心点
model.clusterCenters.foreach(println)

//欧氏距离的计算函数
def distance(a: Vector, b: Vector): Double = {
math.sqrt(a.toArray.zip(b.toArray).map(p => p._1 - p._2).map(d => d * d).sum)
}
//计算向量到模型簇心点的距离
def distToCentroid(datum: Vector, model: KMeansModel) = {
val cluster = model.predict(datum)
val centroid = model.clusterCenters(cluster)
distance(centroid, datum)
}
//计算所有点到簇心点的距离集合
val distances = data.map(datum =>
distToCentroid(datum, model)
)
//获取最大的第五个值为阈值
val threshold = distances.top(5).last

//测试数据获取
val testRawData = sc.textFile("D:/logdata/kmeans")
val testLabelAndData = testRawData.map { line =>
val buffer = line.split(',').toBuffer
val label = buffer.remove(0)
val vector = Vectors.dense(buffer.map(_.toDouble).toArray)
(label, vector)
}
//将测试数据集缓存
val testData = testLabelAndData.values.cache()

//异常数据集过滤并打印结果
val anomalies=testData.filter { x =>
distToCentroid(x, model) > threshold
}.collect().foreach(println)


 
 
 
计算结果:
[5.525200003000001,5.494100009000001]

[2.522222221212122,2.512020205050505]

[8.483267326732673,8.49178217821782]
 
异常值:
[6.73,6.58]

[6.62,6.04]

[6.99,6.66]

[6.59,6.38]

[6.42,6.74]

[6.37,6.59]

[6.84,6.03]

[6.84,6.03]

[6.9700003,6.5299997]

[6.03,6.31]

[6.18,6.27]

[6.84,6.81]

[6.3,6.93]

[6.49,6.23]

[6.16,6.67]

[6.56,6.77]

[6.57,6.32]

[6.37,6.55]

[6.68,6.07]

[6.8,6.4]

[6.91,6.44]

作者:舆-风动名扬 出处:http://www.cnblogs.com/gnool/ © 作者和博客园,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果觉得还有帮助的话,可以点一下右下角的【推荐】想跟我一起进步么?那就【关注】我吧。

分类: 机器学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习