1. 程式人生 > >DB Scan演算法的分析與實現

DB Scan演算法的分析與實現

    根據上面第二個資料集的簇的形狀比較怪異,分簇結果應該是連起來的屬於一個簇,但是k-means結果分出來很不如人意,所以這裡介紹一種新的聚類方法,此方法不同於上一個基於劃分的方法,基於劃分主要發現圓形或者球形簇;為了發現任意形狀的簇,用一個基於密度的聚類方法,這類方法將簇看做是資料空間中被低密度區域分割開的稠密物件區域,這一理念剛好也符合資料集的特徵。

    DBSCAN:一種基於高密度連通區域的基於密度的聚類方法,該演算法將具有足夠高密度的區域劃分為簇,並在具有噪聲的空間資料庫中發現任意形狀的簇。它將簇定義為密度相連的點的最大集合;為了理解基於密度聚類的思想,首先要掌握以下幾個定義:

    給定物件半徑r內的鄰域稱為該物件的r鄰域;

    如果物件的r鄰域至少包含最小數目MinPts的物件,則稱該物件為核心物件;

    給定一個物件集合D,如果p在q的r鄰域內,並且q是一個核心物件,則我們說物件p從物件q出發是直接密度可達的;

    如果存在一個物件鏈p1,p2,p3,...,pn,p1=q,pn=p,對於pi屬於D,i屬於1~n,p(i+1)是從pi關於r和MinPts直接密度可達的,則物件p是從物件q關於r和MinPts密度可達的;

    如果存在物件o屬於D,使物件p和q都是從o關於r和MinPts密度可達的,那麼對於物件p到q是關於r和MinPts密度相連的;

密度可達是直接密度可達的傳遞閉包,這種關係非對稱,只有核心物件之間相互密度可達;密度相連是一種對稱的關係;

    有了以上的概念接下來就是演算法描述了:DBSCAN通過檢查資料庫中每點的r鄰域來搜尋簇。如果點p的r鄰域包含的點多餘MinPts個,則建立一個以p為核心物件的新簇。然後,DBSCAN迭代的聚集從這些核心物件直接密度可達的物件,這個過程可能涉及一些密度可達簇的合併。當沒有新的點可以新增到任何簇時,該過程結束;

    具體的虛擬碼描述如下(摘自維基百科):

複製程式碼
 1 DBSCAN(D, eps, MinPts)
 2    C = 0                                          //類別標示
3 for each unvisited point P in dataset D //遍歷 4 mark P as visited //已經訪問 5 NeighborPts = regionQuery(P, eps) //計算這個點的鄰域 6 if sizeof(NeighborPts) < MinPts //不能作為核心點 7 mark P as NOISE //標記為噪音資料 8 else //作為核心點,根據該點建立一個類別 9 C = next cluster 10 expandCluster(P, NeighborPts, C, eps, MinPts) //根據該核心店擴充套件類別 11 12 expandCluster(P, NeighborPts, C, eps, MinPts) 13 add P to cluster C //擴充套件類別,核心店先加入 14 for each point P' in NeighborPts //然後針對核心店鄰域內的點,如果該點沒有被訪問, 15 if P' is not visited 16 mark P' as visited //進行訪問 17 NeighborPts' = regionQuery(P', eps) //如果該點為核心點,則擴充該類別 18 if sizeof(NeighborPts') >= MinPts 19 NeighborPts = NeighborPts joined with NeighborPts' 20 if P' is not yet member of any cluster //如果鄰域內點不是核心點,並且無類別,比如噪音資料,則加入此類別 21 add P' to cluster C 22 23 regionQuery(P, eps) //計算鄰域 24 return all points within P's eps-neighborhood
複製程式碼

    這個演算法的時間複雜度的限制主要在於鄰域的計算,如果存在索引,則能夠降低時間複雜度,如果不存在索引,則鄰域計算需要遍歷所有點,這樣時間複雜度就比較高,相當於雙層的n的迴圈,所以時間複雜度為O(n2);

    不過針對相同時間複雜度的時間,每個人的演算法的執行時間也不盡相同,如果能夠做很多的優化,一些常數時間的減少也能夠減少時間,由於我這裡僅僅是針對虛擬碼的實現,沒有進行資料結構的優化,相對的資料結構也是利用了k-means用的資料結構進行了一些補充,比如新增一些基於密度需要的屬性,比如是否被訪問,是否為噪音,是否被新增至鄰域中等等,跑起來針對資料集1的規模能夠很快的得出結果,但是針對資料集2的資料量30W左右的點就存在很多問題,時間很慢,甚至不能容忍,release優化下好一些,debug下基本上無法等待出結果的,所以任何程式都要進行優化的,優化到你個人的最優;

    接下來是這個演算法的具體實現:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

相關推薦

演算法導論-最大子陣列問題-線性時間複雜度演算法分析實現

之前寫了最大子陣列問題的分治法,今天把這個問題的線性時間複雜度的演算法寫出來。 這個方法在演算法導論最大子陣列問題的課後思考題裡面提出來了,只是說的不夠詳細。 思考題如下:使用如下思想為最大子陣列問題設計一個非遞迴的,線性時間複雜度的演算法。從陣列左邊界開始,由左至右處理,

Java排序演算法分析實現:快排、氣泡排序、選擇排序、插入排序、歸併排序(一)

轉載  https://www.cnblogs.com/bjh1117/p/8335628.html   一、概述:   本文給出常見的幾種排序演算法的原理以及java實現,包括常見的簡單排序和高階排序演算法,以及其他常用的演算法知識。   簡單排序:氣泡排序、選擇排序、

求子集問題演算法分析實現(遞迴、非遞迴)

問題描述: 若有數字集合{1,2,3},則其子集為NULL、{1}、{2}、{3}、{1,2}、{1,3}、{2,3}、{1,2,3}。現給定陣列,求其的全部子集。 實現如下: //非

最短路徑演算法—Floyd(弗洛伊德)演算法分析實現(Python)

December 19, 2015 10:56 PM Floyd演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理帶權有向圖或負權的最短路徑問題 解決此問題有兩種方法: 其一是分別以圖中每個頂點為源點共呼叫n次演算法; 其二是採用Floyd演算法

最短路徑演算法—Dijkstra(迪傑斯特拉)演算法分析實現(Python)

December 18, 2015 12:56 PM Dijkstra(迪傑斯特拉)演算法是典型的最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的

最短路徑演算法—Dijkstra(迪傑斯特拉)演算法分析實現(C/C++)

Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。   Dijks

LRU快取淘汰演算法分析實現

概述 記錄一下LRU快取淘汰演算法的實現。 原理 LRU(Least recently used,最近最少使用)快取演算法根據資料最近被訪問的情況來進行淘汰資料,其核心思想是“如果資料最近被訪問過,那麼將來被訪問的機率也更高”。 介紹 下圖中,介紹

漢諾塔非遞迴演算法分析實現

漢諾塔的遞迴演算法很容易理解,也非常容易實現。下面,本文討論了漢諾塔問題的非遞迴演算法,核心內容就是棧的使用技巧。 首先,對於每個柱子來說,就是一個棧,這個棧有個特點就是,大數放在下面,小數放在上面。在首次建立棧時,我們可以先儲存好這些資料,假設最小的盤子序號

最短路徑演算法—Dijkstra(迪傑斯特拉)演算法分析實現(C/C++)及其他 + leetcode習題實踐

   最短路徑求解  最短路徑的常用解法有迪傑克斯特拉演算法Dijkstra Algorithm, 弗洛伊德演算法Floyd-Warshall Algorithm, 和貝爾曼福特演算法Bellman-Ford Algorithm,其中,Floyd演算法是多源最短路徑,即求

music演算法分析實現

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">1 、MUSIC演算法</spa

排序演算法—選擇排序演算法分析實現(Python)

December 23, 2015 12:31 PM 思想 選擇排序的思想非常直接,不是要排序麼?那好,我就從所有序列中先找到最小的,然後放到第一個位置。之後再看剩餘元素中最小的,放到第二個位置……以此類推,就可以完成整個的排序工作了。可以很清楚的發現,選擇

分散式系統限流演算法分析實現

一、限流的關鍵作用 對於大型網際網路架構中,限流的設計是必不可少的一個環節。在給定的時間內, 客戶端請求次數過多, 伺服器就會攔截掉部分請求,避免請求流量過大造成資料庫負載高的問題。   二、常見限流演算法利弊分析 計數器限流 計數器限流主要有固定視窗計數器和滑動視窗計數器。固定視窗計數器即:在單位

DB Scan演算法分析實現

    根據上面第二個資料集的簇的形狀比較怪異,分簇結果應該是連起來的屬於一個簇,但是k-means結果分出來很不如人意,所以這裡介紹一種新的聚類方法,此方法不同於上一個基於劃分的方法,基於劃分主要發現圓形或者球形簇;為了發現任意形狀的簇,用一個基於密度的聚類方法,這類方法將簇看做是資料空間中被低

十四 第三章再續 快速選擇SELECT演算法的深入分析實現

                                          十四、亦第三章再續:快速選擇SELECT演算法的深入分析與實現前言    經典演算法研究系列已經寫了十三個演算法,共計22篇文章(詳情,見這:十三個經典演算法研究與總結、目錄+索引),我很怕我自己不再把這個算法系列給繼續寫下去

七種排序演算法的簡單分析實現

{    int nFirst = nLow;    int nMid = (nLow + nHigh) /2;    int nSecond = nMid +1;    int* p = (int*)malloc(sizeof(int) * (nHigh - nLow +1));    int nIndex

《機器學習實戰》決策樹(ID3演算法)的分析實現

        決策樹是一個預測模型;他代表的是物件屬性與物件值之間的一種對映關係。樹中每個節點表示某個物件,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的物件的值。決策樹僅有單一輸出,若欲有複數輸出,可以建立獨立的決策樹以處理不同輸出。 資料探勘中決策樹是一

《推薦系統》基於使用者和Item的協同過濾演算法分析實現(Python)

開啟微信掃一掃,關注《資料與演算法聯盟》1:協同過濾演算法簡介2:協同過濾演算法的核心3:協同過濾演算法的應用方式4:基於使用者的協同過濾演算法實現5:基於物品的協同過濾演算法實現一:協同過濾演算法簡介    關於協同過濾的一個最經典的例子就是看電影,有時候不知道哪一部電影是

DES演算法流程分析實現

DES(Data Encryption Standard,資料加密標準)作為一種基本結構為Feistel結構的加密演算法,其加密核心在於F函式。而Feistel結構決定了其加密解密流程是相同的,無論是硬體實現還是軟體實現都只需要一種結構,不需要分別實現。關於Fe

無監督學習之K-均值演算法分析MATLAB程式碼實現

前言 K-均值是一種無監督的聚類演算法。首先我們要知道什麼是無監督,無監督就是說在資料集中,資料是沒有標籤的。在有監督的資料集中,資料的形式可能是這樣:{(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}。而在無監督的資料集中,資

跳躍表的分析實現

insert text 站點 avi 初始 解析 鏈接 solid water ----《大規模分布式存儲系統:原理解析與架構實戰》讀書筆記 在了解了 Bitcask存儲模型後,又開始研究LSM樹存儲引擎。LSM在實現的過程中使用了一個非常有意思的數