optics算法

1 簡介

       隨着數據爆發式增長,分析數據從而提取隱藏在數據中的信息變的越來越重要。聚類分析是數據分析的一個主要方法,聚類(clustering)是將數據對象進行分類的過程,使同一類中的對象之間具有很高的相似度,而不同類中的對象高度相異。與分類不同,聚類不依賴預先定義的類和類標號,屬於觀察式學習。簡而言之,在聚類中,分類的標準和類型數量均是未知的。
        近來聚類分析算法得到了相當多的關注。傳統的聚類分析算法存在三個問題。第一,需要輸入參數,並且輸入參數難以獲取。第二,算法對輸入參數特別敏感,設置的細微不同可能導致差別很大的聚類。第三,高維數據集常常具有非常傾斜的分佈,全局密度參數不能刻畫內置的聚類結構。
       如圖1所示,我們不能依靠一個唯一的密度參數同時識別A B C1 C2和C3。我們只能同時識別{A,B,C}或者{C1,C2,C3}。在第二種情況下,A和B中的對象都被認爲是噪聲。

爲了解決上述問題,我們提出一種新聚類算法,即OPTICS算法,OPTICS是ordering point to idenfy the cluster structure縮寫。OPTICS算法不顯示地產生數據聚類,它只是對數據對象集中的對象進行排序,輸出一個有序的對象列表(cluster-ordering)。cluser-ordering包含了足夠的信息用來提取聚類,即對對象進行分類。和傳統的聚類算法相比,OPTICS算法的最大優點是對輸入參數不敏感。

2 基本概念

【定義0】
給定對象半徑ε內的鄰域稱爲該對象的ε鄰域。
如果對象的ε鄰域至少包含最小數據MinPts的對象,則該對象稱爲核心對象。
【定義1】p到q直接密度可達
1) p到q的距離小於ε。
2) p的ε鄰域內的對象的數量 ≥ MinPts。滿足此條件的對象稱爲核心對象。
【定義2】p到q密度可達
存在p1, ..., pn, p1 = p, pn = q,其中pi到pi+1是直接密度可到。
【定義3】p和q密度相通
存在一個對象o,p和q都是從o密度可達的。
【定義4】聚類和噪聲
,, C是一個聚類如果滿足如下條件:
1) 最大化
,如果且p到q密度可達,則
2) 連通性
,則p到q是密度相通的。
噪聲:不屬於任何聚類的對象。
【定義5】對象p的核心距離

【定義6】可達距離

3 OPTCIS算法

OPTICS算法生成一個有序對象列表,每個對象擁有兩個屬性,核心距離和可達距離。利用這個列表,可以獲得任何領域半徑小於的聚類。

/*

*功能:對數據集合SetOfObjects中的對象進行排序

*輸入參數

*@SetOfObjects 待分析的數據集合

*@ε 鄰域半徑

*@MinPts 若對象的ε 鄰域內的對象數量>=MinPts,則此對象爲核心對象

*輸出參數

*@OrderedFile 已經排好序的對象列表

*/

OPTICS (SetOfObjects, ?, MinPts, OrderedFile)
    OrderedFile.open();
    FOR i FROM 1 TO SetOfObjects.size DO
        Object := SetOfObjects.get(i);
        IF NOT Object.Processed THEN
            ExpandClusterOrder(SetOfObjects, Object, ?,MinPts, OrderedFile)
    OrderedFile.close();
END; // OPTICS

ExpandClusterOrder(SetOfObjects, Object, ?, MinPts,OrderedFile);
    neighbors := SetOfObjects.neighbors(Object, ?);
    Object.Processed := TRUE;
    Object.reachability_distance := UNDEFINED;
    Object.setCoreDistance(neighbors,??, MinPts);
    OrderedFile.write(Object);
    IF Object.core_distance <> UNDEFINED THEN
        //OrderSeeds是優先級隊列,可達距離越小,優先級越高
        OrderSeeds := NULL;
        UpdateSeeds(OrderSeeds, neighbors, Object);
        
        WHILE NOT OrderSeeds.empty() DO    
            currentObject := OrderSeeds.next();
            neighbors:=SetOfObjects.neighbors(currentObject, ?);
            currentObject.Processed := TRUE;
            currentObject.setCoreDistance(neighbors, ?, MinPts);
            OrderedFile.write(currentObject);
            IF currentObject.core_distance<>UNDEFINED THEN
                UpdateSeeds(OrderSeeds, neighbors, currentObject);
END; // ExpandClusterOrder

UpdateSeeds(OrderSeeds,neighbors,coreObject)
    for(n:neighbors)
        if n.Processed
            continue;
        iNewReachDistacnce := reachability_distance between coreObject with n
        if n.reachability_distance == UNDEFINED
            n.reachability_distance = iNewReachDistacnce;
            OrderSeeds.insert(n);
        else if iNewReachDistacnce < n.reachability_distance
        	  OrderSeeds.remove(n);
        	  n.reachability_distance = iNewReachDistacnce;
        	  OrderSeeds.insert(n);
END; //UpdateSeeds


上面的算法是有bug的。假如:D={ b,e,f,g,a,c,d} ,其中a是核心對象,b/c/d到a的歐幾里得距離均爲,e/f/g均爲噪聲,e到b的歐幾里得距離小於,如果按照上述的算法輸出可能爲b,e,a,c,d,f,g,這顯然是錯誤的。下面是我改進後的算法:

 

---------------------------------------------------------------------START-----------------------------------------------------------------

ExpandClusterOrder(SetOfObjects, Object,?, MinPts,OrderedFile);

neighbors := SetOfObjects.neighbors(Object,?);

Object.reachability_distance := UNDEFINED;

Object.setCoreDistance(neighbors,??, MinPts);

IF Object.core_distance <> UNDEFINED THEN//只處理核心對象

Object.Processed := TRUE;

OrderedFile.write(Object);

OrderSeeds.update(neighbors, Object);

WHILE NOT OrderSeeds.empty() DO//可達距離小的對象優先處理

currentObject := OrderSeeds.next();

neighbors:=SetOfObjects.neighbors(currentObject,?);

currentObject.Processed := TRUE;

currentObject.setCoreDistance(neighbors,?, MinPts);

OrderedFile.write(currentObject);

IF currentObject.core_distance<>UNDEFINED THEN

OrderSeeds.update(neighbors, currentObject);

END; // ExpandClusterOrder

---------------------------------------------------------------------END-----------------------------------------------------------------

 

如下算法是從OPTICS算法輸出的有序列表中獲取聚類的算法,結果與DBSCAN算法是一樣的。

 

---------------------------------------------------------------------END-----------------------------------------------------------------

/*

*功能:從OPTICS輸出的有序列表中,抽取聚類

*@ClusterOrderedObjs OPTICS輸出的有序列表

*@?'?'??

*@MinPtsOPTICS算法中的值相等

*/

// Precondition: ?' ??generating dist??for ClusterOrderedObjs

ExtractDBSCAN-Clustering (ClusterOrderedObjs,?', MinPts)

ClusterId := NOISE;

FOR i FROM 1 TO ClusterOrderedObjs.size DO

Object := ClusterOrderedObjs.get(i);

IF Object.reachability_distance???' THEN

// UNDEFINED >?

IF Object.core_distance???' THEN

ClusterId := nextId(ClusterId);

Object.clusterId := ClusterId;

ELSE

Object.clusterId := NOISE;//本對象不輸入任何聚類,是噪聲

ELSE // Object.reachability_distance???'

Object.clusterId := ClusterId;

END; // ExtractDBSCAN-Clustering

---------------------------------------------------------------------END-----------------------------------------------------------------

 

4 圖形化和輸入參數

4.1 圖形化

可達距離曲線非常直觀的呈現了對象的分佈,見圖9。    圖9和圖10中的3個曲線基於同一數據集,但是輸入參數不同,我們可以直觀的看到3個圖的形狀基本相同。由此可見,可達距離曲線對輸入參數和MinPts不敏感。

4.2輸入參數

的選取】

越小,可達距離爲undefined的對象越多,即忽略了低密度的聚類。下面是確定的方法之一。雖然OPTICS算法不敏感,我們還是需要輸入參數,該如何確定?

 

我們可以假設集合D中對象是均勻分佈,d表示集合D的維度數量,表示D的容積,若d爲2,表示面積,若d爲3,表示體積;N表示D中對象的數量。

其中:

 

【MinPts的選取】

MinPts越小,圖形越呈鋸齒狀;反之,圖形越光滑。MinPts的經驗值是10到20。

5 獲取nature聚類

5.1 聚類與可達距離曲線

    圖16是OPTICS算法輸出的有序對象的可達距離曲線。聚類是曲線凹下去的區域。我們可以認爲#3對象到#16對象屬於一個聚類。需要注意的#3對象,它是前面連續區域最後一個高可達距離的對象,高可達距離意味着#3和對象#1,#2的距離遠,它和#4對象的距離是比較近的。

    在真實的對象集合中,聚類的邊界不總是有着較大傾斜度的對象。如圖17,第一個聚類的開始和結尾的傾斜度非常大,第二聚類的結尾部分的傾斜度較小。

5.2 定義

假設OPTICS算法輸出了有序對象集合[1…n],這裏用序號代表對象。r(p)表示有序類表中的第p個對象的可達距離,r(p+1)表示有序類表中的第p+1個對象的可達距離。是傾斜因子,取值範圍(0,1)。

 

【定義9】傾斜點

向上傾斜點

向下傾斜點

注:論文中是錯的。

 

【定義10】傾斜區域

向上傾斜區域()

如果滿足如下條件則稱爲向上傾斜區域。注:可能只包含一個對象

s 是向上傾斜點

e是向上傾斜點

I中不存在這種情形:連續非向上傾斜點的數量大於MinPts

●最大化:

 

向下傾斜區域()

定義類似向上傾斜區域。

 

【定義11】聚類

C = ?s??e?????1??n?,若C滿足如下條件,則C是一個聚類。

 

5.3 獲取nature聚類算法

我們可以通過定義11輕鬆的獲取算法。通過分解定義11中的第4個條件,可以提高算法的性能。

6下一步研究

1 大數據量下的性能提高

2 支持增量式計算

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章