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