spark机器学习从0到1聚类算法 (十)
一、概念
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聚类算法 (十)的更多相关文章
- spark机器学习从0到1特征提取 TF-IDF(十二)
一.概念 “词频-逆向文件频率”(TF-IDF)是一种在文本挖掘中广泛使用的特征向量化方法,它可以体现一个文档中词语在语料库中的重要程度. 词语由t表示,文档由d表示,语料库由D表示.词频TF ...
- spark机器学习从0到1介绍入门之(一)
一.什么是机器学习 机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门学科.专门研究计算机怎样模拟或实现人类的学习行 ...
- 【机器学习】:Kmeans均值聚类算法原理(附带Python代码实现)
这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...
- 机器学习:利用K-均值聚类算法对未标注数据分组——笔记
聚类: 聚类是一种无监督的学习,它将相似的对象归到同一个簇中.有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好.聚类分析试图将相似对象归入同一簇,将不相似对象归到不同 ...
- 机器学习实战-ch2-有标签的聚类算法
本书中的这个聚类算法多少有些让人意外.通常的聚类算法是这样的: 给定一堆点: 给定一个距离计算的算法: 给定一个cluster之间的距离d,或者最小的cluster数目k: 初始化,每个点作为初始集群 ...
- Spark2.0机器学习系列之1: 聚类算法(LDA)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
- spark机器学习从0到1协同过滤算法 (九)
一.概念 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法. 基于用户的协同过滤算法和基于项目的协同过滤算法 1.1.以用户为基础(User-based)的协同过滤 用相似统 ...
- Spark机器学习(10):ALS交替最小二乘算法
1. Alternating Least Square ALS(Alternating Least Square),交替最小二乘法.在机器学习中,特指使用最小二乘法的一种协同推荐算法.如下图所示,u表 ...
- spark机器学习从0到1特征变换-标签和索引的转化(十六)
一.原理 在机器学习处理过程中,为了方便相关算法的实现,经常需要把标签数据(一般是字符串)转化成整数索引,或是在计算结束后将整数索引还原为相应的标签. Spark ML 包中提供了几个相关的转换器 ...
随机推荐
- ambarella H2平台fpga捕捉卡驱动案例
公司最近开发的一款产品用到了ambarella H2平台的一款Soc,众所周知ambarella的H2系列的Soc编码能力很强,最高可达4kp60,捕捉上没有用ambarella开发板推荐的几个捕捉卡 ...
- c++四舍五入函数round()
其实c++自身是没有四舍五入函数round()的,若果你要用到的话,可以自己写一个round(),不过要用到floor()和ceil这两个函数如下: #include<iostream> ...
- 快速部署一个Kubernetes集群
官方提供的三种部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用. 部署地址:https:// ...
- 【Linux常见命令】vimdiff命令
在类nuix平台,我们希望对文件之间的差异之间快速定位,希望能够很容易的进行文件合并……. 可以使用Vim提供的diff模式,通常称作vimdiff,就是这样一个能满足所有这些需求,甚至能够提供更多的 ...
- mac OS git关联github
正在更新 mac OS 默认安装了git git -v 查看版本 mac OS 默认安装了ssh ssh -v 查看版本 1.设置username和email(github每次commit都会记录 ...
- centos分配IP脚本--写的第一个shell脚本
IDC小菜鸟一枚,非科班出身.常常有客户的centos服务器需要分配15个IP甚至30个IP.每次需要手动分配十分麻烦,于是花了一天时间学了shell脚本,写了这个脚本. #!/bin/bash re ...
- python实现二分叉查找
*二分叉查找就是折半查找 比如12345这几个数字当中找2,他会先找到这五个数字中的中坚的那个与2进行比较,比如中间的3>2他就认为3以后的不用查找了,然后查找3左边的,即123,再把这个分半, ...
- #Week1 Introduction
一.What is Machine Learning 课程里主要给了两个供参考的定义: By Arthur Samuel: Field of study that gives computers th ...
- CF思维联系– CodeForces -CodeForces - 992C Nastya and a Wardrobe(欧拉降幂+快速幂)
Nastya received a gift on New Year - a magic wardrobe. It is magic because in the end of each month ...
- P3807【模板】卢卡斯定理
题解大部分都是递归实现的,给出一种非递归的形式 话说上课老师讲的时候没给代码,然后自己些就写成了这样 对于质数\(p\)给出卢卡斯定理: \[\tbinom{n}{m}=\tbinom{n \bmod ...