日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Python机器学习——DBSCAN聚类

發布時間:2023/11/28 生活经验 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python机器学习——DBSCAN聚类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

密度聚類(Density-based Clustering)假設聚類結構能夠通過樣本分布的緊密程度來確定。DBSCAN是常用的密度聚類算法,它通過一組鄰域參數(??,MinPtsMinPts)來描述樣本分布的緊密程度。給定數據集DD={x??1,x??2,x??3,...,x??Nx→1,x→2,x→3,...,x→N},數據集屬性定義如下。

  • ??-鄰域:N?(x??i)N?(x→i)={x??j∈D|distance(x??i,x??j)x→j∈D|distance(x→i,x→j)≤?≤?},N?(x??i)N?(x→i)包含了樣本集DD中與x??ix→i距離不大于??的所有樣本。

  • 核心對象core object:若|N?(x??i)N?(x→i)|≥MinPts≥MinPts,則稱x??ix→i是一個核心對象。即:若x??ix→i的??-鄰域中至少包含MinPtsMinPts個樣本,則稱x??ix→i是一個核心對象。

  • 密度直達directly density-reachable:若x??ix→i是一個核心對象,且x??j∈x→j∈N?(x??i)N?(x→i),則稱x??jx→j由x??ix→i密度直達,記作x??ix→i–>x??jx→j。

  • 密度可達density-reachable:對于x??ix→i和x??jx→j,若存在樣本序列(p??0,p??1,p??2,...,p??m,p??m+1p→0,p→1,p→2,...,p→m,p→m+1),其中p??0p→0=x??ix→i,p??m+1p→m+1=x??jx→j,p??s∈D,s=1,2,...,mp→s∈D,s=1,2,...,m。如果p??s+1p→s+1由p??s,s=1,2,...,mp→s,s=1,2,...,m密度直達,則稱x??jx→j由x??ix→i密度可達,記作x??ix→i~>x??jx→j。

  • 密度相連density-connected:對于x??ix→i和x??jx→j,若存在x??kx→k,使得x??ix→i和x??jx→j均由x??kx→k密度可達,則稱x??jx→j由x??ix→i密度相連,記作x??ix→i~x??jx→j。

??DBSCAN算法的定義:給定鄰域參數(??,MinPtsMinPts),一個簇C?DC?D是滿足下列性質的非空樣本子集:

  • 接性connectivity:若x??i∈C,x??j∈Cx→i∈C,x→j∈C,則x??ix→i~x??jx→j
  • 大性maximality:若x??i∈Cx→i∈C,且→xi→xi~>x??jx→j,則x??j∈Cx→j∈C?
    即一個簇是由密度可達關系導出的最大的密度相連樣本集合。

??DBSCAN算法的思想:若x??x→為核心對象,則x??x→密度可達的所有樣本組成的集合X={x???∈D|x??x→?∈D|x→~>x???x→?},可以證明XX就是滿足連接性與最大性的簇。于是DBSCAN算法首選任選數據集中的一個核心對象作為種子seedseed,再由此出發確定相應的聚類簇。

下面給出DBSCAN算法:

  • 輸入

    • 數據集DD={x??1,x??2,x??3,...,x??Nx→1,x→2,x→3,...,x→N}
    • 鄰域參數(??,MinPtsMinPts)
  • 輸出:簇劃分CC={C1,C2,...,CkC1,C2,...,Ck}

  • 算法步驟如下:?
    • 初始化核心對象集合為空集:Ω=??
    • 尋找核心對象:遍歷所有的樣本點x??i,i=1,2,...,Nx→i,i=1,2,...,N,計算N?(x??i)N?(x→i),如果|N?(x??i)N?(x→i)|≥MinPts≥MinPts,則Ω=Ω??{x??ix→i}
    • 迭代:以任一未訪問過的核心對象為出發點,找出有其密度可達的樣本生成的聚類簇,直到所有的核心對象都被訪問為止

?

Python 實戰

?

??DBSCANDBSCAN是sciki?kearnsciki?kearn提供的密度聚類算法模型,其原型為:

class sklearn.cluster.DBSCAN(eps=0.5,min_samples=5,metric='euclidean',algorithm='auto',leaf_size=30,p=None,random_state=None)
  • 1

參數

  • epseps:??參數,用于確定鄰域大小。
  • min_samplesmin_samples:MinPtsMinPts參數,用于判斷核心對象。
  • metricmetric:一個字符串或可調用對象,用于計算距離。如果是字符串,則必須是在metrics.pairwise.calculate_distance中指定。
  • algorithmalgorithm:一個字符串,用于計算兩點間距離并找出最近鄰的點,可以為如下:?
    • ‘autoauto’:由算法自動取舍合適的算法。
    • ‘ball_treeball_tree’:用ball樹來搜索。
    • ‘kd_treekd_tree’:用kd樹搜索。
    • ‘brutebrute’:暴力搜索。
  • leaf_sizeleaf_size:一個整數,用于指定當algorithm=ball_tree或kd_tree時,樹的葉節點大小。該參數會影響構建樹,搜索最近鄰的速度,同時影響樹的內存。
  • random_staterandom_state:被廢棄的接口,將在scikit-learn v 0.18中移除。

屬性

  • core_sample_indices_core_sample_indices_:核心樣本在原始訓練集中的位置。
  • components_components_:核心樣本的一份副本。
  • labels_labels_:每個樣本所屬的簇標記。對于噪聲樣本,其簇標記為-1副本。

方法

  • fit(X[,y,sample_weight])fit(X[,y,sample_weight]):訓練模型。
  • fit_predict(X[,y,sample_weight])fit_predict(X[,y,sample_weight]):訓練模型并預測每個樣本所屬的簇標記。
#導包
from sklearn import cluster
from sklearn.metrics import adjusted_rand_score
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn import mixture
from sklearn.svm.libsvm import predict
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
#產生數據
def create_data(centers,num=100,std=0.7):X,labels_true = make_blobs(n_samples=num,centers=centers, cluster_std=std)return X,labels_true
  • 1
  • 2
  • 3
  • 4
"""數據作圖
"""
def plot_data(*data):X,labels_true=datalabels=np.unique(labels_true)fig=plt.figure()ax=fig.add_subplot(1,1,1)colors='rgbycm'for i,label in enumerate(labels):position=labels_true==labelax.scatter(X[position,0],X[position,1],label="cluster %d"%label),color=colors[i%len(colors)]ax.legend(loc="best",framealpha=0.5)ax.set_xlabel("X[0]")ax.set_ylabel("Y[1]")ax.set_title("data")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

#測試函數
def test_DBSCAN(*data):X,labels_true = dataclst = cluster.DBSCAN();predict_labels = clst.fit_predict(X)print("ARI:%s"%adjusted_rand_score(labels_true,predict_labels))print("Core sample num:%d"%len(clst.core_sample_indices_))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
#結果
ARI:0.330307120902
Core sample num:991
  • 1
  • 2
  • 3

??其中ARIARI指標為0.330307120902,該值越大越好,DBSCAN根據密度,將原始數據集劃分為991個簇。

下面考察??參數的影響:

def test_DBSCAN_epsilon(*data):X,labels_true = dataepsilons = np.logspace(-1,1.5)ARIs=[]Core_nums = []for epsilon in epsilons:clst = cluster.DBSCAN(eps=epsilon)predicted_labels = clst.fit_predict(X)ARIs.append(adjusted_rand_score(labels_true,predicted_labels))Core_nums.append(len(clst.core_sample_indices_))fig = plt.figure(figsize=(10,5))ax = fig.add_subplot(1,2,1)ax.plot(epsilons,ARIs,marker = '+')ax.set_xscale('log')ax.set_xlabel(r"$\epsilon$")ax.set_ylim(0,1)ax.set_ylabel('ARI')ax = fig.add_subplot(1,2,2)ax.plot(epsilons,Core_nums,marker='o')ax.set_xscale('log')ax.set_xlabel(r"$\epsilon$")ax.set_ylabel('Core_num')fig.suptitle("DBSCAN")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
centers = [[1,1],[1,2],[2,2],[10,20]]
X,labels_true = create_data(centers,1000,0.5)
test_DBSCAN_epsilon(X,labels_true)
  • 1
  • 2
  • 3

??參數的影響結果如上圖所示:

??可以看到ARIARI指數隨著??的增長,先上升后保持平穩,最后懸崖式下降。懸崖式下降是因為我們產生的訓練樣本的間距比較小,最遠的兩個樣本之間的距離不超過30,當??過大時,所有的點都在一個鄰域中。?
??樣本核心數量隨著??的增長而上升,這是因為隨著??的增長,樣本點的鄰域在擴展,則樣本點鄰域中的樣本會增多,這就產生了更多滿足條件的核心樣本點。但是樣本集中的樣本數量有限,因此核心樣本點的數量增長到一定數目后會趨于穩定。

下面接著考察MinPtsMinPts參數的影響:

def test_DBSCAN_min_samples(*data):X,labels_true=datamin_samples=range(1,100)ARIs=[]Core_nums=[]for num in min_samples:clst=cluster.DBSCAN(min_samples=num)predicted_labels=clst.fit_predict(X)ARIs.append(adjusted_rand_score(labels_true, predicted_labels))Core_nums.append(len(clst.core_sample_indices_))fig=plt.figure(figsize=(10,5))ax=fig.add_subplot(1,2,1)ax.plot(min_samples,ARIs,marker='+')ax.set_xlabel("min_samples")ax.set_ylim(0,1)ax.set_ylabel('ARI')ax=fig.add_subplot(1,2,2)ax.plot(min_samples,Core_nums,marker='o')ax.set_xlabel("min_samples")ax.set_ylabel('Core_nums')fig.suptitle("DBSCAN")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
centers = [[1,1],[1,2],[2,2],[10,20]]
X,labels_true = create_data(centers,1000,0.5)
test_DBSCAN_min_samples(X,labels_true)
  • 1
  • 2
  • 3

MinPtsMinPts參數的影響結果如下:

??可以看出ARIARI指數隨著MinPtsMinPts的增長,平穩地下降。而核心樣本數量隨著MinPtsMinPts的增長基本呈線性下降,這是因為隨著MinPtsMinPts的增長,樣本點的鄰域中必須包含更多的樣本才能使它成為一個核心點。因此產生的樣本點數量越來越少。

有關ARIARI,請參考:

總結

以上是生活随笔為你收集整理的Python机器学习——DBSCAN聚类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。