密度聚類算法(DBSCAN)實(shí)驗(yàn)案例
描述
DBSCAN是一種強(qiáng)大的基于密度的聚類算法,從直觀效果上看,DBSCAN算法可以找到樣本點(diǎn)的全部密集區(qū)域,并把這些密集區(qū)域當(dāng)做一個一個的聚類簇。DBSCAN的一個巨大優(yōu)勢是可以對任意形狀的數(shù)據(jù)集進(jìn)行聚類。
本任務(wù)的主要內(nèi)容:
1、 環(huán)形數(shù)據(jù)集聚類
2、 新月形數(shù)據(jù)集聚類
3、 輪廓系數(shù)評估指標(biāo)應(yīng)用
源碼下載
環(huán)境
-
操作系統(tǒng):Windows 10、Ubuntu18.04
-
工具軟件:Anaconda3 2019、Python3.7
-
硬件環(huán)境:無特殊要求
-
依賴庫列表
matplotlib 3.3.4 numpy 1.19.5 scikit-learn 0.24.2
分析
本實(shí)驗(yàn)包含三個任務(wù):環(huán)形數(shù)據(jù)集聚類、新月數(shù)據(jù)集聚類以及輪廓系數(shù)評估指標(biāo)的使用,數(shù)據(jù)集均由sklearn.datasets模塊生成。為了直觀觀察DBSCAN的優(yōu)勢,任務(wù)中還引入了前面學(xué)過的多種聚類算法進(jìn)行對比。
本實(shí)驗(yàn)涉及以下幾個環(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)聚類評估指標(biāo)(輪廓系數(shù))案例實(shí)踐
3.1 數(shù)據(jù)集生成
3.2 聚類并評估效果
實(shí)施
1、環(huán)形數(shù)據(jù)集聚類
任務(wù)描述:
1、使用scikit-learn生成環(huán)形數(shù)據(jù)集;
2、將數(shù)據(jù)集聚成右側(cè)3個類別。
1.1 生成環(huán)形數(shù)據(jù)集
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# 生成環(huán)形數(shù)據(jù)集(500個樣本)
X1, y1=datasets.make_circles(n_samples=500, factor=0.5, noise=0.07, random_state=0)
# 生成點(diǎn)塊數(shù)據(jù)集(80個樣本)
X2, y2 = datasets.make_blobs(n_samples=80, n_features=2, centers=[[1.2, 1.2]], cluster_std=[[0.15]], random_state=0)
# 合并成一個數(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é)果:
從算法的輸出中可以看到,對于環(huán)形數(shù)據(jù)集,上述三種聚類算法均不能很好地實(shí)現(xiàn)任務(wù)規(guī)定的聚類目標(biāo)。
1.3 使用DBSCAN算法(不指定參數(shù))
from sklearn.cluster import DBSCAN
# 使用無參數(shù)的DBSCAN聚類,發(fā)現(xiàn)模型將所有樣本歸為了一類
y_pred = DBSCAN().fit_predict(X)
# 畫散點(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)參,該算法的兩個主要參數(shù)eps和min_samples,對于聚類結(jié)果的影響很大。
# eps-臨近半徑
# min_samples-最小樣本數(shù)
# 指定參數(shù),調(diào)參,任務(wù)完成(聚成內(nèi)、中、外3類)
y_pred = DBSCAN(eps=0.2, min_samples=2).fit_predict(X)
# 畫散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
輸出結(jié)果:
可以看到,通過調(diào)參,DBSCAN算法完美地將數(shù)據(jù)集按指定要求聚成了3類。
2、新月數(shù)據(jù)集聚類
任務(wù)描述:
1、使用scikit-learn生成新月數(shù)據(jù)集;
2、將數(shù)據(jù)集聚成右側(cè)上下2個類別。
2.1 生成數(shù)據(jù)集
import matplotlib.pyplot as plt
from sklearn import datasets
# 生成彎月數(shù)據(jù)集(500個樣本)
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é)果:(對于該數(shù)據(jù)集,上述三種聚類算法不能很好地實(shí)現(xiàn)指定聚類目標(biāo)。)
2.3 使用DBSCAN聚類算法,不指定參數(shù)
from sklearn.cluster import DBSCAN
# 使用DBSCAN算法(不指定參數(shù))
y_pred = DBSCAN().fit_predict(X)
# 畫散點(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)
# 畫散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=y_pred, s = 100, alpha = 0.6, cmap = 'rainbow')
plt.show()
顯示結(jié)果:
通過調(diào)整兩個指定參數(shù),DBSCAN算法按照要求完成了新月數(shù)據(jù)集的聚類,DBSCAN算法的一大優(yōu)勢是可以對任意形狀的數(shù)據(jù)集進(jìn)行聚類。
3、使用輪廓系數(shù)(silhouette_score)來評估聚類
任務(wù)描述:
輪廓系數(shù)(silhouette_score)指標(biāo)是聚類效果的評價方式之一(前面我們還使用了蘭德指數(shù)-adjusted_rand_score,注意它們之間的區(qū)別)。輪廓系數(shù)指標(biāo)不關(guān)注樣本的實(shí)際類別,而是通過分析聚類結(jié)果中樣本的內(nèi)聚度和分離度兩種因素來給出成績,取值范圍為(-1,1),值越大代表聚類的結(jié)果越合理。
3.1 生成數(shù)據(jù)集
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 使用數(shù)據(jù)生成器隨機(jī)生成500個樣本,每個樣本2個特征
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)
# 畫出散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()
顯示結(jié)果:
文章來源:http://www.zghlxwxcb.cn/news/detail-482947.html
3.2 使用輪廓系數(shù)來評估聚類結(jié)果
from sklearn.metrics import silhouette_score # 輪廓系數(shù)評估函數(shù)
from sklearn.cluster import MeanShift
# 使用MeanShift聚類
y_pred = MeanShift().fit_predict(X)
# 畫出聚類散點(diǎn)圖
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
# 評估輪廓系數(shù)
score = silhouette_score(X, y_pred)
print('score: ', score)
文章來源地址http://www.zghlxwxcb.cn/news/detail-482947.html
到了這里,關(guān)于密度聚類算法(DBSCAN)實(shí)驗(yàn)案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!