2012-08-09 12 views

回答

1

关于开源软件的一个伟大的事情是,你可以找出软件的工作原理。下面的代码显示了HierarchicalClusterer算法的Weka's source code,更具体地,它显示了实现COMPLETEADJCOMPLETE功能的部分。所不同的是如下:

  • 就像COMPLETE联动方法,计算来自第1组的一个节点和从群集2中的一个节点之间的最大距离,并存储这在fBestDist
  • 然后,找到之间的最大距离簇1或第2组,并存储在这个fMaxDist
  • 内的节点最后从fBestDist

所以计算两个簇之间的距离减去fMaxDist使用ADJCOMPLETE作为linkType对应于COMPLETE距离减去或者群集1或群集内2个节点之间的最大距离2.

Adjusted Complete-Link在以下paper提出:

塞潘达尔·卡玛瓦尔,丹Klein和克里斯托弗曼宁(2002年)。 使用基于模型的方法解释和扩展古典凝聚聚类算法。在机器学习的第19届国际会议(ICML-2002)

论文集据它(4.2节),Adjusted Complete-LinkComplete-Link应该如果有不同半径的集群中使用的版本(见图10)。

case COMPLETE: 
case ADJCOMLPETE: 
    // find complete link distance aka maximum link, which is the largest distance between 
    // any item in cluster1 and any item in cluster2 
    fBestDist = 0; 
    for (int i = 0; i < cluster1.size(); i++) { 
    int i1 = cluster1.elementAt(i); 
    for (int j = 0; j < cluster2.size(); j++) { 
     int i2 = cluster2.elementAt(j); 
     double fDist = fDistance[i1][i2]; 
     if (fBestDist < fDist) { 
     fBestDist = fDist; 
     } 
    } 
    } 
    if (m_nLinkType == COMPLETE) { 
    break; 
    } 
    // calculate adjustment, which is the largest within cluster distance 
    double fMaxDist = 0; 
    for (int i = 0; i < cluster1.size(); i++) { 
    int i1 = cluster1.elementAt(i); 
    for (int j = i+1; j < cluster1.size(); j++) { 
     int i2 = cluster1.elementAt(j); 
     double fDist = fDistance[i1][i2]; 
     if (fMaxDist < fDist) { 
     fMaxDist = fDist; 
     } 
    } 
    } 
    for (int i = 0; i < cluster2.size(); i++) { 
    int i1 = cluster2.elementAt(i); 
    for (int j = i+1; j < cluster2.size(); j++) { 
     int i2 = cluster2.elementAt(j); 
     double fDist = fDistance[i1][i2]; 
     if (fMaxDist < fDist) { 
     fMaxDist = fDist; 
     } 
    } 
    } 
    fBestDist -= fMaxDist; 
    break; 
+1

是的,谢谢您的快速回复! – 2012-08-10 07:59:43