基於DBSCAN的學生月上網時間聚類

2021-09-11 00:26:58 字數 2512 閱讀 1164

本文是中國mooc大學《python機器學習基礎》學習筆記。

現有學生上網資料格式如下:

目的:通過dbscan聚類,分析學生上網時間和上網時長的模式

**(python 3.6+):

import numpy as np

import sklearn.cluster as skc

from sklearn import metrics

import matplotlib.pyplot as plt

"""學生上網日誌單條記錄格式

記錄編號 學生編號 mac位址 ip位址 開始上網時間 停止上網時間 上網時長

2c929293466b97a6014754607e457d68,u201215025,a417314eea7b,10.12.49.26,2014-07-20 22:44:18.540000000,2014-07-20 23:10:16.540000000,1558,15,本科生動態ip模版,100元每半年,internet

"""mac2id = dict()

"""key是mac位址

value是開始上網時間和上網時長

"""onlinetimes =

f = open("學生月上網時間分布-testdata.txt",encoding='utf8')

for line in f:

data = line.split(',')

mac = data[2]

onlinetime = int(data[6])

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

if mac not in mac2id:

mac2id[mac] = len(onlinetimes)

else:

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

real_x = np.array(onlinetimes).reshape((-1,2)) #引數-1可以自動確定行數

x = real_x[:,0:1] # 擷取第一列

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

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

# min_sample:簇的樣本數

# metrics:距離計算方式(預設歐幾里得距離)

labels = db.labels_

print("labels")

print(labels)

ratio = len(labels[labels[:]==-1]) / len(labels[:]) # 判定雜訊資料(label被打上-1)資料所佔的比例

# print("noise ratio:".format(ratio))

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

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

print("estimate number of clusters:%d"%n_clusters_)

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

#輪廓係數(silhouette coefficient)的值是介於 [-1,1] ,越趨近於1代表內聚度和分離度都相對較優

for i in range(n_clusters_):

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

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

# flatten()方法:將numpy物件(如array、mat)摺疊成一維陣列返回

plt.hist(x,24)

"""hist的引數非常多,但常用的就這六個,只有第乙個是必須的,後面四個可選

arr: 需要計算直方圖的一維陣列

bins: 直方圖的柱數,可選項,預設為10

normed: 是否將得到的直方圖向量歸一化。預設為0

facecolor: 直方圖顏色

edgecolor: 直方圖邊框顏色

alpha: 透明度

histtype: 直方圖型別,『bar』, 『barstacked』, 『step』, 『stepfilled』

"""plt.show()

輸出:

結論:上網時間大多聚集在22:00和23:00

DBSCAN基於密度的聚類演算法

1.密度 密度指的是在某距離內含有物件的最小數目。2.核心物件 如果乙個物件的eps鄰域內至少包含minpt個物件,則稱該物件是核心物件。3.直接密度可達 給定乙個物件集合d,如果p在q的eps鄰域內,並且q是乙個核心物件,則p是從q直接密度可達的。如下圖所示 eps可以想象為乙個超球體的半徑,mi...

基於密度的聚類演算法DBSCAN

可以發現,密度可達是直接密度可達的傳遞閉包,並且這種關係是非對稱的。密度相連是對稱關係。dbscan目的是找到密度相連物件的最大集合。eg 假設半徑 3,minpts 3,點p的e領域中有點,點m的e領域中有點,點q的e領域中有點,點o的e領域中有點,點s的e領域中有點.那麼核心物件有p,m,o,s...

基於密度的聚類之Dbscan演算法

該演算法利用基於密度的聚類的概念,即要求聚類空間中的一定區域內所包含物件 點或其他空間物件 的數目不小於某一給定閾值。dbscan演算法的顯著優點是聚類速度快且能夠有效處理雜訊點和發現任意形狀的空間聚類。但是由於它直接對整個資料庫進行操作且進行聚類時使用了乙個全域性性的表徵密度的引數,因此也具有兩個...