1. 程式人生 > >層次聚類之AGNES演算法和DIANA演算法

層次聚類之AGNES演算法和DIANA演算法

轉載自:http://blog.csdn.net/hwwn2009/article/details/38331577

層次聚類的基本概念
 層次聚類方法是古老而且常用的聚類方法。層次聚類方法又有兩種產生層次聚類的基本方法。
凝聚的:該方法是自底向上的方法,初始每個物件看做一個簇,每一步合併最相近的簇,最終形成一個簇。
分類的:該方法是自頂向下的方法,從包含的所有點的簇開始,每一步分裂一個簇,知道僅剩下單點的簇。

2 簇之間的鄰近性
在凝聚的層次聚類方法中,需要定義簇之間的相近性。有許多凝聚層次的聚類技術,本文中介紹單鏈、全鏈、組平均。

單鏈:
該方法中兩個簇的鄰近度定義為兩個不同簇中任意兩點之間的最短距離。單鏈技術擅長處理非橢圓形的簇,但是對噪音和離群點很敏感。

兩個簇之間的相似度計算公式為:

dist({m1,m2},{m3,m4})=min(dist(m1,m3),dist(m1,m4),dist(m2,m3),dist(m2,m4))

全鏈:
該方法中兩個簇的鄰近度定義為兩個不同簇中任意兩點之間的最長距離。單鏈技術擅長處理圓形的簇,但是對噪音和離群點不太敏感。
兩個簇之間的相似度計算公式為:
dist({m1,m2},{m3,m4})=max(dist(m1,m3),dist(m1,m4),dist(m2,m3),dist(m2,m4))

組平均:
該方法中兩個簇的鄰近度定義為兩個不同簇中任意兩點之間的平均距離。該方法是位於單鏈和全鏈之間的這種方法。

兩個簇之間的相似度計算公式為:

dist({m1,m2},{m3,m4})=(dist(m1,m3)+dist(m1,m4)+dist(m2,m3)+dist(m2,m4))/4

AGNES演算法

       AGNES(Agglomerative Nesting) 是凝聚的層次聚類演算法,如果簇C1中的一個物件和簇C2中的一個物件之間的距離是所有屬於不同簇的物件間歐式距離中最小的,C1和C2可能被合併。這是一種單連線方法,其每個簇可以被簇中的所有物件代表,兩個簇之間的相似度由這兩個簇中距離最近的資料點對的相似度來確定。

       演算法描述:

              輸入:包含n個物件的資料庫,終止條件簇的數目k

              輸出:k個簇

(1)       將每個物件當成一個初始簇

(2)       Repeat

(3)                根據兩個簇中最近的資料點找到最近的兩個簇

(4)                合併兩個簇,生成新的簇的集合

(5)       Until達到定義的簇的數目

       演算法效能:

(1)       簡單,但遇到合併點選擇困難的情況。

(2)       一旦一組物件被合併,不能撤銷

(3)       演算法的複雜度為O(n的平方),不適合大資料集計算

DIANA演算法

       DIANA(Divisive Analysis)演算法屬於分裂的層次聚類,首先將所有的物件初始化到一個簇中,然後根據一些原則(比如最鄰近的最大歐式距離),將該簇分類。直到到達使用者指定的簇數目或者兩個簇之間的距離超過了某個閾值。

       DIANA用到如下兩個定義:

(1)       簇的直徑:在一個簇中的任意兩個資料點都有一個歐氏距離,這些距離中的最大值是簇的直徑

(2)       平均相異度(平均距離):

       演算法描述:

              輸入:包含n個物件的資料庫,終止條件簇的數目k

              輸出:k個簇,達到終止條件規定簇數目

(1)       將所有物件整個當成一個初始簇

(2)       For ( i=1;i!=k;i++) Do Begin

(3)         在所有簇中挑選出具有最大直徑的簇;

(4)           找出所挑出簇裡與其他點平均相異度最大的一個點放入splinter group,剩餘的放入old party中。

(5)           Repeat

(6)             在old party裡找出到splinter group中點的最近距離不大於old party中點的最近距離的點,並將該點加入splinter group

(7)           Until 沒有新的old party的點被分配給splinter group;

(8)       Splinter group 和old party為被選中的簇分裂成的兩個簇,與其他簇一起組成新的簇集合

(9)       END

       演算法效能:

              缺點是已做的分裂操作不能撤銷,類之間不能交換物件。如果在某步沒有選擇好分裂點,可能會導致低質量的聚類結果。大資料集不太適用。

缺點:

傳統的層次聚類演算法的效率比較低 O(tn2 ) t: 迭代次數 n: 樣本點數,最明顯的一個缺點是不具有再分配能力,即如果樣本點 A 在某次迭代過程中已經劃分給類簇 C1 ,那麼在後面的迭代過程中 A 將永遠屬於類簇 C1 ,這將影響聚類結果的準確性。


其他演算法

       層次聚類方法比較簡單,但是經常遇到的一個問題,就是在合併或分裂點選擇困難的問題。一個有希望的改進方向是將層級聚類和其他聚類技術進行整合,形成多階段聚類。

(1)       BIRCH演算法

       BIRCH(利用層次方法的平衡迭代規約和聚類)是一個總和的層次聚類方法,

(2)       CURE演算法


----------------貼上本人實現的AGENES演算法,大家有興趣可以把DIANA演算法自己實現下-------------- -

  1. package com.agenes;  
  2. publicclass DataPoint {  
  3.     String dataPointName; // 樣本點名
  4.     Cluster cluster; // 樣本點所屬類簇
  5.     privatedouble dimensioin[]; // 樣本點的維度
  6.     public DataPoint(){  
  7.     }  
  8.     public DataPoint(double[] dimensioin,String dataPointName){  
  9.          this.dataPointName=dataPointName;  
  10.          this.dimensioin=dimensioin;  
  11.     }  
  12.     publicdouble[] getDimensioin() {  
  13.         return dimensioin;  
  14.     }  
  15.     publicvoid setDimensioin(double[] dimensioin) {  
  16.         this.dimensioin = dimensioin;  
  17.     }  
  18.     public Cluster getCluster() {  
  19.         return cluster;  
  20.     }  
  21.     publicvoid setCluster(Cluster cluster) {  
  22.         this.cluster = cluster;  
  23.     }  
  24.     public String getDataPointName() {  
  25.         return dataPointName;  
  26.     }  
  27.     publicvoid setDataPointName(String dataPointName) {  
  28.         this.dataPointName = dataPointName;  
  29.     }  
  30. }  
  31. package com.agenes;  
  32. import java.util.ArrayList;  
  33. import java.util.List;  
  34. publicclass Cluster {  
  35.     private List<DataPoint> dataPoints = new ArrayList<DataPoint>(); // 類簇中的樣本點
  36.     private String clusterName;  
  37.     public List<DataPoint> getDataPoints() {  
  38.         return dataPoints;  
  39.     }  
  40.     publicvoid setDataPoints(List<DataPoint> dataPoints) {  
  41.         this.dataPoints = dataPoints;  
  42.     }  
  43.     public String getClusterName() {  
  44.         return clusterName;  
  45.     }  
  46.     publicvoid setClusterName(String clusterName) {  
  47.         this.clusterName = clusterName;  
  48.     }  
  49. }  
  50. package com.agenes;  
  51. import java.util.ArrayList;  
  52. import java.util.List;  
  53. publicclass ClusterAnalysis {  
  54.   public List<Cluster> startAnalysis(List<DataPoint> dataPoints,int ClusterNum){  
  55.       List<Cluster> finalClusters=new ArrayList<Cluster>();  
  56.       List<Cluster> originalClusters=initialCluster(dataPoints);  
  57.       finalClusters=originalClusters;  
  58.       while(finalClusters.size()>ClusterNum){  
  59.           double min=Double.MAX_VALUE;  
  60.           int mergeIndexA=0;  
  61.           int mergeIndexB=0;  
  62.           for(int i=0;i<finalClusters.size();i++){  
  63.               for(int j=0;j<finalClusters.size();j++){  
  64.                   if(i!=j){  
  65.                       Cluster clusterA=finalClusters.get(i);  
  66.                       Cluster clusterB=finalClusters.get(j);  
  67.                       List<DataPoint> dataPointsA=clusterA.getDataPoints();  
  68.                       List<DataPoint> dataPointsB=clusterB.getDataPoints();  
  69.                       for(int m=0;m<dataPointsA.size();m++){  
  70.                           for(int n=0;n<dataPointsB.size();n++){  
  71.                               double tempDis=getDistance(dataPointsA.get(m),dataPointsB.get(n));  
  72.                               if(tempDis<min){  
  73.                                   min=tempDis;  
  74.                                   mergeIndexA=i;  
  75.                                   mergeIndexB=j;  
  76.                               }  
  77.                           }  
  78.                       }  
  79. 相關推薦

    層次AGNES演算法DIANA演算法

    轉載自:http://blog.csdn.net/hwwn2009/article/details/38331577 層次聚類的基本概念  層次聚類方法是古老而且常用的聚類方法。層次聚類方法又有兩種產生層次聚類的基本方法。 凝聚的:該方法是自底向上的方法,初始每個物

    層次AGNES及Python實現

    層次聚類 層次聚類,顧名思義,就是一層一層的進行聚類,它試圖在不同層次對資料集進行劃分,可以由上向下把大的類別分割,即“自頂向下”的分拆策略(見下面AGNES部分),也可以由下向上對小的類別進行聚合,即“自底向下”的聚合策略:開始把所有的樣本都歸為一類,然後逐

    機器學習sklearn19.0演算法——層次AGNES/DIANA)、密度(DBSCAN/MDCA)、譜

    一、層次聚類 BIRCH演算法詳細介紹以及sklearn中的應用如下面部落格連結: http://www.cnblogs.com/pinard/p/6179132.html http://www.cnblogs.com/pinard/p/62

    凝聚法層次ward linkage method

    function hiera term span cal true 計算 新增 總結 凝聚法分層聚類中有一堆方法可以用來算兩點(pair)之間的距離:歐式,歐式平方,manhattan等,還有一堆方法可以算類(cluster)與類之間的距離,什麽singl

    分析(K-means 層次基於密度DBSCAN演算法三種實現方式)

    之前也做過聚類,只不過是用經典資料集,這次是拿的實際資料跑的結果,效果還可以,記錄一下實驗過程。 首先: 確保自己資料集是否都完整,不能有空值,最好也不要出現為0的值,會影響聚類的效果。 其次: 想好要用什麼演算法去做,K-means,層次聚類還是基於密

    演算法層次

    一、原型聚類和層次聚類原型聚類也稱基於原型的聚類(prototype-based clustering),這類演算法假設聚類結構能夠通過一組原型刻畫,先對原型進行初始化,然後對原型進行迭代更新求解。採用不同的原型表示、不同的求解方式,產生不同的演算法。常用的原型聚類演算法有k

    機器學習演算法層次

    層次聚類也叫連通聚類方法,有兩個基本方法:自頂而下和自底而上。自頂而將所有樣本看做是同一簇,然後進行分裂。自底而上將初所有樣本看做不同的簇,然後進行凝聚。這種聚類的中心思想是:離觀測點較近的點相比離觀測點較遠的點更可能是一類。 這種方法首先會生成下面的樹

    機器學習層次演算法

            層次聚類(Hierarchical Clustering)是對給定資料集在不同層次進行劃分,形成樹形的聚類結構,直到滿足某種停止條件為止。資料集的劃分可採用自底向上或自頂向下的劃分策略。1、凝聚的層次聚類演算法AGNES        AGNES(AGglom

    【再回首Python美】【矩陣】求矩陣中最大元素/最小元素的行列座標 For 層次演算法Hierarchical Clustering Alg

    求多維矩陣中最小元素的行列座標,這個在層次聚類演算法中用到,這裡實現記錄一下。1.簡介矩陣M: [[1 3 2] [2 6 0] [9 8 5]]最大元素是9,對應的行列座標為(2,0)最小元素是

    分析層次演算法

    層次聚類演算法: 前面介紹的K-means演算法和K中心點演算法都屬於劃分式(partitional)聚類演算法。層次聚類演算法是將所有的樣本點自底向上合併組成一棵樹或者自頂向下分裂成一棵樹的過程,這兩種方式分別稱為凝聚和分裂。 凝聚層次演算法: 初始階段,將每個樣本點分別

    層次演算法偽碼matlab演算法

    1. 層次聚類 層次聚類演算法與之前所講的順序聚類有很大不同,它不再產生單一聚類,而是產生一個聚類層次。說白了就是一棵層次樹。介紹層次聚類之前,要先介紹一個概念——巢狀聚類。講的簡單點,聚類的巢狀與程式的巢狀一樣,一個聚類中R1包含了另一個R2,那這就是R2巢狀在R1中

    K均值EM演算法

    這篇部落格整理K均值聚類的內容,包括: 1、K均值聚類的原理; 2、初始類中心的選擇和類別數K的確定; 3、K均值聚類和EM演算法、高斯混合模型的關係。   一、K均值聚類的原理 K均值聚類(K-means)是一種基於中心的聚類演算法,通過迭代,將樣本分到K個類中,使得每個樣本與其所屬類

    【轉】使用scipy進行層次k-means

    歐氏距離 generate https then con method 感覺 long average scipy cluster庫簡介 scipy.cluster是scipy下的一個做聚類的package, 共包含了兩類聚類方法: 1. 矢量量化(scipy.cluste

    演算法(4)--Hierarchical clustering層次

    目錄   一、層次聚類 1、層次聚類的原理及分類 2、層次聚類的流程 3、層次聚類的優缺點 二、python實現 1、sklearn實現 2、scipy實現 樹狀圖分類判斷 一、層次聚類 1、層次聚類的原理及分類 1)層次法(Hierar

    機器學習agglomerative_clustering-層次

    機器學習之agglomerative_clustering-層次聚類 # -*- coding: utf-8 -*- """ Created on Wed Nov 28 19:07:54 2018 @author: muli """ import numpy as

    利用層次演算法進行基於基站定位資料的商圈分析

    本文轉自:https://blog.csdn.net/bf02jgtrs00xktcx/article/details/79386662 1.背景與挖掘目標 1.1 背景 隨著個人手機和網路的普及,手機已經基本成為所有人必須持有的工具。 根據手機訊號再地理空間的

    層次演算法原理

    層次聚類演算法的原理及實現Hierarchical Clustering 2016年4月19日 BY 藍鯨 5 COMMENTS 層次聚類(Hierarchical Clustering)是聚類演算法的一種,通過計算不同類別資料點間的相似度來建立一棵有層次的巢狀聚類樹。在

    原型(一)k均值演算法python實現

    原型聚類 原型聚類演算法假設聚類結構能通過一組原型刻畫,在現實聚類任務中極為常用。通常情形下,演算法先對原型進行初始化,然後對原型進行迭代更新求解。這裡的“原型”我認為實際上就是“原來的模型”,這類演算法企圖模擬出生成資料集的模型。 k均值演算法(k-means

    K-means演算法

      聚類是一種無監督學習,讓相似的作為一類,不相似的當然不能歸為一類.非常符合我們日常的認知行為.據悉,大多數聚類問題都是NP完全問題,即不存在能夠找到全域性最優解的有效解法.我們常常是將可能的聚類情況定義一個代價函式,問題就轉化為尋找一個代價最小的劃分,變成了

    演算法實踐(一)——層次、K-means

    因為百度雲的文章裡面有些圖片丟失了,想起這篇東西之前被一箇中國統計網轉發過,所以自己搜了一下想直接把圖搞回來,結果發現到處轉載的也有不少,自己現在發倒好像是抄襲似的。其實這篇文章裡面特別有價值的東西不算太多,PCCA算是一個知道的人不多而且也挺有意義的演算法,譜