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輸出的有序列表
*@?'?'??
*@MinPts與OPTICS算法中的值相等
*/
// 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 支持增量式計算