Spark:聚类算法
Spark:聚类算法
Kmeans聚类
KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇。然后按平均法重新计算各个簇的质心,从而确定新的簇心。一直迭代,直到簇心的移动距离小于某个给定的值。
K-Means聚类算法主要分为三个步骤:
(1)第一步是为待聚类的点寻找聚类中心
(2)第二步是计算每个点到聚类中心的距离,将每个点聚类到离该点最近的聚类中去
(3)第三步是计算每个聚类中所有点的坐标平均值,并将这个平均值作为新的聚类中心
反复执行(2)、(3),直到聚类中心不再进行大范围移动或者聚类次数达到要求为止
如何选择聚类数目how do we know how many clusters to make?Within Set Sum of Squared Error (WSSSE)
use the "elbow method." This means we evaluate range of values for the number of clusters and check the within set sum of squared error (WSSSE). Plotting the number of clusters against WSSSE will show improvement (minimization) somewhere along its progression. Choose the number of clusters at which large improvements in WSSSE stop.也就是角点处角最小的那个角点对应的k值。
使用函数computeCost(rdd)
具体实现
from math import sqrt
def error(point):
center = clusters.centers[clusters.predict(point)]
return sqrt(sum([x**2 for x in (point - center)]))
WSSSE = (parsedData.map(lambda point:error(point)).reduce(lambda x, y: x+y))
print('Within Set Sum of Squared Error = ' + str(WSSSE))
kmeans中心点的计算
对于初始化聚类中心点,我们可以在输入的数据集中随机地选择k 个点作为中心点,但是随机选择初始中心点可能会造成聚类的结果和数据的实际分布相差很大。k-means++就是选择初始中心点的一种算法。
k-means++算法选择初始中心点的基本思想就是:初始的聚类中心之间的相互距离要尽可能远。初始化过程如下。
1)从输入的数据点集合中随机选择一个点作为第一个聚类中心;
2)对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x);
3)选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大;
4)重复2)和3),直到k 个聚类中心被选出来;
5)利用这k 个初始的聚类中心来运行标准的KMeans 算法。
从上面的算法描述可以看到,算法的关键是第3 步,如何将D(x)反映到点被选择的概率上。一种算法如下。
1)随机从点集D 中选择一个点作为初始的中心点。
2)计算每一个点到最近中心点的距离i S ,对所有i S 求和得到sum。
3)然后再取一个随机值,用权重的方式计算下一个“种子点”。取随机值random(0<random<sum),对点集D 循环,做random - = i S 运算,直到random < 0,那么点i 就是下一个中心点。
4)重复2)和3),直到k 个聚类中心被选出来。
5)利用这k 个初始的聚类中心来运行标准的KMeans 算法。
MLlib 的KMeans 聚类模型对于计算样本属于哪个中心点,采用了一种快速查找、计算距离的方法,其方法如下。
首先定义lowerBoundOfSqDist 距离公式,假设中心点center 是(a1,b1),需要计算的点point是2 2 (a ,b ),那么lowerBoundOfSqDist 是:
可轻易证明lowerBoundOfSqDist 将会小于或等于EuclideanDist,因此在进行距离比较的时候,先计算很容易计算的lowerBoundOfSqDist(只需要计算center、point 的L2 范数)。如果lowerBoundOfSqDist 都不小于之前计算得到的最小距离bestDistance,那真正的欧氏距离也不可能小于bestDistance 了。因此在这种情况下就不需要去计算欧氏距离了,省去了很多计算工作。
如果lowerBoundOfSqDist 小于bestDistance,则进行距离的计算,调用fastSquaredDistance,该方法是一种快速计算距离的方法。
fastSquaredDistance方法会先计算一个精度,有关精度的计算val precisionBound1 = 2.0 * EPSILON * sumSquaredNorm / (normDiff * normDiff + EPSILON),如果在精度满足条件的情况下,欧式距离sqDist = sumSquaredNorm - 2.0 * v1.dot(v2),sumSquaredNorm即为,2.0 * v1.dot(v2)即为
。这也是之前将norm计算出来的好处。如果精度不满足要求,则进行原始的距离计算公式了
,即调用Vectors.sqdist(v1, v2)。
Debugs
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.mllib.api.python.SerDe.loads.
: net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.dtype)
, , ):
km_model , , ):
km_model = km.train(ll_rdd, k=k)
就可以了。spark现在真不稳定。。。
pyspark.mllib.clustering module
BisectingKMeans
A bisecting k-means algorithm based on the paper “A comparison ofdocument clustering techniques” by Steinbach, Karypis, and Kumar,with modification to fit Spark.The algorithm starts from a single cluster that contains all points.Iteratively it finds divisible clusters on the bottom level andbisects each of them using k-means, until there are k leafclusters in total or no leaf clusters are divisible.The bisecting steps of clusters on the same level are groupedtogether to increase parallelism. If bisecting all divisibleclusters on the bottom level would result more than k leafclusters, larger clusters get higher priority.
KMeans
- class pyspark.mllib.clustering.KMeans[source]
-
- classmethod train(rdd, k, maxIterations=100, runs=1, initializationMode='k-means||', seed=None, initializationSteps=5, epsilon=0.0001, initialModel=None)[source]
-
Parameters: - rdd – Training points as an RDD of Vector or convertiblesequence types.
- k – Number of clusters to create.
- maxIterations – Maximum number of iterations allowed.(default: 100)
- runs – This param has no effect since Spark 2.0.0. 之前版本的runs:并行度,默认1;
- initializationMode – The initialization algorithm. This can be either “random” or“k-means||”.(default: “k-means||”)
- seed – Random seed value for cluster initialization. Set as None togenerate seed based on system time.(default: None)
- initializationSteps – Number of steps for the k-means|| initialization mode.This is an advanced setting – the default of 5 is almostalways enough.(default: 5)
- epsilon – Distance threshold within which a center will be considered tohave converged. If all centers move less than this Euclideandistance, iterations are stopped.(default: 1e-4)
- initialModel – Initial cluster centers can be provided as a KMeansModel objectrather than using the random or k-means|| initializationModel.(default: None)
Note: lz发现没有自定义距离度量函数的接口。。。跪了
computeCost(rdd)[source]
Return the K-means cost (sum of squared distances of points to their nearest center) for this model on the givendata.
predict(x)[source]
Find the cluster that each of the points belongs to in thismodel.
-
Parameters: x – A data point (or RDD of points) to determine cluster index. Returns: Predicted cluster index or an RDD of predicted cluster indicesif the input is an RDD.
Note: collect返回后是一个list类型。
save(sc, path)[source]¶
[KMeans]
[streaming k-means in the Spark documentation]
pyspark.ml.clustering module
这个使用pandas dataframe运行kmeans总是出错,官方文档不完善,没搞定。
pyspark.sql.utils.IllegalArgumentException: 'Field "features" does not exist.'
from: Spark:聚类算法
ref:
Spark:聚类算法的更多相关文章
- SPARK在linux中的部署,以及SPARK中聚类算法的使用
眼下,SPARK在大数据处理领域十分流行.尤其是对于大规模数据集上的机器学习算法.SPARK更具有优势.一下初步介绍SPARK在linux中的部署与使用,以及当中聚类算法的实现. 在官网http:// ...
- Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)
Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...
- spark机器学习从0到1聚类算法 (十)
一.概念 1.1.定义 按照某一个特定的标准(比如距离),把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不再同一个簇内的数据对象的差异性也尽可能的大. 聚类属于典型 ...
- Spark中的聚类算法
Spark - Clustering 官方文档:https://spark.apache.org/docs/2.2.0/ml-clustering.html 这部分介绍MLlib中的聚类算法: 目录: ...
- Spark MLlib中KMeans聚类算法的解析和应用
聚类算法是机器学习中的一种无监督学习算法,它在数据科学领域应用场景很广泛,比如基于用户购买行为.兴趣等来构建推荐系统. 核心思想可以理解为,在给定的数据集中(数据集中的每个元素有可被观察的n个属性), ...
- [数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现
聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记 ...
- Spark2.0机器学习系列之1: 聚类算法(LDA)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
- DBSCAN密度聚类算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...
- 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
随机推荐
- python 元组(tuple)的使用方法介绍
一.元组定义 元组和列表类似,元组使用的是小括号,列表是中括号,但是元组不像列表那样可以增删改:如果列表中存在列表或字符串,那么可以对其进行修改. 创建一个元组,只需要括号中添加元素,元素用逗号隔开即 ...
- 运用正则+replace+substring将一段英语的字母大写 angurlar运用自定义指令filter完成首字母大写
复习下js基础并运用正则+replace+substring将一段英语的字母大写 <!DOCTYPE html><html> <head> <meta cha ...
- [LeetCode] Contiguous Array 邻近数组
Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1. ...
- day 1——ST表练习
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 43893 Accepted: 20585 ...
- [SDOI2009]学校食堂Dining
题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...
- 洛谷P1856 [USACO5.5]矩形周长Picture
题目背景 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 题目描述 编写一个程序计算周长. 如图1所示7个矩形. ...
- ●BZOJ 3796 Mushroom追妹纸
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3796 题解: 题意: 给出三个串 A,B,C 找出一个最长串 S, 使得 ...
- bzoj 1835: [ZJOI2010]基站选址
Description 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄 ...
- 抽象方法不能是static或native或synchroniz
abstract 是抽象了,只有声明,没有具体的实现方法 static是静态的,是一种属于类而不属于对象的方法或者属性,而我们知道,类其实也是一个对象,他是在class文件加载到虚拟机以后就会产生的对 ...
- 数据挖掘实战<1>:数据质量检查
数据行业有一句很经典的话--"垃圾进,垃圾出"(Garbage in, Garbage out, GIGO),意思就是,如果使用的基础数据有问题,那基于这些数据得到的任何产出都是没 ...