python DBSCAN密度聚類

2021-09-24 18:13:38 字數 2916 閱讀 6561

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

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

3.演算法流程

'''

dbscan主要引數:

eps:兩個樣本被看做鄰居節點的最大距離

min_samles:簇的樣本數

metric:距離計算方式

'''import numpy as np

from sklearn.cluster import dbscan

import sklearn.cluster as skc

from sklearn import metrics

import matplotlib.pyplot as plt

mac2id=dict()

onlinetimes=

f=open("e:\\python\online.txt")

for line in f:

#讀取每條資料中mac位址,開始上網時間,上網時長

print(line)#每行資訊

mac=line.split(',')[2]

print(mac)

onlinetime=int(line.split(",")[6])

starttime=int(line.split(',')[4].split(' ')[1].split(':')[0])

#mac2id是乙個字典,key是mac位址,value是對應mac位址的上網時長以及開始上網時間

if mac not in mac2id:

mac2id[mac]=len(onlinetimes)

else:

onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]

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

#呼叫dbscan方法進行訓練,labels為每個簇的標籤

x=real_x[:,0:1]

db=skc.dbscan(eps=0.01,min_samples=20).fit(x)

labels=db.labels_

#列印資料被標記的標籤,計算標籤為-1,即雜訊資料的比例

print("labels:")

print(labels)

raito=len(labels[labels[:]==-1])/len(labels)

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

#計算簇的個數並列印,評價聚類效果

n_cluster_ = len(set(labels))-(1 if -1 in labels else 0)

print("estimated number of cluster: %d"%n_cluster_)

print("silhouette coefficient : %0.3f"%metrics.silhouette_score(x,labels))

#輸出各簇標號以及各簇內資料

for i in range(n_cluster_):

print("cluster ",i,":")

print(list(x[labels==i].flatten()))

#直方圖計算顯示

plt.hist(x,24)

plt.show()

x=np.log(1+real_x[:,1:])

db=skc.dbscan(eps=0.14,min_samples=10).fit(x)

labels=db.labels_

print("labels:")

print(labels)

raito=len(labels[labels[:]==-1])/len(labels)

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

n_cluster_=len(set(labels))-(1 if -1 in labels else 0)

print("estimated number of cluster: %d"%n_cluster_)

print("silhouette coefficient : %0.3f"%metrics.silhouette_score(x,labels))

# 統計每個簇內的樣本個數,均值,標準差

for i in range(n_cluster_):

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

count=len(x[labels==i])

mean=np.mean(real_x[labels==i][:,1])

std=np.std(real_x[labels==i][:,1])

print("\t number of sample:",count)

print("\t mean of sample:",format(mean,'.1f'))

print("\t mean of sample:",format(std,'.1f'))

plt.hist(x,24)

plt.show()

資料檔案分割出的一天記錄: 

視覺化結果:

下面為處理過的結果:

DBSCAN 密度聚類

dbscan 密度聚類 dbscan演算法是一種基於密度的聚類演算法 聚類的時候不需要預先指定簇的個數 最終的簇的個數不定 dbscan演算法將資料點分為三類 核心點 在半徑eps內含有超過minpts數目的點 邊界點 在半徑eps內點的數量小於minpts,但是落在核心點的鄰域內 噪音點 既不是核...

密度聚類DBSCAN HDBSCAN

1 演算法的流程 重複以上過程 偽 1 首先將資料集d中的所有物件標記為未處理狀態 2 for 資料集d中每個物件p do 3 if p已經歸入某個簇或標記為雜訊 then 4 continue 5 else 6 檢查物件p的eps鄰域 neps p 7 if neps p 包含的物件數小於minp...

DBSCAN密度聚類

dbscan是一種基於密度的聚類演算法,這類密度聚類演算法一般假定類別可以通過樣本分佈的緊密程度決定。同一類別的樣本,他們之間的緊密相連的,也就是說,在該類別任意樣本周圍不遠處一定有同類別的樣本存在。通過將緊密相連的樣本劃為一類,這樣就得到了乙個聚類類別。通過將所有各組緊密相連的樣本劃為各個不同的類...