''' DBSCAN算法:從樣本空間中任意選擇一個樣本,以事先給定的半徑做圓,凡被該圓圈中的樣本都視為與該樣本處於相同的聚類, 以這些被圈中的樣本為圓心繼續做圓,重復以上過程,不斷擴大被圈中樣本的規模,直到再也沒有新的樣本加入為止, 至此即得到一個聚類。於剩余樣本中,重復以上過程,直到耗盡樣本空間中的所有樣本為止。 DBSCAN算法的特點: 1.事先給定的半徑會影響最后的聚類效果,可以借助輪廓系數選擇較優的方案。 2.根據聚類的形成過程,把樣本細分為以下三類: 外周樣本:被其它樣本聚集到某個聚類中,但無法再引入新樣本的樣本。 孤立樣本:聚類中的樣本數低於所設定的下限,則不稱其為聚類,反之稱其為孤立樣本。 核心樣本:除了外周樣本和孤立樣本以外的樣本。 ''' import numpy as np import matplotlib.pyplot as mp import sklearn.cluster as sc import sklearn.metrics as sm # 讀取數據,繪制圖像 x = np.loadtxt('./ml_data/multiple3.txt', unpack=False, dtype='f8', delimiter=',') print(x.shape) # 選擇最優半徑 epsilons = np.linspace(0.3, 1.0, 8) models, scores = [], [] for epsilon in epsilons: # 針對每個半徑構建DBSCAN模型 model = sc.DBSCAN(eps=epsilon, min_samples=5) model.fit(x) score = sm.silhouette_score(x, model.labels_, sample_size=len(x), metric='euclidean') models.append(model) scores.append(score) index = np.array(scores).argmax() best_model = models[index] best_eps = epsilons[index] best_score = scores[index] print(best_eps, best_model, best_score) # DBSAN算法的副產品 獲取核心樣本的下標 core_indices = best_model.core_sample_indices_ core_mask = np.zeros(len(x), dtype='bool') core_mask[core_indices] = True print(core_mask) # 獲取孤立樣本的掩碼 offset_mask = best_model.labels_ == -1 print(offset_mask) # 獲取外周樣本的掩碼 p_mask = ~(core_mask | offset_mask) print(p_mask) # 分別輸出核心點坐標、孤立點坐標和外周點坐標 print('核心點坐標:', x[core_mask], sep='\n') print('孤立點坐標:', x[offset_mask], sep='\n') print('外周點坐標:', x[p_mask], sep='\n') # 畫圖顯示樣本數據 mp.figure('DBSCAN', facecolor='lightgray') mp.title('DBSCAN', fontsize=16) mp.xlabel('X', fontsize=14) mp.ylabel('Y', fontsize=14) mp.tick_params(labelsize=10) mp.scatter(x[core_mask][:, 0], x[core_mask][:, 1], s=80, c=best_model.labels_[core_mask], label='core') mp.scatter(x[offset_mask][:, 0], x[offset_mask][:, 1], s=80, c=best_model.labels_[offset_mask], label='offset') mp.scatter(x[p_mask][:, 0], x[p_mask][:, 1], s=80, c=best_model.labels_[p_mask], label='p') mp.legend() mp.show() 輸出結果: (200, 2) 0.7999999999999999 DBSCAN(algorithm='auto', eps=0.7999999999999999, leaf_size=30, metric='euclidean', metric_params=None, min_samples=5, n_jobs=None, p=None) 0.41779833446624154 [False True True True True True True True True True False True True True True True True True True False True True True True True True False True True True True True True True True True True True True True True True True True True True False True True True True True True True True True False True True True True True True True True True True True True True True True True True True True False True True True True True True True True True True True True True True True True True True True False True True True True True True True True True True False True True True True True True True True False True True True True True True False True True False True True True False False True True True True False True True True True True True False True False True True False True True True False True True True True True False False True True True True False True True False True True True True True True True True True True True True True True True True True True True True True True True True True True False True True True True True] [False False False False False False False False False False False False False False False False False False False False False False False False False False True False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False True False False False False False False False False False False False True False False False False False False False False False False False False False False False True False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False False] [ True False False False False False False False False False True False False False False False False False False True False False False False False False False False False False False False False False False False False False False False False False False False False False True False False False False False False False False False True False False False False False False False False False False False False False False False False False False False True False False False False False False False False False False False False False False False False False False False True False False False False False False False False False False True False False False False False False False False True False False False False False False True False False True False False False True True False False False False False False False False False False False True False True False False False False False False True False False False False False True True False False False False False False False True False False False False False False False False False False False False False False False False False False False False False False False False False False True False False False False False] 核心點坐標: [[2.84 3.16] [4.74 1.84] [6.36 4.89] [1.77 1.55] [4.29 6.74] [5.78 0.95] [8.36 5.2 ] [1.76 2.9 ] [3.2 4.98] [6.02 6.12] [2.91 1.74] [3.81 6.2 ] [5.67 2.19] [6.93 5.8 ] [1.84 1.36] [3.5 5.6 ] [5.77 1.54] [2.1 1.68] [3.98 4.85] [5.64 3.35] [7.59 6.79] [1.92 3.93] [3.93 5.7 ] [7.24 6.23] [1.36 1.47] [1.78 5.39] [5.93 1.19] [7.34 5.58] [1.86 1.99] [3.2 5.19] [5.62 2.45] [6.31 5.37] [1.49 1.8 ] [2.13 5.29] [5.57 2.77] [6.77 5.8 ] [1.79 2.13] [3.71 4.65] [5.46 1.92] [6.53 5.14] [2.06 2.56] [4.03 4.89] [7.25 4.27] [2.77 2.91] [2.98 4.4 ] [5.21 3.07] [6.54 4.05] [1.59 1.04] [1.65 5.41] [6.53 1.76] [6.77 5.59] [2.21 4.57] [5.58 1.88] [7.61 4.95] [1.8 1.25] [2.77 5.71] [5.13 2.4 ] [7.14 5.6 ] [1.83 1.26] [2.78 5.67] [5.76 2.64] [6.71 6.01] [2.64 1.86] [3.21 5.09] [7.23 1.22] [6.47 5.5 ] [2.46 2.51] [1.92 3.94] [5.64 2.76] [7.16 6.08] [3.52 4.25] [5.41 3.55] [7.9 5.22] [1.99 2.64] [3.46 4.66] [6.56 2.25] [6.89 4.43] [1.4 1.08] [3.43 6.08] [6.64 2.19] [6.26 5.91] [2.15 3.11] [3.18 5.41] [6.73 3.67] [7.36 5.97] [1.55 2.96] [3.99 5.63] [6.68 3.51] [6.34 5.99] [3.91 4.54] [6.21 3.2 ] [6.25 5.33] [2.13 1.91] [3.75 6.23] [4.35 1.49] [7.14 5.64] [1.68 2.67] [3.85 4.84] [6.04 2.68] [1.55 2.26] [1.86 5.29] [6.06 2.12] [7.77 5.17] [1.35 2.16] [3.53 6.11] [6.8 0.61] [6.92 6.02] [3.07 5.09] [6.44 2.07] [7.15 6.15] [1.01 2.56] [2.45 6.24] [6.86 2.54] [2.73 1.7 ] [2.25 5.62] [7.56 5.93] [3.01 1.68] [2.74 4.45] [1.99 0.39] [4.05 6.16] [5.34 2.66] [6.09 5.58] [3.14 5.85] [6.04 0.98] [6.02 5.82] [1.56 1.65] [3.08 6.49] [5.64 3.26] [2.75 1.9 ] [6.47 0.7 ] [7.04 4.83] [2.8 3.42] [7.14 1.72] [6.9 6.86] [4.55 5.17] [6.29 1.99] [7.41 4.88] [2.83 2.29] [3.24 5.83] [1.51 2.95] [2.55 5.51] [6.5 1.72] [7.97 4.62] [2.82 4.83] [5.02 3.53] [1.57 2.67] [1.72 4.05] [6.44 3.28] [7.41 6.85] [1.67 1.5 ] [1.77 5.59] [5.4 2.64] [7.18 5.94] [1.45 1.47] [3.77 5.01] [6.31 0.48] [6.65 5.65] [1.37 2.51] [2.54 4.42] [6.17 1.8 ] [7.29 4.68] [2.44 1.57] [3.46 4.5 ] [5.58 2.19] [6.46 6.23] [2.17 2.4 ] [3.29 5.66] [6.99 1.71] [6.54 4.71] [0.99 2.14] [3.67 4.47] [6.64 6.66] [2.15 0.75] [3.26 6.08] [5.72 1.98] [7.26 5.35]] 孤立點坐標: [[ 5.66 -0.33] [ 0.16 1.55] [-0.27 2.22] [-0.39 2.28]] 外周點坐標: [[ 1.96 -0.09] [ 5.56 0.34] [ 8.68 4.33] [ 7.54 0.52] [ 0.42 2.75] [ 3.29 1.26] [ 3.96 1.83] [ 5.26 5.89] [ 1.11 3.74] [ 8.17 6.19] [ 7.93 1.84] [ 4.53 3.2 ] [ 8.95 5.7 ] [ 8.26 6.04] [ 3.46 3.57] [ 2.6 0.77] [ 4.26 1.67] [ 4.78 7.25] [ 7.77 7.38] [ 4.98 1.02]]