DBSCAN聚類演算法

2021-08-01 21:33:14 字數 2260 閱讀 6290

核心點:在半徑eps內含有超過minpts個數的點。

邊界點:在半徑eps內含有小於minpts個數的點,但落在核心點的領域。

噪音點:不是以上兩種點的點。

每個點都要判斷一遍,標記為核心點,邊界點和噪音點,噪音點要刪除。

eps:半徑

min_sample:簇的樣本數

metric:計算方式

import numpy as np

import sklearn.cluster as skc

import matplotlib.pyplot as plt

from sklearn import metrics

mac2id=dict()

onlinetimes=

fr=open('testdata.txt',encoding='utf-8').readlines()#encoding='utf-8'?什麼意思????

for line in fr:

mac = line.split(',')[2]#提取使用者mac位址,作為每個使用者的標識。

onlinetime = int(line.split(',')[6])#提取使用者上網時間並轉化為整形

starttime = int(line.split(',')[4].split(' ')[1].split(':')[0])#,2014-07-20 23:10:16這是分割物件,分割的時候以,為標識

# 切割下有逗號行的第四個元素。然後在第四個元素裡面以空格為標識切割下有空格行的第1個元素,在第乙個元素中以:為標識進行切割,切割下

#得到的各元素的第0個元素,即23,最後都轉化為int型別

#字典用來存貯使用者的位址和位置方便陣列內相應位置的元組更新,當使用者位址重複時,字典不做改變,改變的是陣列中的元組。這樣操作最後得到的

#結果就是使用者上網最後的時間和最新的累計上網時長。

if mac not in mac2id:#如果使用者mac位址不在mac2id字典中

mac2id[mac] = len(onlinetimes)#新增新的使用者位址和位址位置。

else:

onlinetimes[mac2id[mac]] = [(starttime, onlinetime)]#陣列字典長度都不變,更新重複位址中的上網時間和時長。

real_x = np.array(onlinetimes).reshape((-1, 2))#把元組變化為陣列,並且將陣列塑造成不知道幾行但一定是兩列的矩陣

x = real_x[:, 0:1]#0維上面(矩陣縱向)的數字不管(都要),但1維上面只要第0:1個元素(第乙個元素取不到)。如果不指定區間地取值,比如[:,1]

#這樣切片,得到的新矩陣就不能保留原來矩陣的風格。得到了一維陣列。

db = skc.dbscan(eps=0.01, min_samples=20).fit(x)#使用上網開始時間資料計算得到資料相應標籤(可以理解為資料的分身,有兩個屬性,一是

#資料本身的值,二是該資料的簇值。 )

labels = db.labels_#提取標籤的簇值屬性(標籤屬性)

print('labels:')

print(labels)#列印標籤

raito = len(labels[labels[:] == -1]) / len(labels)#遍歷標籤中所有等於-1的元素並計算元素佔整體元素的百分比。這裡只能操作縱向元素。

#縱向運用降維的話,就變成橫向。

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

n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)#set()去除labels中重複的元素,然後計算長度即代表所分成的簇,

# 如果有噪音點則去除含有噪音點的簇,因此結果計算出來就是不含噪音點的簇的數目。

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()))#把labels中等於各自簇的元素用列表表示出來,並且降成一維陣列。

plt.hist(x, 24)

plt.show()

聚類演算法 DBSCAN

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

DBSCAN聚類演算法

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

DBSCAN 聚類演算法

dbscan演算法是一種基於密度聚類的演算法。核心概念 核心點 若某個點的密度達到演算法設定的閾值 即 r 鄰域內點的數量不小於 minpts 則其為核心點。直接密度可達 若某點p在點q的 r 鄰域內,且q是核心點,則稱p從q出發直接密度可達。密度可達 若有乙個點的序列q0 q1 qk,對任意qi從...