從零開始學Python【31】—DBSCAN聚類(實戰部分)

2021-02-21 數據分析1480
前言

在《從零開始學Python【30】--DBSCAN聚類(理論部分)》一文中我們側重介紹了有關密度聚類的理論知識,涉及的內容包含密度聚類中的一些重要概念(如核心對象、直接密度可達、密度相連等)和密度聚類的具體步驟。在本次文章中,我們將通過一個小的數據案例,講解如何基於Python實現密度聚類的實戰。

函數說明

在Python的sklearn模塊中,cluster子模塊集成了常用的聚類算法,如K均值聚類、密度聚類和層次聚類等。對於密度聚類而言,讀者可以直接調用cluster子模塊中的DBSCAN「類」,有關該「類」的語法和參數含義如下:

cluster.DBSCAN(eps=0.5, min_samples=5, metric='euclidean',               metric_params=None, algorithm='auto',               leaf_size=30, p=None, n_jobs=1)eps:用於設置密度聚類中的ε領域,即半徑,默認為0.5;min_samples:用於設置ε領域內最少的樣本量,默認為5;metric:用於指定計算點之間距離的方法,默認為歐氏距離;metric_params:用於指定metric所對應的其他參數值;algorithm:在計算點之間距離的過程中,用於指點搜尋最近鄰樣本點的算法;默認為'auto',表示密度聚類會自動選擇一個合適的搜尋方法;如果為'ball_tree',則表示使用球樹搜尋最近鄰;如果為'kd_tree',則表示使用K-D樹搜尋最近鄰;如果為'brute',則表示使用暴力法搜尋最近鄰;leaf_size:當參數algorithm為'ball_tree'或'kd_tree'時,用於指定樹的葉子節點中所包含的最多樣本量,默認為30;該參數會影響搜尋樹的構建和搜尋最近鄰的速度;p:當參數metric為閔可夫斯基距離時('minkowski'),p=1,表示計算點之間的曼哈頓距離;p=2,表示計算點之間的歐氏距離;該參數的默認值為2;n_jobs:用於設置密度聚類算法並行計算所需的CPU數量,默認為1表示僅使用1個CPU運行算法,即不使用並行運算功能;

需要說明的是,在DBSCAN「類」中,參數eps和min_samples需要同時調參,即通常會指定幾個候選值,並從候選值中挑選出合理的閾值;在參數eps固定的情況下,如果參數min_samples越大,所形成的核心對象就越少,往往會誤判出許多異常點,聚成的簇數目也會增加,反之,會產生大量的核心對象,導致聚成的簇數目減少;在參數min_samples固定的情況下,參數eps越大,就會導致更多的點落入到ε領域內,進而使核心對象增多,最終使聚成的簇數目減少,反之,會導致核心對象大量減少,最終聚成的簇數目增多。在參數eps和min_samples不合理的情況下,簇數目的增加或減少往往都是錯誤的,例如應該聚為一類的樣本由於簇數目的增加而聚為多類;不該聚為一類的樣本由於簇數目的減少而聚為一類。

算法實戰

在密度聚類算法的實戰部分,我們將使用國內31個省份的人口出生率和死亡率數據作為分析對象。首先,將數據讀入到Python中,並繪製出生率和死亡率數據的散點圖,代碼如下:

Province = pd.read_excel(r'C:\Users\Administrator\Desktop\Province.xlsx')Province.head()
plt.scatter(Province.Birth_Rate, Province.Death_Rate)
plt.xlabel('Birth_Rate')plt.ylabel('Death_Rate')
plt.show()

上圖所示,31個點分別代表了各省份人口的出生率和死亡率,通過肉眼,就能夠快速地發現三個簇,即圖中的虛線框,其他不在圈內的點可能就是異常點了。接下來利用密度聚類對該數據集進行驗證,代碼如下:

from sklearn import preprocessing
from sklearn import cluster
import numpy as np

predictors = ['Birth_Rate','Death_Rate']
X = preprocessing.scale(Province[predictors])X = pd.DataFrame(X)

res = []
for eps in np.arange(0.001,1,0.05):    
       for min_samples in range(2,10):        dbscan = cluster.DBSCAN(eps = eps, min_samples = min_samples)        
               dbscan.fit(X)        
               n_clusters = len([i for i in set(dbscan.labels_) if i != -1])        
               outliners = np.sum(np.where(dbscan.labels_ == -1, 1,0))        
               stats = str(pd.Series([i for i in dbscan.labels_ if i != -1]).value_counts().values)        res.append({'eps':eps,'min_samples':min_samples,'n_clusters':n_clusters,'outliners':outliners,'stats':stats})
       
df = pd.DataFrame(res)
df.loc[df.n_clusters == 3, :]

如上表所示,如果需要將數據聚為3類,則得到如上幾種參數組合,這裡不妨選擇eps為0.801,min_samples為3的參數值(因為該參數組合下的異常點個數比較合理)。接下來,利用如上所得的參數組合,構造密度聚類模型,實現原始數據集的聚類,代碼如下:

dbscan = cluster.DBSCAN(eps = 0.801, min_samples = 3)
dbscan.fit(X)Province['dbscan_label'] = dbscan.labels_
sns.lmplot(x = 'Birth_Rate', y = 'Death_Rate', hue = 'dbscan_label', data = Province,           markers = ['*','d','^','o'], fit_reg = False, legend = False)
for x,y,text in zip(Province.Birth_Rate,Province.Death_Rate, Province.Province):    plt.text(x+0.1,y-0.1,text, size = 8)
plt.hlines(y = 5.8, xmin = Province.Birth_Rate.min(), xmax = Province.Birth_Rate.max(),           linestyles = '--', colors = 'red')plt.vlines(x = 10, ymin = Province.Death_Rate.min(), ymax = Province.Death_Rate.max(),           linestyles = '--', colors = 'red')
plt.xlabel('Birth_Rate')plt.ylabel('Death_Rate')
plt.show()

如上圖所示,三角形、菱形和圓形所代表的點即為三個不同的簇,五角星所代表的點即為異常點,這個聚類效果還是非常不錯的,對比建模之前的結論非常吻合。從上圖可知,以北京、天津、上海為代表的省份屬於低出生率和低死亡率類型廣東、寧夏和新疆三個省份屬於高出生率和低死亡率類型江蘇、四川、湖北為代表的省份屬於高出生率和高死亡率類型四個異常點中,黑龍江與遼寧比較相似,屬於低出生率和高死亡率類型;山東省屬於極高出生率和高死亡率的省份;西藏屬於高出生率和低死亡率的省份,但它與廣東、寧夏和新疆更為相似。

結語

OK,關於使用Python完成密度聚類的實戰我們就分享到這裡,在我的新書《從零開始學Python數據分析與挖掘》中,對密度聚類算法的落地也作了更多的講解。如果你有任何問題,歡迎在公眾號的留言區域表達你的疑問。同時,也歡迎各位朋友繼續轉發與分享文中的內容,讓更多的人學習和進步。

數據分析1480   

學習與分享,取長補短,關注小號!

相關焦點

  • 從零開始學Python【30】--DBSCAN聚類(理論部分)
    往期經典回顧從零開始學Python【29】--K均值聚類(實戰部分)從零開始學
  • 【他山之石】DBSCAN密度聚類算法(理論+圖解+python代碼)
    6、用Python實現DBSCAN聚類算法一、前言 去年學聚類算法的R語言的時候,有層次聚類、系統聚類、K-means聚類、K中心聚類,最後呢,被DBSCAN聚類算法迷上了。為什麼呢,首先它可以發現任何形狀的簇,其次我認為它的理論也是比較簡單易懂的,今年在python這門語言上我打算好好研究DBSCAN。
  • DBSCAN聚類算法原理總結
    DBSCAN算法實戰5  DBSCAN算法的優缺點DBSCAN算法處理後的聚類樣本點分為:核心點(core points),邊界點(border points)和噪聲點(noise),這三類樣本點的定義如下:核心點:對某一數據集D,若樣本p的
  • 詳解DBSCAN聚類
    如果選取的epsilon太小,很大一部分數據將不會被聚類,而一個大的epsilon值將導致聚類簇被合併,大部分數據點將會在同一個簇中。一般來說,較小的值比較合適,並且作為一個經驗法則,只有一小部分的點應該在這個距離內。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    本課程為python教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精
  • 如何從零開始學Python
    如何從零開始學python?書聲琅琅教育番茄老師介紹,零基礎的朋友學python相對來講難度要大,但是很多python大牛都是從零基礎上來的,對於這些python大牛來講,參加合理的培訓指導和有一套python學習路線是分不開的,有目標有計劃的學習才能更加高效。
  • 從零開始學Python數據分析【21】--線性回歸(實戰部分)
    從零開始學Python數據分析【1】--數據類型及結構從零開始學Python數據分析【2】-- 數值計算及正則表達式從零開始學Python數據分析【3】-- 控制流與自定義函數從零開始學Python數據分析【4】-- numpy從零開始學Python數據分析【5】-- pandas(序列部分)從零開始學Python數據分析
  • 從零開始學Python數據分析【25】--嶺回歸及LASSO回歸(實戰部分)
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析
  • 從零開始學Python【25】--嶺回歸及LASSO回歸(實戰部分)
    往期回顧從零開始學Python【24】--嶺回歸及LASSO回歸(理論部分)
  • 有了K均值聚類,為什麼還需要DBSCAN聚類算法?
    所有聚類法都使用相同的方法,即首先計算相似度,然後使用相似度將數據點聚類為組或群。本文將重點介紹具有噪聲的基於密度的聚類方法(DBSCAN)。既然已經有了K均值聚類,為什麼還需要DBSCAN這樣的基於密度的聚類算法呢?K均值聚類可以將鬆散相關的觀測聚類在一起。
  • 機器學習之一:聚類實戰
    導讀可預見的未來數據分析和機器學習將成為工作中必備技能,也許已經在某個項目中討論怎麼調參優化,就像過去討論如何優雅的寫python、如何避免C++內存洩露一樣常見。一、簡單介紹聚類算法1、聚類的定義聚類就是對大量未知標註的數據集,按數據的內在相似性將數據集劃分為多個類別,使類別內的數據相似度較大而類別間的數據相似度較小。
  • 從零開始學Python數據分析【22】--線性回歸診斷(第一部分)
    從零開始學Python數據分析【1】--數據類型及結構從零開始學Python數據分析【2】-- 數值計算及正則表達式從零開始學Python數據分析【3】-- 控制流與自定義函數從零開始學Python數據分析【4】-- numpy從零開始學Python數據分析【5】-- pandas(序列部分)從零開始學Python數據分析
  • 從零開始學Python數據分析【4】-- numpy
    數據加載numpy模塊還提供了讀取數據與寫數據的函數,方便我們將外部數據文件讀入到Python的工作環境中。這裡推薦兩個讀數據的函數:>通過使用numpy模塊中的savetxt函數實現python數據的寫出,函數語法如下:np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ')fname:指定數據寫出的路徑X
  • 回歸、分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R...
    選自EliteDataScience機器之心編譯參與:蔣思源、晏奇在本教程中,作者對現代機器學習算法進行一次簡要的實戰梳理。雖然類似的總結有很多,但是它們都沒有真正解釋清楚每個算法在實踐中的好壞,而這正是本篇梳理希望完成的。因此本文力圖基於實踐中的經驗,討論每個算法的優缺點。而機器之心也在文末給出了這些算法的具體實現細節。
  • ...分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R實現)
    選自EliteDataScience機器之心編譯參與:蔣思源、晏奇在本教程中,作者對現代機器學習算法進行一次簡要的實戰梳理。雖然類似的總結有很多,但是它們都沒有真正解釋清楚每個算法在實踐中的好壞,而這正是本篇梳理希望完成的。因此本文力圖基於實踐中的經驗,討論每個算法的優缺點。而機器之心也在文末給出了這些算法的具體實現細節。
  • 從零開始學Python,帶你手把手實戰(一)
    大家好,最近有些小夥伴在後臺給我留言說想要一些Python的實戰項目,能夠動手寫下代碼來實戰練習一下Python。我整理了一下我之前搜集的一些資料以及我個人的一些理解,給大家開設了這個專題。當然這個難度也是從淺入深的,所以剛開始肯定是新手向,基本面向純小白。如果你已經有一定編程能力,還請不要嫌棄太簡單。好了,廢話不多說,開始進入今天的課題。
  • 從零開始學Python數據分析【16】-- matplotlib(雷達圖)
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析
  • Python 從零開始--入門篇
    從這篇文章開始我將分享 python 系列,從 ptyhon 的起始發展,到現在的方方面面, 從最基礎的語法開始,大家一起學習
  • 三種聚類方法的介紹及其R語言實現
    聚類分析的類型包括兩種Q型聚類(對樣品聚類)、R型聚類(對變量聚類)。一、聚類分析介紹聚類分析方法包括很多種,例如:系統聚類法、動態聚類法、模糊聚類法、密度聚類法等,本文主要介紹的是系統聚類法、動態聚類法與密度聚類法。
  • 從零開始學Python【4】--numpy
    數據寫出通過使用numpy模塊中的savetxt函數實現python數據的寫出,函數語法如下:np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ')