聚類(1) DBSCAN例項

2021-08-01 12:06:09 字數 2037 閱讀 9021

dbscan演算法是一種基於密度聚類演算法:

- 聚類的時候不需要預先指定簇的個數

- 最終簇的個數不一定

dbscan演算法將資料點分為三類:

- 核心點:在半斤eps內含有超過minpts數目的點

- 邊界點:在半斤eps內點的數量小於minpts,但是落在核心點的領域內

演算法流程:

1. 對所有點計算其領域eps=distance內的點的集合

2. 集合內的點個數超過minpt3=count的點為核心點

3. 檢視剩餘點是否在核心點的領域內,若在則為邊界點,否則為雜訊點

onlinetime = int(line.split(',')[6]) #上網時間長度

#print(onlinetime)

starttime = int(line.split(',')[4].split(' ')[1].split(':')[0])#上網開始時間,2014-07-20 22:44:18.540000000,提取其中的小時

if mac not

in mac2id: #mac2id是個字典,給每個mac位址編id序號

mac2id[mac] = len(onlinetimes)

else:

onlinetimes[mac2id[mac]] = [(starttime, onlinetime)] #如果一天多個時間段,取後乙個

real_x = np.array(onlinetimes).reshape((-1,2))

x = real_x[:, 0:1]

db = skc.dbscan(eps=0.01, min_samples=20).fit(x) #dbscan聚類方法 還有引數,matric = ""距離計算方法

labels = db.labels_ #和x同乙個維度,labels對應索引序號的值 為她所在簇的序號

print('labels:')

print(labels)

raito = len(labels[labels[:] == -1]) / len(labels) #計算雜訊點個數佔總數的比例

print('noise raito:', format(raito, '.2%'))

n_clusters_ = len(set(labels)) - (1

if -1

in labels else

0)print('estimated number of clusters: %d' % n_clusters_)

print("silhouette coefficient: %0.3f" % metrics.silhouette_score(x, labels)) #輪廓係數評價聚類的好壞

for i in range(n_clusters_):

print('cluster ', i, ':')

print(list(x[labels == i].flatten())) #flatten 合併子維度的陣列 ("c")按照列來合併,("f")按照行合併

plt.hist(x, 24) #24條數

plt.show()

dbscan聚類演算法例項 聚類效能評估 輪廓係數

當文字類別未知時,可以選擇輪廓係數作為聚類效能的評估指標。輪廓係數取值範圍為 1,1 取值越接近1則說明聚類效能越好,相反,取值越接近 1則說明聚類效能越差。則針對某個樣本的輪廓係數s為 聚類總的輪廓係數sc為 sc 詳細內容參考文獻 這裡我們用鳶尾花資料集舉例baiziyu sklearn 鳶尾花...

聚類演算法 DBSCAN

dbscan 是一種簡單的,基於密度的聚類演算法。本次實現中,dbscan 使用了基於中心的方法。在基於中心的方法中,每個資料點的密度通過對以該點為中心以邊長為 2 eps 的網格 鄰域 內的其他資料點的個數來度量。根據資料點的密度分為三類點 1 核心點 該點在鄰域內的密度超過給定的閥值 minps...

DBSCAN聚類演算法

基於密度定義,我們將點分為 dbscan演算法的本質就是隨大流,邊界點緊緊圍繞著核心點,他們抱團,不帶噪點玩兒 小團體多了,聯絡比較密切的小團體之間聚成了同個類 比較偏遠的小團體想要加入這個圈子,進不去,就單幹,我們自己玩自己的,聚成了另外的乙個類 一開始就被孤立的噪點吧,自然有自己的傲骨,接著孤芳...