一、概念

1.1、定义

按照某一个特定的标准(比如距离),把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不再同一个簇内的数据对象的差异性也尽可能的大。

聚类属于典型的无监督学习(Unsupervised Learning) 方法。与监督学习(如分类器)相比,无监督学习的训练集没有人为标注的结果。在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。

1.2、主要方法

层次聚类(Hierarchical Clustering):合并法、分解法、树状图

非层次聚类:划分聚类、谱聚类

1.3、主要特征
  • 聚类变量的测量尺度不同,需要事先对变量标准化;
  • 聚类变量中如果有些变量非常相关,意味着这个变量的权重会更大
  • 欧式距离的平方是最常用的距离测量方法;
  • 聚类算法要比距离测量方法对聚类结果影响更大;
  • 标准化方法影响聚类模式:
  • 变量标准化倾向产生基于数量的聚类;
  • 样本标准化倾向产生基于模式的聚类;
  • 一般聚类个数在4-6类,不易太多,或太少

二、KMeans原理

KMeans 是一个迭代求解的聚类算法,其属于 划分(Partitioning) 型的聚类方法,即首先创建K个划分,然后迭代地将样本从一个划分转移到另一个划分来改善最终聚类的质量,KMeans 的过程大致如下:

1.根据给定的k值,选取k个样本点作为初始划分中心;
2.计算所有样本点到每一个划分中心的距离,并将所有样本点划分到距离最近的划分中心;
3.计算每个划分中样本点的平均值,将其作为新的中心;
4.用计算出的中心位置重新进行聚类,如此反复循环,直到达到最大迭代次数,或划分中心的变化小于某一预定义阈值

方法的特点:

  • 通常要求已知类别数
  • 可人为指定初始位置
  • 节省运算时间
  • 样本量大于100时有必要考虑
  • 只能使用连续性变量

三、代码实现

3.1、数据集的读取
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.mllib.clustering.KMeans;
import org.apache.spark.mllib.clustering.KMeansModel;
import org.apache.spark.mllib.linalg.Vector;
import org.apache.spark.mllib.linalg.Vectors;
//1、获取Spark
SparkConf conf = new SparkConf().setAppName("ClusteringModel").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf); //2、读取数据
JavaRDD<String> rawData = sc.textFile("data/mllib/iris.data"); JavaRDD<Vector> trainingData = rawData.map(line->{
String[] parts = line.split(",");
return Vectors.dense(Double.parseDouble(parts[0]),
Double.parseDouble(parts[1]),
Double.parseDouble(parts[2]),
Double.parseDouble(parts[3]));
});

本文使用模式识别领域广泛使用的UCI数据集中的鸢尾花数据Iris进行实验,Iris数据的样本容量为150,有四个实数值的特征,分别代表花朵四个部位的尺寸,以及该样本对应鸢尾花的亚种类型(共有3种亚种类型),如下所示:

5.1,3.5,1.4,0.2,setosa
...
5.4,3.0,4.5,1.5,versicolor
...
7.1,3.0,5.9,2.1,virginica
...
3.2、模型训练与分析

可以通过创建一个KMeans类并调用其run(RDD[Vector])方法来训练一个KMeans模型KMeansModel,在该方法调用前需要设置一系列参数,如下表所示:

| 参数 | 含义 |
| ——————- | :———————: |
| K | 聚类数目,默认为2 |
| maxIterations | 最大迭代次数,默认为20 |
| initializationMode | 初始化模式,默认为”k-means||” |
| runs | 运行次数,默认为:1 |
| initializationSteps | 初始化步数,用于KMeans||,默认为5 |
| epsilon | 迭代停止的阈值,默认为1e-4 |

其中,每一个参数均可通过名为setXXX(…)(如maxIterations即为setMaxIterations())的方法进行设置。
由于KMeans类只有无参的构造函数,其对象创建、参数设置需要分别进行,且往往使用的只有存放模型的KMeansModel类对象,花功夫创建出的KMeans类自象本身却并未使用。故MLlib也提供了包装好的高层次方法KMeans.train(…),传入训练样本和相应的参数,即返回一个训练好的KMeansModel对象,十分方便。
该方法有4个重载形式,分别可以指定不同的输入参数,具体可以查阅MLlib的API文档,这里我们使用KMeans.train(data, k, maxIterations, runs)形式,只需要输入k值、最大迭代次数和运行次数,其他参数使用默认值,如下所示:

KMeansModel model = KMeans.train(trainingData.rdd(),3,100,5);
//通过KMeansModel类自带的clusterCenters属性获取到模型的所有聚类中心情况

这样,模型即创建成功了。可以通过KMeansModel类自带的clusterCenters属性获取到模型的所有聚类中心情况:

Vector[] vectors = model.clusterCenters();
for(Vector vector : vectors) {
System.out.println(vector);
}
/**
*控制台输出结果:
----------------------------------------------------------------------------
[5.901612903225807,2.748387096774194,4.393548387096774,1.4338709677419355]2
[5.005999999999999,3.4180000000000006,1.4640000000000002,0.2439999999999999]
[6.85,3.0736842105263147,5.742105263157893,2.071052631578947]
----------------------------------------------------------------------------
**/

也可以通过predict()方法来确定每个样本所属的聚类:

//通过predict()方法来确定每个样本所属的聚类:
trainingData.collect().forEach(sample->{
int predictedClustre = model.predict(sample);
System.out.println(sample.toString()+" belongs to cluster "+predictedClustre);
});
/**
*控制台输出结果:
---------------------------------------
[5.1,3.5,1.4,0.2] belongs to cluster 1
[4.9,3.0,1.4,0.2] belongs to cluster 1
[4.7,3.2,1.3,0.2] belongs to cluster 1
[4.6,3.1,1.5,0.2] belongs to cluster 1
[5.0,3.6,1.4,0.2] belongs to cluster 1
[5.4,3.9,1.7,0.4] belongs to cluster 1
[4.6,3.4,1.4,0.3] belongs to cluster 1
.....
--------------------------------------
**/

同时,KMeansModel类还提供了计算 集合内误差平方和(Within Set Sum of Squared Error, WSSSE) 的方法来度量聚类的有效性:

double wssse = model.computeCost(trainingData.rdd());
System.out.println("集合内误差平方和:"+wssse);
/**
*控制台输出结果:
----------------------------------
集合内误差平方和:78.94084142614648
----------------------------------
**/

四、主要应用

4.1、商业

聚类分析被用来发现不同的客户群,并且通过购买模式刻画不同的客户群的特征。
聚类分析是细分市场的有效工具,同时也可用于研究消费者行为,寻找新的潜在市场、选择实验的市场,并作为多元分析的预处理。

4.2、生物

聚类分析被用来动植物分类和对基因进行分类,获取对种群固有结构的认识

4.3、地理

聚类能够帮助在地球中被观察的数据库商趋于的相似性

4.4、保险行业

聚类分析通过一个高的平均消费来鉴定汽车保险单持有者的分组,同时根据住宅类型,价值,地理位置来鉴定一个城市的房产分组

4.5、因特网

聚类分析被用来在网上进行文档归类来修复信息

4.6、电子商务

聚类分析在电子商务中网站建设数据挖掘中也是很重要的一个方面,通过分组聚类出具有相似浏览行为的客户,并分析客户的共同特征,可以更好的帮助电子商务的用户了解自己的客户,向客户提供更合适的服务。

spark机器学习从0到1聚类算法 (十)的更多相关文章

  1. spark机器学习从0到1特征提取 TF-IDF(十二)

        一.概念 “词频-逆向文件频率”(TF-IDF)是一种在文本挖掘中广泛使用的特征向量化方法,它可以体现一个文档中词语在语料库中的重要程度. 词语由t表示,文档由d表示,语料库由D表示.词频TF ...

  2. spark机器学习从0到1介绍入门之(一)

      一.什么是机器学习 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行 ...

  3. 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)

    这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...

  4. 机器学习:利用K-均值聚类算法对未标注数据分组——笔记

    聚类: 聚类是一种无监督的学习,它将相似的对象归到同一个簇中.有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好.聚类分析试图将相似对象归入同一簇,将不相似对象归到不同 ...

  5. 机器学习实战-ch2-有标签的聚类算法

    本书中的这个聚类算法多少有些让人意外.通常的聚类算法是这样的: 给定一堆点: 给定一个距离计算的算法: 给定一个cluster之间的距离d,或者最小的cluster数目k: 初始化,每个点作为初始集群 ...

  6. Spark2.0机器学习系列之1: 聚类算法(LDA)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:      (1)K-means      (2)Latent Dirichlet allocation (LDA)  ...

  7. spark机器学习从0到1协同过滤算法 (九)

      一.概念 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法.   基于用户的协同过滤算法和基于项目的协同过滤算法 1.1.以用户为基础(User-based)的协同过滤 用相似统 ...

  8. Spark机器学习(10):ALS交替最小二乘算法

    1. Alternating Least Square ALS(Alternating Least Square),交替最小二乘法.在机器学习中,特指使用最小二乘法的一种协同推荐算法.如下图所示,u表 ...

  9. spark机器学习从0到1特征变换-标签和索引的转化(十六)

      一.原理 在机器学习处理过程中,为了方便相关算法的实现,经常需要把标签数据(一般是字符串)转化成整数索引,或是在计算结束后将整数索引还原为相应的标签. Spark ML 包中提供了几个相关的转换器 ...

随机推荐

  1. shift count is too large

    STM8S是8 bit单片机在STM8S中 unsigned long是32位, unsigned short和unsigned int都是16位,unsigned char是8位. 以以下代码编译时 ...

  2. linux awk 命令实用手册

    0,简介 Linux awk 是一个实用的文本处理工具,它不仅是一款工具软件,也是一门编程语言.awk 的名称来源于其三位作者的姓氏缩写,其作者分别是Alfred Aho,Peter Weinberg ...

  3. SpringCloud系列之集成Dubbo应用篇

    目录 前言 项目版本 项目说明 集成Dubbo 2.6.x 新项目模块 老项目模块 集成Dubbo 2.7.x 新项目模块 老项目模块 参考资料 系列文章 前言 SpringCloud系列开篇文章就说 ...

  4. JavaScript HTMlL DOM对象(上)

    Dom:document.相当于把所有的html文件,转换成了文档对象. 之前说过:html-裸体的人:css-穿上衣服:js-让人动起来. 让人动起来,就得先找到他,再修改它内容或属性. 找到标签 ...

  5. 用两张图告诉你,为什么你的App会卡顿?

    有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? 知道Android究竟是如何在屏幕上显示我们期望的画面的? 对Android的视图架构有整体把握. 学会 ...

  6. MySQL Change Data Directory

    为什么80%的码农都做不了架构师?>>>   Stop MySQL using the following command: sudo /etc/init.d/mysql stop ...

  7. 02-线性结构4 Pop Sequence

    02-线性结构4 Pop Sequence   (25分) 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 https://pta.p ...

  8. C# 对 TCP 客户端的状态封装

    TCP客户端连接TCP服务器端有几种应用状态: 与服务器的连接已建立 与服务器的连接已断开 与服务器的连接发生异常 应用程序可按需求合理处理这些逻辑,比如: 连接断开后自动重连 连接断开后选择备用地址 ...

  9. NetCore项目实战篇02---全局异常处理

    在 .netcore中可以自定义自己的异常类型,步骤如下: 1.自定义自己的异常类型UserOperationException 并继承自Exception public class UserOper ...

  10. P1459 三值的排序 Sorting a Three-Valued

    题目描述 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候.在这个任务中可能的值只有三种1,2和3.我们用交换的方法把他排成升 ...