根據學生月上網時間數據運用DBSCAN算法計算:
#coding=utf-8 import numpy as np import sklearn.cluster as skc from sklearn import metrics import matplotlib.pyplot as plt mac2id = dict() onlinetimes = [] f = open('F:\data\TestData.txt', encoding='utf-8') for line in f: mac = line.split(',')[2]#取得mac地址,例如第一行A417314EEA7B onlinetime = int(line.split(',')[6])#上網時長 starttime = int(line.split(',')[4].split(' ')[1].split(':')[0])#開始時間只取第一個":"分割的:小時 #每一個onlinetimes有一個唯一的mac2id對應 if mac not in mac2id: mac2id[mac] = len(onlinetimes) onlinetimes.append((starttime, onlinetime)) else: onlinetimes[mac2id[mac]] = [(starttime,onlinetime)] #print(onlinetimes) real_X = np.array(onlinetimes).reshape((-1, 2))#自行構造一個2列的矩陣,-1構造未知行數 #print(real_X) X = real_X[:, 0:1]#只取上網開始時 #print(X) #調用DBSCAN方法進行訓練,labels為每個數據的簇標簽 db = skc.DBSCAN(eps=0.01, min_samples=20).fit(X) #返回的數據的簇標簽,噪聲數據標簽為-1 '''#上網時長聚類 X = np.log(1+real_X[:, 1:]) db = skc.DBSCAN(eps=0.04, min_samples=10).fit(X) ''' labels = db.labels_ print('Labels:\n', labels) #計算簇標簽為-1的噪聲數據比率 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 numbe 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())) #繪制直方圖 plt.hist(X, 24) plt.show()
運行結果:
Labels:
[ 0 -1 0 1 -1 1 0 1 2 -1 1 0 1 1 3 -1 -1 3 -1 1 1 -1 1 3 4
-1 1 1 2 0 2 2 -1 0 1 0 0 0 1 3 -1 0 1 1 0 0 2 -1 1 3
1 -1 3 -1 3 0 1 1 2 3 3 -1 -1 -1 0 1 2 1 -1 3 1 1 2 3 0
1 -1 2 0 0 3 2 0 1 -1 1 3 -1 4 2 -1 -1 0 -1 3 -1 0 2 1 -1
-1 2 1 1 2 0 2 1 1 3 3 0 1 2 0 1 0 -1 1 1 3 -1 2 1 3
1 1 1 2 -1 5 -1 1 3 -1 0 1 0 0 1 -1 -1 -1 2 2 0 1 1 3 0
0 0 1 4 4 -1 -1 -1 -1 4 -1 4 4 -1 4 -1 1 2 2 3 0 1 0 -1 1
0 0 1 -1 -1 0 2 1 0 2 -1 1 1 -1 -1 0 1 1 -1 3 1 1 -1 1 1
0 0 -1 0 -1 0 0 2 -1 1 -1 1 0 -1 2 1 3 1 1 -1 1 0 0 -1 0
0 3 2 0 0 5 -1 3 2 -1 5 4 4 4 -1 5 5 -1 4 0 4 4 4 5 4
4 5 5 0 5 4 -1 4 5 5 5 1 5 5 0 5 4 4 -1 4 4 5 4 0 5
4 -1 0 5 5 5 -1 4 5 5 5 5 4 4]
Noise raito: 22.15%
Estimated numbe of clusters: 6
Silhouette Coefficient: 0.710
Cluster 0 :
[22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22]
Cluster 1 :
[23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23]
Cluster 2 :
[20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20]
Cluster 3 :
[21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21]
Cluster 4 :
[8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]
Cluster 5 :
[7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7]
根據上網開始時間分類直方圖如下:
根據上網時間聚類直方圖如下:
根據上網開始時間明顯要好於上網時長聚類.