2012-08-09 93 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