核心點:在半徑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從...