生活随笔
收集整理的這篇文章主要介紹了
一种基于邻域的聚类算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基本概念:
給定數據集D = {d1,d2 ,..?,dn},p和q是D中的兩個任意對象。我們使用歐氏距離來評估p和q之間的距離,表示為 dist(p,q)。 我們將首先給出k-最近鄰集合和反向的定義k-最近鄰集合。 盡管學術中給出了類似的定義, 我們把它們放在這里以方便讀者理解我們的新算法。
下面是算法需要用到的以下定義:
定義1:(kNN) k近鄰p的集合是k(k>0)的集合,由kNN(p)表示,換句話說,kNN(p)是D數據集中組成的一個集合對象。 |kNN(p)| = k; 和'分別是的第k和第k+1最近鄰,則 定義2:(反向k近鄰的集合,或者簡稱為R-kNN).p的反向k近鄰集合屬于kNN包含p的集合,命名為R-kNN。 請注意在學術中,反向kNN通常是簡稱為RNN,這里使用的是R-kNN而不是RNN,因為每個RNN集合都是在確定的k值基礎上。 kNN(p)和R-kNN(p)采用雙向去探索關于對象p和它的鄰近集合,一方面,kNN(p)是p自身的鄰近點組成的集合,另一方面,R-kNN(p)表示的鄰近結合點中包含p的點。這種雙向描述任意的關系物體及其鄰域給出了更清晰,更準確的位置圖 在本地和全局的數據集中,這取決于k的值,而不僅僅是使用kNN。 在下文中,我們將給出一個定義對象的鄰居。 定義3:(r近鄰,或者簡稱為rNB)。得到一個真實數字r,p的近鄰集合關于(其余部分簡稱?w.r.t)r的關系成為rNM(p),是集合對象位于以p作為圓的中心點,r為半徑的范圍內的點。 定義4:(k近鄰,簡稱kNB)。對于D數據集中的每個對象p,使得.該p的k近鄰被寫作kNB(p),被定義為r'NB(p), kNB(p) = r'NB(p).我們稱呼kNB(p)作為p的k近鄰kNN(p) 定義3和定義4定義從兩個不同角度定義兩個不同形式的近鄰:rNB(p)是被定義通過使用一個顯性半徑。相反,kNB(p)是被定義通過一個隱性半徑,它是相當于被圓的局域給覆蓋通過kNN(p)。很明顯因為可能有多個物體位于鄰域的邊緣(圓) 定義5:(反向k近鄰,簡稱R-kNB)。p是kNB包含p的對象集合,由R-kNB表示,可以寫成 同樣, 在數據集中的數據點能夠被專業分類成三類:密集點、稀疏點、均勻點。直觀的說,集群中的點是密集點或均勻點,集群邊上上的點最可能是疏松點。離散點和噪音也是疏松點,目前,大多數基于密度的聚類算法(eg.DBSCAN)使用使用一種直觀,直接的方法來測量密度,即數據對象密度是給定的鄰域中包含的數據對象的數量半徑。顯然,這是一種絕對和全局密度。這樣的密度測量使DBSCAN無法檢測小的、密集的簇 。 來自大而稀疏的星團。本文提出了一種新的測量方法密度:基于鄰域的密度因子 (或簡單的ndf),它將我們的新聚類算法NBC的基礎。 定義6:(基于鄰域的密度因子,或簡稱為NDF)p點的NDF求法如下: 那么NDF的定義是什么呢?讓我們來理解它:|kNB(p)|是數字p的k-最近鄰域中的對象,是數字包含在p的k-最近鄰域中的對象。對于大多數數據對象,這個值大約是k(根據定義4,它可能會更大,但不是小于k)。 | R-KNB(P)|是p反向k近鄰中包含的對象數鄰域,即將p作為其成員的對象的數量k-最近的鄰域。對于不同的數據點,該值非常不一致。 直觀地,更大的| R-kNB(p)|是,這意味著更多的其他對象將p作為他們k個最近鄰域的成員,即更密集的p 鄰域是,或更大的NDF(p)。在這種情況下,NDF(p)> 1. 對于均勻分布的點,如果q在kNB(p)中,則p最可能在kNB(q)中,因此,kNB(p)≈? R-kNB(p),即NDF(p)≈1。因此,NDF實際上是測量任何數據對象的鄰域或數據對象的密度相對(非絕對)意義上的局部密度。此外,這樣的測量是直觀(易于理解),簡單(易于實施)和有效(存在能夠找到DBSCAN無法檢測到的一些集群結構)。 為了證明NDF作為局部密度測量的能力,我們 舉一個圖1中的例子。圖1(a)是一個包含兩個簇C1、C2的數據集, 由圖可看出:C1中的數據均勻分布; C2中的數據符合高斯分布分配。 圖1(b)顯示了數據集中所有數據點的NDF值。 如我們可以看到,集群C1內的數據點大約有NDF值等于1,而位于C1邊界的數據點具有較小的NDF值。 對于群集C2,最密集的點靠近C2的質心,其具有最大的NDF值,而其他對象的NDF值較小,而且此外,從質心定位的點,它們的NDF值越小。使用NDF,在下文中,我們給出了三種類型數據的定義局部意義上的點:局部事件點,局部密集點和局部稀疏點。 定義7:(局部密集點,簡稱DP)對象P是局部密集點,如果它的NDF(P)大于1,我們也把p稱為與kNB(p)有關的密點,NDP(p)越大,p的k鄰域越密集。 定義8:(局部稀疏點,簡稱SP)p是局部稀疏點,如果它的NDF(p) < 1,我們稱p為kNB(p)的局部稀疏點.NDP(q)越小,k近鄰越稀疏。 定義9:(局部平均點,簡稱EP)p是局部平均點,如果它的NDF(p) = 1(或者接近于1),我們稱p為kNB(p)的局部平均點 根據上面定義的概念,下面我們將介紹基于鄰域的集群的概念。我們的定義遵循dbscan的方式。 定義10:(基于鄰域密度直接可達)從數據集D中得到p、q點,滿足一下要求,p是一個基于鄰域直接可達 q是一個DP或者EP 定義11:(領域可達)從數據集D中得到p、q點,p是一個領域可達來自q,如果有對象鏈p1,...,pn,p1=p,pn=q,這樣pi可以從pi+1鄰域可達 定義12:(基于鄰域緊密連接)從數據集D中得到p、q點,p和q是基于鄰域緊密連接,如果q是鄰域可達來自p,k或者q是鄰域可達來自p或者第三個對象o這樣p和q都是鄰域可達來自o 基于以上定義,現在我們能夠定義基于領域聚類的定義 定義13:(基于領域聚類)得到一個數據集D,集群C 關于?k是D的非空子集 集群中的p、q,p和q是鄰域可達 如果并且q是領域可達來自p,則 以上定義保證了簇是領域可達的最大集合對象關于k
NBC算法:NBC算法由兩部分組成
1.評估NDF值。我們查找kNB和R-kNB來自目標集合,然后測量它的NDF。
2.聚類數據集。隨機獲取對象p(),如果p是DP或EP,則新建一個新的簇(社團),表示為p的簇,并繼續找其它的領域可達的來自p關于k,涉及到所有對象屬于p集群的所有對象,如果p是一個SP,那么就把它放好暫時擱置,并繼續檢索下一個要處理的點,這是遞歸操作,直到發現所有集群,更具體地說,給定一個局部密集點或者平均點來自數據庫,首先找到對象直接鄰域可達來自p關于k。kNB中一批對象將被移動到p的集群中,然后找到另一個直接鄰域可達可以從p的簇得到每個DP或EP在p的集群中,直到那里不再有對象可以添加到p的集群中。第二、從剩下的數據集中獲取另一個DP或EP已構建另一個集群。當沒有更過的DP或EP來獲取創建集群,算法終止。不在集群中的點屬于噪聲或者是異常值,下圖有NBC算法的偽代碼。
這里,數據集指示聚類的數據集,k是NBC中用于評估kNB和R-kNB的唯一輸入參數。 k的值可以由數據庫中的專家在一開始或通過實驗來設置。參數k的確定將在下一小節中討論。 DPset保留當前處理的群集的DP或EP。 DPset中的對象用于擴展相應的集群。將DP或EP的kNB移動到當前群集后,將從DPset中刪除它。在那里完全檢測到群集 在DPset中不是對象。當NBC算法停止時,clst no屬性為NULL的未分類對象被視為噪聲或異常值。 NBC算法以CalcNDF函數開始計算kNB, 數據集中每個對象的R-kNB和NDF。在傳統的指數結構中, R * -Tree和X-tree通常用于提高kNB的效率 查詢處理相對較低維度的數據集。但是,很少有索引結構在高維數據集上有效地工作。為了解決這個問題,我們采用基于單元格的方法來支持kNB查詢處理。 數據空間被切割成高維單元格,VA文件[3]用于組織單元格。由于篇幅限制,我們忽略了這里的細節。
//偽代碼
void NBC(DataSet, k){for each object p int Dataset{p.clst_no = NULL;//初始化集合中的每個對象}CalcNDF(Dataset, k);//計算NDFNoiseSet.empty();//初始化臟數據集合Cluster_count = 0;//初始化社團數量為0for each object p int Dataset{//掃描整個庫if(p.clst_no != NULL or p.ndf < 1){continue}p.clst_no = cluste_count;//標記一個新的社團DPSet.empty();//初始化DPsetfor each object q in kNB(p){//找出與p關聯的社團q.clst_no = cluster_count;if(p.ndf >= 1){//ndf > 1加入DPset.add(q);}}while(Dpset != null){//繼續擴展社團p = DPset.getFirstObject();for each object q int kNB(p){if(q.clst_no != NUll)continue;q.clst_no = cluster_count;if(q.ndf >= 1)DPset.add(q);}DPset.remove(p);}cluster_count++;}for each object p int Dataset{if(p.clst_no == NULL){NoiseSet.add(p);}}}
}
算法分析:
k值的意義?
k值的確定。參數k粗略地確定了 數據庫中最小集群的大小。根據基于鄰域的聚類概念和NBC算法的過程,找到一個聚類,我們 必須首先找到至少一個其R-kNB大于或等于其kNB的DP或EP(即,NDF的值不小于1)。假設C是最小的簇w.r.t.數據庫D中的k,p是第一個擴展簇C的DP或EP。 kNB(p)中的所有對象自然地分配給C.考慮到p本身,因此C的最小尺寸是k + 1。因此,我們可以使用參數k來限制要找到的最小簇的大小。 集群是一組數據對象,顯示一些相似且獨特的模式。 如果群集的大小太小,則其模式不容易演示。在這種情況下,數據表現得更像異常值。在實驗中,我們通常會設置 從k到10,我們可以在數據庫中找到最有意義的聚類。復雜度?
NBC算法的過程可以分為兩個獨立的部分:計算NDF和發現簇。最耗時的 計算NDF的工作是評估kNB查詢。讓N成為 d維數據集D的大小。將對象映射到適當的單元格需要O(N)時間。對于正確定位的細胞長度l的值,平均來說,細胞長度為1 搜索需要3層,每個單元包含k個對象。因此,評估kNB查詢的時間復合度是O(mN),其中m = k * 5d。對于大 數據集,m小于等于?N,它變成O(N)。但是,考慮到m 1,因此CalcNDF的時間復雜度為O(mN)。發現集群的遞歸過程需要O(N)。因此,NBC算法的時間復雜度為O(mN)。
總結
以上是生活随笔 為你收集整理的一种基于邻域的聚类算法 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。