網(wǎng)站建設(shè)報(bào)價(jià)方案下載企業(yè)網(wǎng)站模板建站
密度聚類算法(DBSCAN)實(shí)驗(yàn)案例
描述
DBSCAN是一種強(qiáng)大的基于密度的聚類算法,從直觀效果上看,DBSCAN算法可以找到樣本點(diǎn)的全部密集區(qū)域,并把這些密集區(qū)域當(dāng)做一個(gè)一個(gè)的聚類簇。DBSCAN的一個(gè)巨大優(yōu)勢(shì)是可以對(duì)任意形狀的數(shù)據(jù)集進(jìn)行聚類。
本任務(wù)的主要內(nèi)容:
1、 環(huán)形數(shù)據(jù)集聚類
2、 新月形數(shù)據(jù)集聚類
3、 輪廓系數(shù)評(píng)估指標(biāo)應(yīng)用
源碼下載
環(huán)境
-
操作系統(tǒng):Windows 10、Ubuntu18.04
-
工具軟件:Anaconda3 2019、Python3.7
-
硬件環(huán)境:無(wú)特殊要求
-
依賴庫(kù)列表
matplotlib 3.3.4 numpy 1.19.5 scikit-learn 0.24.2
分析
本實(shí)驗(yàn)包含三個(gè)任務(wù):環(huán)形數(shù)據(jù)集聚類、新月數(shù)據(jù)集聚類以及輪廓系數(shù)評(píng)估指標(biāo)的使用,數(shù)據(jù)集均由sklearn.datasets模塊生成。為了直觀觀察DBSCAN的優(yōu)勢(shì),任務(wù)中還引入了前面學(xué)過(guò)的多種聚類算法進(jìn)行對(duì)比。
本實(shí)驗(yàn)涉及以下幾個(gè)環(huán)節(jié):
1)子任務(wù)一、環(huán)形數(shù)據(jù)聚類
1.1 數(shù)據(jù)集的生成
1.2 使用K-Means、MeanShift、Birch算法進(jìn)行聚類并可視化
1.3 使用DBSCAN聚類并可視化
2)子任務(wù)二、新月數(shù)據(jù)集聚類
2.1 數(shù)據(jù)集的生成
2.2 使用K-Means、MeanShift、Birch算法進(jìn)行聚類并可視化
2.3 使用DBSCAN聚類并可視化
3)聚類評(píng)估指標(biāo)(輪廓系數(shù))案例實(shí)踐
3.1 數(shù)據(jù)集生成
3.2 聚類并評(píng)估效果
實(shí)施
1、環(huán)形數(shù)據(jù)集聚類
任務(wù)描述:
1、使用scikit-learn生成環(huán)形數(shù)據(jù)集;
2、將數(shù)據(jù)集聚成右側(cè)3個(gè)類別。
1.1 生成環(huán)形數(shù)據(jù)集
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets# 生成環(huán)形數(shù)據(jù)集(500個(gè)樣本)
X1, y1=datasets.make_circles(n_samples=500, factor=0.5, noise=0.07, random_state=0)# 生成點(diǎn)塊數(shù)據(jù)集(80個(gè)樣本)
X2, y2 = datasets.make_blobs(n_samples=80, n_features=2, centers=[[1.2, 1.2]], cluster_std=[[0.15]], random_state=0)# 合并成一個(gè)數(shù)據(jù)集,生成散點(diǎn)圖
X = np.concatenate((X1, X2))
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()
顯示結(jié)果:
1.2 分別使用K-Means、MeanShift、Birch算法進(jìn)行聚類
from sklearn.cluster import KMeans, MeanShift, Birch# 嘗試三種聚類模型,都不能達(dá)到目的
y_pred = KMeans(3).fit_predict(X) # KMeans# y_pred = Birch(n_clusters=3).fit_predict(X) # Birch
# y_pred = MeanShift().fit_predict(X) # MeanShift
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
顯示結(jié)果:
從算法的輸出中可以看到,對(duì)于環(huán)形數(shù)據(jù)集,上述三種聚類算法均不能很好地實(shí)現(xiàn)任務(wù)規(guī)定的聚類目標(biāo)。
1.3 使用DBSCAN算法(不指定參數(shù))
from sklearn.cluster import DBSCAN# 使用無(wú)參數(shù)的DBSCAN聚類,發(fā)現(xiàn)模型將所有樣本歸為了一類
y_pred = DBSCAN().fit_predict(X)# 畫(huà)散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
顯示結(jié)果:
可以看到,不使用參數(shù)的DBSCAN算法,將所有數(shù)據(jù)分成了一類。
1.4 指定DBSCAN算法的參數(shù)
DBSCAN算法聚類的結(jié)果依賴于調(diào)參,該算法的兩個(gè)主要參數(shù)eps和min_samples,對(duì)于聚類結(jié)果的影響很大。
# eps-臨近半徑
# min_samples-最小樣本數(shù)
# 指定參數(shù),調(diào)參,任務(wù)完成(聚成內(nèi)、中、外3類)
y_pred = DBSCAN(eps=0.2, min_samples=2).fit_predict(X)# 畫(huà)散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
輸出結(jié)果:
可以看到,通過(guò)調(diào)參,DBSCAN算法完美地將數(shù)據(jù)集按指定要求聚成了3類。
2、新月數(shù)據(jù)集聚類
任務(wù)描述:
1、使用scikit-learn生成新月數(shù)據(jù)集;
2、將數(shù)據(jù)集聚成右側(cè)上下2個(gè)類別。
2.1 生成數(shù)據(jù)集
import matplotlib.pyplot as plt
from sklearn import datasets# 生成彎月數(shù)據(jù)集(500個(gè)樣本)
X, y = datasets.make_moons(500, noise = 0.1, random_state=99)# 顯示散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], s = 100, alpha = 0.6, cmap = 'rainbow')plt.show()
顯示結(jié)果:
2.2 嘗試K-Means、MeanShift、Birch算法
from sklearn.cluster import KMeans, MeanShift, Birch# 嘗試三種聚類模型,都不能達(dá)到目的
y_pred = KMeans(2).fit_predict(X) # KMeans# y_pred = Birch(n_clusters=2).fit_predict(X) # Birch
# y_pred = MeanShift().fit_predict(X) # MeanShift
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s = 100, alpha = 0.6, cmap = 'rainbow')plt.show()
顯示結(jié)果:(對(duì)于該數(shù)據(jù)集,上述三種聚類算法不能很好地實(shí)現(xiàn)指定聚類目標(biāo)。)
2.3 使用DBSCAN聚類算法,不指定參數(shù)
from sklearn.cluster import DBSCAN# 使用DBSCAN算法(不指定參數(shù))
y_pred = DBSCAN().fit_predict(X)# 畫(huà)散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s = 100, alpha = 0.6, cmap = 'rainbow')plt.show()
顯示結(jié)果:
2.4 使用DBSCAN聚類算法,指定參數(shù)
# 指定參數(shù),調(diào)參,任務(wù)完成(聚成上下2類)
y_pred = DBSCAN(eps=0.2, min_samples=9).fit_predict(X)# 畫(huà)散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s = 100, alpha = 0.6, cmap = 'rainbow')plt.show()
顯示結(jié)果:
通過(guò)調(diào)整兩個(gè)指定參數(shù),DBSCAN算法按照要求完成了新月數(shù)據(jù)集的聚類,DBSCAN算法的一大優(yōu)勢(shì)是可以對(duì)任意形狀的數(shù)據(jù)集進(jìn)行聚類。
3、使用輪廓系數(shù)(silhouette_score)來(lái)評(píng)估聚類
任務(wù)描述:
輪廓系數(shù)(silhouette_score)指標(biāo)是聚類效果的評(píng)價(jià)方式之一(前面我們還使用了蘭德指數(shù)-adjusted_rand_score,注意它們之間的區(qū)別)。輪廓系數(shù)指標(biāo)不關(guān)注樣本的實(shí)際類別,而是通過(guò)分析聚類結(jié)果中樣本的內(nèi)聚度和分離度兩種因素來(lái)給出成績(jī),取值范圍為(-1,1),值越大代表聚類的結(jié)果越合理。
3.1 生成數(shù)據(jù)集
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs# 使用數(shù)據(jù)生成器隨機(jī)生成500個(gè)樣本,每個(gè)樣本2個(gè)特征
X, y = make_blobs(n_samples=500, n_features=2, centers=[[-1,-1], [0.5,-1]], cluster_std=[0.2, 0.3], random_state=6)# 畫(huà)出散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()
顯示結(jié)果:
3.2 使用輪廓系數(shù)來(lái)評(píng)估聚類結(jié)果
from sklearn.metrics import silhouette_score # 輪廓系數(shù)評(píng)估函數(shù)
from sklearn.cluster import MeanShift# 使用MeanShift聚類
y_pred = MeanShift().fit_predict(X)# 畫(huà)出聚類散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show() # 評(píng)估輪廓系數(shù)
score = silhouette_score(X, y_pred)
print('score: ', score)