02storm聚类尝试kmeans
来源:互联网 发布:手机数据包解压软件 编辑:程序博客网 时间:2024/06/06 21:21
先挑个最简单的算法尝试
01聚类kmeans算法和kmeans例子演示
来之百度百科:http://baike.baidu.com/link?url=sSyKEDTwqhsaJR4fqdNTP_JbxipZg1w82YcJZEcoKw8SxpZICi-OF5D47LztuG5jNcUU4igWC01ZA_qCMlR2Ca
1:选择 1 和16作为我们的初始中心点,两个中心点确定了,聚类结束后,会有两类。定为聚类c1和c2
3:使用均值算法(求平均数)
v = [(x1+x2+......xn)+(y1+y2+......+yn)+......] / n
更新 中心点。
c1 = {1 , 6 , 7} .的均值 v1 = (1+6+7) / 3 = 4.67 , c2 = {9 , 15 , 16}的均值 v2 = (9+15+16)/ 3 = 10;
4:以 v1,v2,作为新的中心点 带入2,3.反复迭代K次。知道中心点第k次和k-1次的中心点相等,即收敛。则聚类结束。
算法分析,
1:该算法的初始点的个数选择,决定了最终聚类结果类型的个数 。初始点的选择很大影响了迭代的次数,尽量选择个中间的点。
2:该算法是个反复迭代K次,直到中心点收敛的迭代过程。这个K次可能非常长,可以通过指定迭代次数的最大值。假设10如果迭代10次后也中心点仍然为收敛,此时迭代结束。
3:每个点到这两个初始中心点的距离,的这个距离公式的选择,欧式距离,余弦距离,等距离公式的不同都会影响到聚类效果。
02storm实现分布式kmeans聚类算法的思路
1:该算法是个全量数据的迭代过程,如果storm做当然要做成分布式,那么得会打散数据集。再对划分后的数据集的做一次kmeans迭代,将各个分区最终的中心点,作为初始点汇集在一起,再一次kmeans计算中心点。得最后的聚类结果。
2:见分而治之的算法和kmeans的原始定义是不一致的:。
3:其次做分而治之的话。值是多个点有多个维度的数字,并且算法不是简单的加法运算,不想url求总数只有一个字符,可以按hash(url)取模1024去分区。
03实现kmeans算法相关开源项目的思路参考
03-1 mahout实现分布式kmeans思路:
org.apache.mahout.clustering.kmeans.KMeansDriver这个类开始分析
//距离公式实现
String measureClass = getOption(DefaultOptionCreator.DISTANCE_MEASURE_OPTION);
未指定默认使用为开根号的欧氏距离
if (measureClass == null) {
measureClass = SquaredEuclideanDistanceMeasure.class.getName();
}
//迭代过程之间的中心点 的收敛距离阀值,默认值是 0.5
double convergenceDelta = Double.parseDouble(getOption(DefaultOptionCreator.CONVERGENCE_DELTA_OPTION));
最大迭代次数K
int maxIterations = Integer.parseInt(getOption(DefaultOptionCreator.MAX_ITERATIONS_OPTION));
距离实例化
DistanceMeasure measure = ClassUtils.instantiateAs(measureClass, DistanceMeasure.class);
聚类结果最后的类型个数
if (hasOption(DefaultOptionCreator.NUM_CLUSTERS_OPTION)) {
clusters = RandomSeedGenerator.buildRandom(getConf(), input, clusters,
Integer.parseInt(getOption(DefaultOptionCreator.NUM_CLUSTERS_OPTION)), measure);
}
计算簇中心后是否计算各个点属于哪个中心
boolean runClustering = hasOption(DefaultOptionCreator.CLUSTERING_OPTION);
boolean runSequential = getOption(DefaultOptionCreator.METHOD_OPTION).equalsIgnoreCase(
DefaultOptionCreator.SEQUENTIAL_METHOD);
double clusterClassificationThreshold = 0.0;
if (hasOption(DefaultOptionCreator.OUTLIER_THRESHOLD)) {
clusterClassificationThreshold = Double.parseDouble(getOption(DefaultOptionCreator.OUTLIER_THRESHOLD));
}
run(getConf(), input, clusters, output, convergenceDelta, maxIterations, runClustering,
clusterClassificationThreshold, runSequential);
return 0;
//参数
1) Path Input : 所有待聚类的数据点的路劲,参数不可缺
2) Path clusters :存储每个簇中心的路劲,参数不可缺
3) Path output :聚类结果存储的路劲,参数不可缺,如果指定了簇的个数,则该路劲下文件可为空
4) DistanceMeasure measure :数据点间的距离计算方法,参数可缺,默认是 SquaredEuclidean 算方法
提供参数值: ChebyshevDistanceMeasure 切比雪夫距离
CosineDistanceMeasure 余弦距离
EuclideanDistanceMeasure 欧氏距离
MahalanobisDistanceMeasure 马氏距离
ManhattanDistanceMeasure 曼哈顿距离
MinkowskiDistanceMeasure 闵可夫斯基距离
SquaredEuclideanDistanceMeasure 欧氏距离 ( 不采取平方根 )
TanimotoDistanceMeasure Tanimoto 系数距离
还有一些基于权重的距离计算方法:
WeightedDistanceMeasure
WeightedEuclideanDistanceMeasure 、 WeightedManhattanDistanceMeasure
5) Double convergenceDelta: 收敛系数 新的簇中心与上次的簇中心的的距离不能超过 convergenceDelta ,如果超过,则继续迭代,否则停止迭代。参数可缺,默认值是 0.5
6) int maxIterations : 最大迭代次数,如果迭代次数小于 maxIterations ,继续迭代,否则停止跌打,与 5) 中的convergenceDelta 满足任何一个停止迭代的条件,则停止迭代。参数不可缺。
7) boolean runClustering :如果是 true 则在计算簇中心后,计算每个数据点属于哪个簇,否则计算簇中心后结束,参数可缺,默认为 true
8) clusteringOption :采用单机或者 Map/Reduce 的方法计算。参数可缺,默认是 mapreduce 。
9) int numClustersOption :簇的个数,参数可缺。
-----未完
- 02storm聚类尝试kmeans
- KMEANS聚类算法
- KMeans聚类算法
- kmeans聚类算法
- Kmeans 文本聚类
- Kmeans聚类算法
- Kmeans聚类算法
- kmeans 聚类算法
- Kmeans 聚类算法
- kmeans聚类练习
- KMeans聚类算法
- kmeans聚类算法
- KMeans聚类算法
- kmeans聚类算法
- 聚类系列-KMEANS
- KMeans聚类过程
- KMeans聚类算法
- KMeans聚类算法
- C# ref与out 引用和传值的区别
- 记一次dell R720服务器ESXI5.5系统宕机的奇葩经历
- 循环-02. 计算圆周率(15)
- 程序员保持快乐活跃的6个好习惯
- Android Scroller的滚动实现原理
- 02storm聚类尝试kmeans
- @property和@synthesize可以自动生成某个类成员变量的存取方法
- Java基础之集合类
- 等待已久,她终于来了!
- 华为面试题:一元多项式的化简 C语言实现源码
- eatcms网站订餐手机微信等功能亮相
- 如何提高网站在百度搜索的排名
- opencv基本数据结构
- 挑战GCJ的题目: crazy row