hadoop/spark k均值聚类

13 篇文章 0 订阅

// k 期望的簇数

//delta 可接受的收敛误差

//data 输入数据

kmeans(k,delta,data){

//初始化簇质心

initial_centroids=pick(k,data);

//利用这个方法向映射器广播中心

writeToHDFS(initial_centroids);

//必要时迭代

current_centroids=initial_centroids;

while(true){

 //theMapReduceJob完成2个任务

//map中使用current_centroids

//reduce创建new_centroids 并写到hdfs

 theMapReduceJob();

new_centriods=readFromHDFS();

if change(new_centriods,current_centriods)<=delta{break;}

else{current_centroids=new_centroids}

 }

result=readFromHDFS();

return result;

 

}

 

map()使用质心把各个点分配到最近的中心,输出(clusterID,vector)键值对

public class KmeansMapper...{

 private List<Vector> centers=null;

private List<Vector> readCentersFromSequenceFile(){

 //从sequenceFile中读取簇质心,是一个键值对组合

}

public void setup(Context context){

this.centers=readCentersfRromSequenceFile();

}

//key由MapReduce生成可忽略,value为d唯向量

map(Object key,Vector value){

  Vector nearest=null;

 double nearestDistance=Double.MAX_VALUE;

for(Vector center: centers){

  double distance =EuclideanDistance.calculateDistance(center,value);

 if (nearst==null){

    nearest=center;

     nearestDistance=distance;}

else{

   if (nearestDistance >distance){

             nearset=center;

             nearestDistance=distance;}

 }

 }

  }

emit(nearest,value);

}

combine() 累加向量对象各个维的值

combine(Vector key, Iterable<Vector> values){

Vector sum=new Vector();

for(Vector value:values){

 for (int i; i<value.length; i++){sum[i] +=value[i]}}

}

emit(key, sum);

}

reduce()生成新的簇平均值输出(clusterid, centroid)

reduce(Vector key, Iterable<Vector> values){

Vector newCenter = new Vector();

 int count=0;

for(Vector value:values){

count++;

   for( int i =0; i<value.length;i++){

       newCenter[i]+=value[i];}

        }

  for ( int i =0; i<key.length; i++){

    newCenter[i]=newCenter[i]/count;

       }

  emit(key.ID,newCenter);

}

 

 

spark MLlib类提供了常用的机器学习方法

public final class JavaKMeans{

         public static void main(String[] args){

               SparkConf conf=new SparkConf().setAppName("javakmeans");

                JavaSparkContext sc=new JavaSparkContext(conf);

               JavaRDD<String> lines=sc.textFile("",1);

                JavaRDD<Vector> points=lines.map(new ParsePoint());

               KMeansModel model=KMeans.train(points.rdd(),k,iterations,runs,KMeans.K_MEANS_PARALLEL());

              System.out.println("cluster centers");

             for (Vector center:model.clusterCenters()){

                        System.out.println(""+center);

                  }

                  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值