聚类算法

聚类,Cluster analysis,有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可能的相似,簇与簇之间的object尽可能的相异。聚类算法是机器学习(或者说是数据挖掘更合适)中重要的一部分,除了最为简单的K-Means聚类算法外,较常见的还有:层次法(CURE、CHAMELEON等)、网格算法(STING、WaveCluster等)等等。

较权威的聚类问题定义:所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高。其中每个子集叫做一个簇。

与分类不同,分类是示例式学习,要求分类前明确各个类别,并断言每个元素映射到一个类别,而聚类是观察式学习,在聚类前可以不知道类别甚至不给定类别数量,是无监督学习的一种。目前聚类广泛应用于统计学、生物学、数据库技术和市场营销等领域,相应的算法也非常的多。

K-Means

K-Means属于基于平方误差的迭代重分配聚类算法,其核心思想十分简单:

  1. 随机选择K个中心点
  2. 计算所有点到这K个中心点的距离,选择距离最近的中心点为其所在的簇
  3. 简单的采用算术平均数(mean)来重新计算K个簇的中心
  4. 重复步骤2和3,直至簇类不在发生变化或者达到最大迭代值
  5. 输出结果

K-Means算法的结果好坏依赖于对初始聚类中心的选择,容易陷入局部最优解,对K值的选择没有准则可依循,对异常数据较为敏感,只能处理数值属性的数据,聚类结构可能不平衡。

这里有一个K-Means的演示,需要安装Java Applet。

Spark实现K-Means算法

测试数据

1
2
3
4
5
6
7
8
9

0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2
15.1 16.1 17.0
18.0 17.0 19.0
20.0 21.0 22.0

如前文所述,测试数据不用带标签,数据分为3个维度。

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

private static final Pattern SPACE = Pattern.compile(" ");
public static void main(String[] args) {
    SparkConf sparkConf = new SparkConf()
          .setAppName("K-Means")
          .setMaster("local[2]");
    JavaSparkContext sc = new JavaSparkContext(sparkConf);
    JavaRDD<String> data = sc.textFile("/home/yurnom/data/kmeans_data.txt");
    JavaRDD<Vector> parsedData = data.map(s -> {
        double[] values = Arrays.asList(SPACE.split(s))
              .stream()
              .mapToDouble(Double::parseDouble)
              .toArray();
        return Vectors.dense(values);
    });
    int numClusters = 3; //预测分为3个簇类
    int numIterations = 20; //迭代20次
    int runs = 10; //运行10次,选出最优解
    KMeansModel clusters = KMeans.train(parsedData.rdd(), numClusters, numIterations, runs);
    //计算测试数据分别属于那个簇类
    print(parsedData.map(v -> v.toString()
          + " belong to cluster :" + clusters.predict(v)).collect());
    //计算cost
    double wssse = clusters.computeCost(parsedData.rdd());
    System.out.println("Within Set Sum of Squared Errors = " + wssse);
    //打印出中心点
    System.out.println("Cluster centers:");
    for (Vector center : clusters.clusterCenters()) {
        System.out.println(" " + center);
    }
    //进行一些预测
    System.out.println("Prediction of (1.1, 2.1, 3.1): "
          + clusters.predict(Vectors.dense(new double[]{1.1, 2.1, 3.1})));
    System.out.println("Prediction of (10.1, 9.1, 11.1): "
          + clusters.predict(Vectors.dense(new double[]{10.1, 9.1, 11.1})));
    System.out.println("Prediction of (21.1, 17.1, 16.1): "
          + clusters.predict(Vectors.dense(new double[]{21.1, 17.1, 16.1})));
}
public static <T> void print(Collection<T> c) {
    for(T t : c) {
        System.out.println(t.toString());
    }
}

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

[0.0,0.0,0.0] belong to cluster :0
[0.1,0.1,0.1] belong to cluster :0
[0.2,0.2,0.2] belong to cluster :0
[9.0,9.0,9.0] belong to cluster :1
[9.1,9.1,9.1] belong to cluster :1
[9.2,9.2,9.2] belong to cluster :1
[15.1,16.1,17.0] belong to cluster :2
[18.0,17.0,19.0] belong to cluster :2
[20.0,21.0,22.0] belong to cluster :2
Within Set Sum of Squared Errors = 38.533333333333815
Cluster centers:
[0.10000000000000002,0.10000000000000002,0.10000000000000002]
[9.1,9.1,9.1]
[17.7,18.033333333333335,19.333333333333332]
Prediction of (1.1, 2.1, 3.1): 0
Prediction of (10.1, 9.1, 11.1): 1
Prediction of (21.1, 17.1, 16.1): 2

人为捏造的测试数据所想表现出来的簇类完全被k-means算法体会到了,若是人工将测试数据分成3个簇类,结果也会与上面一样。

最后

K-Means属于无监督学习,最大的特别和优势在于模型的建立不需要训练数据。在日常工作中,很多情况下没有办法事先获取到有效的训练数据,这时采用K-Means是一个不错的选择。但K-Means需要预先设置有多少个簇类(K值),这对于像计算某省份全部电信用户的交往圈这样的场景就完全的没办法用K-Means进行。对于可以确定K值不会太大但不明确精确的K值的场景,可以进行迭代运算,然后找出cost最小时所对应的K值,这个值往往能较好的描述有多少个簇类。

参考资料

  • MLlib - Clustering
  • k-means clustering
  • K-means聚类算法
  • 算法杂货铺——k均值聚类(K-means)

Spark MLlib之K-Means聚类算法相关推荐

  1. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  2. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  3. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  4. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  5. 基于Spark的机器学习实践 (九) - 聚类算法

    0 相关源码 1 k-平均算法(k-means clustering)概述 1.1 回顾无监督学习 ◆ 分类.回归都属于监督学习 ◆ 无监督学习是不需要用户去指定标签的 ◆ 而我们看到的分类.回归算法 ...

  6. Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索、模型初探

    Spark数据挖掘-基于 K 均值聚类的网络流量异常检测(1): 数据探索.模型初探 1 前言 分类和回归是强大易学的机器学习技术.需要注意的是:为了对新的样本预测未知的值, 必须从大量已知目标值的样 ...

  7. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  8. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  9. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  10. 【模式识别】K均值聚类算法应用实验报告及MATLAB仿真

    一. 实验目的 1.掌握K均值聚类算法的原理和实现过程: 2.掌握K均值聚类算法的应用方法. 二. 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图).步 ...

最新文章

  1. 汇总|精选CVPR开源项目学习资源
  2. post json后台处理数据_Python爬虫教程-07-post介绍(百度翻译)(上)
  3. Mac下制作Ubuntu的启动U盘
  4. MySQL数据库:索引的实现原理
  5. java 重构函数_包会,教你用Java函数式编程重构烂代码
  6. Teams App 如何使用设备的能力
  7. Zookeeper客户端Curator使用详解
  8. 14004.xilinx自动打包image.ub脚本
  9. [面试专题]Vue.js 2.0 独立构建和运行时构建的区别
  10. 为什么单独循环中的元素加法比组合循环中的要快得多?
  11. [转]手游运营后台通用需求
  12. HashTable Dictionary HashMap
  13. 提升效率之串口监控工具
  14. 会员无损音乐各种格式转换成mp3等格式
  15. 微信商户平台如何下载证书和设置KEY值?
  16. 干货分享:如何把APP软文推广做到好
  17. 解决执行HiveSQL时,报could not be cleaned up的错误
  18. Spica,一种路径推荐的路段结合方法
  19. ssh开启图形界面_分享|3 个 Linux 上的 SSH 图形界面工具
  20. 【linux/shell】Centos7环境搭建、服务器搭建(脚本)

热门文章

  1. 调用系统相册,相机功能,遇到闪退的情况
  2. 开源软件free download manager在windows defender中报毒
  3. Linux  释放Linux 系统预留的硬盘空间
  4. 对目前自己的博客做一个小结
  5. python加载文件并显示文件内容到qtextedit上_如何在python中读取QTextedit?
  6. python错误代码提示手册_腾讯大佬整理了 Python 所有内置异常,Python高手必备的排错手册...
  7. C语言课后习题(56)
  8. C语言课后习题(27)
  9. SQL必知必会-检索数据
  10. 直播预告:WLS/WAS故障基本分析介绍