semeee 2015-05-13 07:44 采纳率: 0%
浏览 951

Kmeans算法初学者,想请教大神,编程不怎么强麻烦解释下谢谢

    List<ArrayList<Double>> centers = new ArrayList<ArrayList<Double>>();  
    List<ArrayList<Double>> newCenters = new ArrayList<ArrayList<Double>>();  
    List<ArrayList<ArrayList<Double>>> helpCenterList = new ArrayList<ArrayList<ArrayList<Double>>>();  

    //读入原始数据  
    BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("wine.txt")));  
    String data = null;  
    List<ArrayList<Double>> dataList = new ArrayList<ArrayList<Double>>();  
    while((data=br.readLine())!=null){  
        //System.out.println(data);  
        String []fields = data.split(",");  
        List<Double> tmpList = new ArrayList<Double>();  
        for(int i=0; i<fields.length;i++)  
            tmpList.add(Double.parseDouble(fields[i]));  
        dataList.add((ArrayList<Double>) tmpList);  
    }  
    br.close();  

    //随机确定K个初始聚类中心  
    Random rd = new Random();  
    int k=3;  
    int [] initIndex={59,71,48};  
    int [] helpIndex = {0,59,130};  
    int [] givenIndex = {0,1,2};  
    System.out.println("random centers' index");  
    for(int i=0;i<k;i++){  
        int index = rd.nextInt(initIndex[i]) + helpIndex[i];  
        //int index = givenIndex[i];  
        System.out.println("index "+index);  
        centers.add(dataList.get(index));  
        helpCenterList.add(new ArrayList<ArrayList<Double>>());  
    }     

    /* 
            楼主好,我想问这段代码是什么意思?
  • 写回答

1条回答 默认 最新

  • 请输入昵称.. 2019-04-30 17:43
    关注

    1)对于K-Means算法,首先要注意的是k值的选择,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什么先验知识,则可以通过交叉验证选择一个合适的k值。

        2)在确定了k的个数后,我们需要选择k个初始化的质心,就像上图b中的随机质心。由于我们是启发式方法,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心,最好这些质心不能太近。

        好了,现在我们来总结下传统的K-Means算法流程。 

        输入是样本集D={x1,x2,...xm},聚类的簇树k,最大迭代次数N

        输出是簇划分C={C1,C2,...Ck} 

        1) 从数据集D中随机选择k个样本作为初始的k个质心向量: {μ1,μ2,...,μk}
        2)对于n=1,2,...,N

          a) 将簇划分C初始化为Ct=∅t=1,2...k
          b) 对于i=1,2...m,计算样本xi和各个质心向量μj(j=1,2,...k)的距离:dij=||xi−μj||22,将xi标记最小的为dij所对应的类别λi。此时更新Cλi=Cλi∪{xi}
          c) 对于j=1,2,...,k,对Cj中所有的样本点重新计算新的质心μj=1|Cj|∑x∈Cjx
          e) 如果所有的k个质心向量都没有发生变化,则转到步骤3)

        3) 输出簇划分C={C1,C2,...Ck}

    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值