《Python數據分析與機器學習實戰-唐宇迪》讀書筆記第16章--聚類算法

python數據分析個人學習讀書筆記-目錄索引

第16章聚類算法

   分類和迴歸算法在推導過程中都需要數據標籤,也就是有監督問題。那麼,如果數據本身沒有標籤,如何把它們按堆進行劃分呢?這時候聚類算法就派上用場了,本章選擇聚類算法K-means與DBSCAN進行原理講解與實例演示。

16.1K-means算法

   K-means是聚類算法中最經典、最實用,也是最簡單的代表,它的基本思想直截了當,效果也不錯。

16.1.1聚類的基本特性

   對於一份沒有標籤的數據,有監督算法就會無從下手,聚類算法能夠將數據進行大致的劃分,最終讓每一個數據點都有一個固定的類別。

  無監督數據集樣本點分佈如圖16-1所示,這些數據樣本點大概能分成3堆,使用聚類算法的目的就是把數據按堆進行劃分,看起來不難,但實際中數據維度通常較高,這種樣本點只能當作講解時的理想情況,所以聚類算法通常解決問題的效果遠不如有監督算法。

   邀月工作室

  圖16-1 無監督數據集樣本點分佈

  聚類的最終結果如圖16-2所示,即給每一個樣本數據打上一個標籤,明確指明它是屬於什麼類別(這裏用顏色深淺來表示)。

  不同的聚類算法得到的結果差異會比較大,即便同一種算法,使用不同參數時的結果也是完全不同。由於本身的無監督性,使得結果評估也成爲一個難題,最終可以得到每個樣本點各自的劃分,但是效果怎麼樣卻很難解釋,所以聚類還存在如何自圓其說的一個問題。

  一般情況下,當有數據標籤的時候,還是老老實實地用有監督算法,實在沒辦法再選聚類。

   邀月工作室

  圖16-2 聚類算法結果

  先提出一些聚類算法存在的問題,這些都是實際中必然會遇到的。但並不是所有數據都能漂漂亮亮帶着標籤呈現在大家面前,無監督算法還是機器學習中一個非常重要的分支,算法本身並沒有優劣之分,還是依據實際任務進行選擇。

16.1.2K-means算法原理

   對K-means算法最直截了當的講解方式,就是看它劃分數據集的工作流程。

  • 第①步:拿到數據集後,可能不知道每個數據樣本都屬於什麼類別,此時需要指定一個K值,明確想要將數據劃分成幾堆。例如,圖16-3所示數據點分成兩堆,這時K值就是2,但是,如果數據集比較複雜,K值就難以確定,需要通過實驗進行對比。本例假設給定K值等於2,意味着想把數據點劃分成兩堆。
  • 第②步:既然想劃分成兩堆,需要找兩個能夠代表每個堆的中心的點(也稱質心,就是數據各個維度的均值座標點),但是劃分前並不知道每個堆的中心點在哪個位置,所以需要隨機初始化兩個座標點,如圖16-4所示。
  • 第③步:選擇兩個中心點後,就要在所有數據樣本中進行遍歷,看看每個數據樣本應當屬於哪個堆。對每個數據點分別計算其到兩個中心點之間的距離,離哪個中心點近,它就屬於哪一堆,如圖16-5所示。距離值可以自己定義,一般情況下使用歐氏距離。
  • 第④步:第②步找的中心點是隨機選擇的,經過第③步,每一個數據都有各自的歸屬,由於中心點是每個堆的代表,所以此時需要更新兩個堆各自的中心點。做法很簡單,分別對不同歸屬的樣本數據計算其中心位置,計算結果變成新的中心點,如圖16-6所示。

   邀月工作室

  ▲圖16-3 K-means樣本數據

   邀月工作室

  ▲圖16-4 選擇中心點

   邀月工作室

  ▲圖16-5 計算所有樣本歸屬

   邀月工作室

  ▲圖16-6 重新計算中心點

  • 第⑤步:數據點究竟屬於哪一堆?其衡量標準是看這些數據點離哪個中心點更近,第④步已經更新了中心點的位置,每個數據的所屬也會發生變化,此時需要重新計算各個數據點的歸屬,計算距離方式相同,如圖16-7所示。
  • 第⑥步:至此,樣本點歸屬再次發生變化,所以需要重新計算中心點,總之,只要數據所屬發生變化,每一堆的中心點也會發生改變,如圖16-8所示。

   邀月工作室

  ▲圖16-7 重新計算樣本點歸屬

   邀月工作室

  ▲圖16-8 再次更新中心點

  • 第⑦步:接下來就是重複性工作,反覆進行迭代,不斷求新的中心點位置,然後更新每一個數據點所屬,最終,當中心點位置不變,也就是數據點所屬類別固定下來時,就完成了K-means算法,也就得到每一個樣本點的最終所屬類別。

16.1.3K-means涉及參數

   (1)K值的確定。K值決定了待分析的數據會被劃分成幾個簇。當K=3時,數據就會分成3個簇;K=4時,數據就會被劃分成4個簇(相當於在開始階段隨機初始化多少箇中心點)。對於一份數據來說,需要明確地告訴算法,想要把數據分成多少份,即選擇不同的K值,得到的結果是完全不同的。

  圖16-9展示了分別選擇K值等於3和4時的結果,這也說明K-means算法中最核心的目的就是要將數據劃分成幾個堆,對於簡單的數據可以直接給出合適的K值,但實際中的數據樣本量和特徵個數通常規模較大,很難確定具體的劃分標準。所以如何選擇K值始終是K-means算法中最難解決的一個問題。

 邀月工作室

  圖16-9 K值對結果的影響

(3)質心的選擇。選擇適當的初始質心是K-means算法的關鍵步驟,通常都是隨機給出,那麼如果初始時選擇的質心不同,會對結果產生影響嗎?或者說每一次執行K-means後的結果都相同嗎?大部分情況下得到的結果都是一致的,但不能保證每次聚類的結果都相同,接下來通過一組對比實驗觀察K-menas建模效果。

  第一次隨機初始中心點聚類後結果如圖16-10所示,此時看起來劃分得還不錯,下面重新來一次,選擇不同的初始位置,再來看看結果是否一致。

邀月工作室

 

  ▲圖16-10 K-means算法迭代流程

 邀月工作室

 

  ▲圖16-10 K-means算法迭代流程(續)

  不同初始點位置結果如圖16-11所示,可以明顯看出,這兩次實驗的結果相差非常大,由於最初質心選擇不同,導致最終結果出現較大的差異,所以在K-means算法中,不一定每次的結果完全相同,也可能出現差異。

 邀月工作室

邀月工作室

 

  圖16-11 不同初始點位置結果

  由於初始位置會對結果產生影響,所以,只做一次實驗是不夠的。

  (3)距離的度量。常用的距離度量方法包括歐氏距離和餘弦相似度等。距離的選擇也可以當作是K-means的一種參數,不同度量方式會對結果產生不同的影響。

  (4)評估方法。聚類算法由於本身的無監督性,沒法用交叉驗證來評估結果,只能大致觀察結果的分佈情況。輪廓係數(Silhouette Coefficient)是聚類效果好壞的一種評價方式,也是最常用的評估方法,計算方法如下。

  • 1.計算樣本i到同簇其他樣本的平均距離a(i)。a(i)越小,說明樣本i越應該被聚類到該簇。將a(i)稱爲樣本i的簇內不相似度。
  • 2.計算樣本i到其他某簇Cj的所有樣本的平均距離bij,稱爲樣本i與簇Cj的不相似度。定義爲樣本i的簇間不相似度:b(i)=min{bi1,bi2,…,bik}。
  • 3.根據樣本i的簇內不相似度a(i)和簇間不相似度b(i),定義樣本i的輪廓係數。

 邀月工作室

  如果s(i)接近1,則說明樣本i聚類合理;s(i)接近-1,則說明樣本i更應該分類到另外的簇;若s(i)近似爲0,則說明樣本i在兩個簇的邊界上。所有樣本的s(i)的均值稱爲聚類結果的輪廓係數,它是該聚類是否合理、有效的度量。

16.1.4K-means聚類效果與優缺點

   K-means算法對較爲規則的數據集劃分的效果還是不錯的,如圖16-12所示。

 邀月工作室

  圖16-12 常規數據集劃分結果

  但如果數據集是非規則形狀,做起來就比較困難,例如,笑臉和環繞形數據集用K-means很難劃分正確(見圖16-13)。

   邀月工作室

  圖16-13 非常規數據集劃分結果

  K-means算法雖然簡單,但並不適用所有數據集,在無監督算法中想要發現問題十分困難,因爲沒有實際標籤,使得評估任務很難進行,所以只能依靠實際情況具體分析。

最後,總結一下K-means算法的優缺點。

  優點:

    1.快速、簡單,概括來說就是很通用的算法。

    2.聚類效果通常還是不錯的,可以自己指定劃分的類別數。

    3.可解釋性較強,每一步做了什麼都在掌控之中。

  缺點:

    1.在K-means算法中,K是事先給定的,這個K值是非常難以估計的。很多時候,事先並不知道給定的數據集應該分成多少個類別才合適。

    2.初始質心點的選擇有待改進,可能會出現不同的結果。

    3.在球形簇上表現效果非常好,但是其他類型簇中效果一般。

 

16.2DBSCAN聚類算法

   在K-means算法中,需要自己指定K值,也就是確定最終要得到多少個類別,那麼,能不能讓算法自動決定數據集劃分成多少個類別呢?那些不規則的簇該怎麼解決呢?下面介紹的DBSCAN算法就能在一定程度上解決這些問題。

16.2.1DBSCAN算法概述

   DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法常用於異常檢測,它的注意力放在離羣點上,所以,當大家在無監督問題中遇到檢測任務的時候,它肯定是首選。

  在介紹建模流程之前,需要了解它的一些基本概念,略微比K-means算法複雜。

  • (1)ϵ-鄰域:給定對象半徑r內的鄰域。K-means算法是基於距離計算的,但是在DBSCAN中,最核心的參數是半徑,會對結果產生較大影響。
  • (2)核心點:如果對象的ϵ-鄰域至少包含一定數目的數據點,則稱該數據點爲核心對象,說明這個數據點周圍比較密集。
  • (3)邊界點:邊界點不是核心點,但落在某個核心點的鄰域內,也就是在數據集中的邊界位置。
  • (4)離羣點:既不是核心點,也不是邊界點的其他數據點,也就是數據點落單了。

  直接從概念上理解這些點可能有些抽象,結合圖16-14,再想一想營銷的概念,就容易理解了。

   邀月工作室

  圖16-14 DBSCAN數據樣本點

  已知每個圓的半徑r相同。黑色點表示核心對象,周圍比較密集,從每一個核心點發展出發都能將其他一部分數據點發展成爲其營銷對象(也就是其半徑r鄰域內圈到的數據點)。空心點表示邊界點,這些點成爲核心點的銷售對象之後,不能再繼續發展其他銷售對象,所以到它們這裏就結束了,成爲邊界。點N在另一邊熱火朝天地幹着營銷方案,附近啥動靜都沒有,沒有數據點來發展它,它也不能發展其他數據點,就是離羣點。

  密度可達和直接密度可達是DBSCAN算法中經常用到的兩個概念。對於一個數據點來說,它直接的銷售對象就是直接密度可達,通過它的已銷售下屬間接發展的就是密度可達。大家在理解DBSCAN的時候,從營銷的角度去看這些數據點就容易多了。

16.2.2DBSCAN工作流程

   DBSCAN算法的工作流程跟營銷的模式類似,先來看看它的建模流程,如圖16-15所示。

  還是同樣的數據集,算法首先會選擇一個銷售初始點,例如圖中黑色部分的一個數據點,然後以r爲半徑開始畫圓,凡是能被它及其下屬圈到的數據點都是屬於同一類別,如圖16-16所示。

  隨着銷售組織的壯大,越來越多的數據點被其同化成同一類別,不僅初始的數據點要發展銷售對象,凡是被它發展的數據樣本也要繼續發展其他數據點。當這個地方被全部發展完之後,相當於這個組織已經成型,接下來算法會尋找下一個銷售地點。

  此時算法在新的位置上建立另一片銷售地點,由於此處並不是由之前的組織發展過來的,所以它們不屬於一個類別,新發展的這一片就是當前數據集中第二個類別,如圖16-17所示。跟之前的做法一致,當這片銷售地點全部發展完之後,還會尋找下一個地點。

   邀月工作室

  圖16-15 DBSCAN建模流程

   邀月工作室

  圖16-16 DBSCAN數據點歸屬

  此時正在進行的就是第3個類別,大家也應該發現,事前並沒有給出最終想劃分成多少個類別,而是由算法在數據集上實際執行的過程來決定,如圖16-18所示。最終當所有數據點都被遍歷一遍之後整個DBSCAN聚類算法就完成了。

   邀月工作室

  ▲圖16-17 DBSCAN新類別產生

   

邀月工作室

  ▲圖16-18 DBSCAN類別劃分

  最後當所有能發展的基地與數據點都完成任務後,剩下的就是離羣點了,這裏用圓圈標註起來了,如圖16-19所示。由於DBSCAN算法本身的代表就是檢測任務,這些離羣點就是任何組織都發展不了它們,它們也不會發展其他數據點。

  下面總結一下DBSCAN算法的建模流程,如圖16-20所示。

   邀月工作室

  ▲圖16-19 DBSCAN離羣點

   邀月工作室

  ▲圖16-20 DBSCAN算法的建模流程

16.2.3半徑對結果的影響

   在建模流程中,需要指定半徑的大小r,r也是算法中對結果影響很大的參數,先來看看在使用不同半徑時的差異,如圖16-21所示。

   邀月工作室

  圖16-21 半徑對聚類結果的影響

  不同半徑意味着發展銷售對象時畫圓的大小發生了變化,通常情況下,半徑越大,能夠發展的對象越多,整體的類別偏少,離羣點也會偏少;而半徑較小的時候,由於發展能力變弱,出現的類別就會偏多,離羣點也會偏多。

  可以明顯看到,半徑不同得到的結果相差非常大,尤其是在類別上,所以半徑是影響DBSCAN算法建模效果的最直接因素。但是問題依舊是無監督所導致的,沒辦法用交叉驗證來選擇最合適的參數,只能依靠一些類似經驗值的方法。

  之前用K-means算法嘗試劃分了一個笑臉,得到的效果並不好,下面用DBSCAN算法試一試。

  DBSCA聚類結果如圖16-22所示,看起來劃分效果非常好,由於其原理是基於密度的營銷方式,所以可以輕鬆解決這種環繞形數據,不僅如此,DBSCAN還適用於任意形狀的簇,無論多麼特別,只要數據點能按密度扎堆就能搞定,如圖16-23所示。

   邀月工作室

  ▲圖16-22 DBSCAN聚類結果

   邀月工作室

  ▲圖16-23 DBSCAN聚類不規則數據集

  DBSCAN聚類算法的主要優點如下:

    1.可以對任意形狀的稠密數據集進行聚類,而K-means之類的聚類算法一般只適用於球狀數據集;

    2.非常適合檢測任務,尋找離羣點;

    3.不需要手動指定聚類的堆數,實際中也很難知道大致的堆數。

  DBSCAN的主要缺點如下:

    1.如果樣本集的密度不均勻、聚類間距差相差很大時,聚類效果較差;

    2.半徑的選擇比較難,不同半徑的結果差異非常大。

  DBSCAN算法總體來說還是非常實用的,也是筆者很喜歡的聚類算法,首先不需要人爲指定最終的結果,而且可以用來分析離羣點,是檢測任務的首選算法。筆者在很多實際問題中對比過不同的聚類算法,得出的結論基本都是DBSCAN算法要略好一些,所以當大家遇到無監督問題的時候,一定要來試試DBSCAN算法的效果。

 

16.3聚類實例

   下面給大家演示一個簡單的小例子,根據啤酒中配料含量的不同進行聚類,以劃分出不同品牌的啤酒。

  首先讀取數據,代碼如下:

1 import pandas as pd
2 beer = pd.read_csv('data.txt', sep=' ')
3 beer

  邀月工作室

1 X = beer[["calories","sodium","alcohol","cost"]]
2 from sklearn.cluster import KMeans
3 
4 km = KMeans(n_clusters=3).fit(X)
5 km2 = KMeans(n_clusters=2).fit(X)
1 km.labels_
array([0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0, 1, 0, 0, 1, 2])

  參數n_clusters=3表示使用3個堆做聚類,爲了對比實驗,再建模一次,令n_clusters=2,並分別指定得到的標籤結果。

1 beer['cluster'] = km.labels_
2 beer['cluster2'] = km2.labels_
3 beer.sort_values('cluster')

邀月工作室

  計算劃分後各堆均值來統計分析,代碼如下:

1 # from pandas.tools.plotting import scatter_matrix
2 # ModuleNotFoundError: No module named 'pandas.tools'
3 from pandas.plotting import scatter_matrix
4 %matplotlib inline
5 
6 cluster_centers = km.cluster_centers_
7 
8 cluster_centers_2 = km2.cluster_centers_
1 beer.groupby("cluster").mean()
     calories     sodium     alcohol     cost     cluster2
cluster                     
0     150.00     17.0     4.521429     0.520714     1
1     70.00     10.5     2.600000     0.420000     0
2     102.75     10.0     4.075000     0.440000     0
1 beer.groupby("cluster2").mean()
    calories     sodium     alcohol     cost     cluster
cluster2                     
0     91.833333     10.166667     3.583333     0.433333     1.666667
1     150.000000     17.000000     4.521429     0.520714     0.000000

 

  通過均值可以查看哪些數據指標出現了差異,以便幫助分析,僅看數值不太直觀,還是繪圖比較好一些:

 1 centers = beer.groupby("cluster").mean().reset_index()
 2 
 3 %matplotlib inline
 4 import matplotlib.pyplot as plt
 5 plt.rcParams['font.size'] = 14
 6 
 7 import numpy as np
 8 colors = np.array(['red', 'green', 'blue', 'yellow'])
 9 
10 plt.scatter(beer["calories"], beer["alcohol"],c=colors[beer["cluster"]])
11 
12 plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black')
13 
14 plt.xlabel("Calories")
15 plt.ylabel("Alcohol")

邀月工作室

  上述代碼生成Alcohol和Calories兩個維度上的聚類結果,看起來數據已經按堆進行了劃分,但是數據集中有4個維度,還可以把聚類後兩兩特徵的散點圖分別進行繪製。

 

1 scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster"]], figsize=(10,10))
2 plt.suptitle("With 3 centroids initialized")

邀月工作室

  分析過程中也可以分別展示當K=2與K=3時結果的差異:

1 scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster2"]], figsize=(10,10))
2 plt.suptitle("With 2 centroids initialized")

邀月工作室

 1 from sklearn.preprocessing import StandardScaler
 2 scaler = StandardScaler()
 3 X_scaled = scaler.fit_transform(X)
 4 X_scaled
 5 
 6 km = KMeans(n_clusters=3).fit(X_scaled)
 7 
 8 beer["scaled_cluster"] = km.labels_
 9 beer.sort_values("scaled_cluster")
10 beer.groupby("scaled_cluster").mean()
11 
12 # pd.scatter_matrix(X, c=colors[beer.scaled_cluster], alpha=1, figsize=(10,10), s=100)
13 # AttributeError: module 'pandas' has no attribute 'scatter_matrix'
14 pd.plotting.scatter_matrix(X, c=colors[beer.scaled_cluster], alpha=1, figsize=(10,10), s=100)
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000025E1FF6FA88>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E1FFA4108>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E1FFC8C48>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E1FFFB048>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000025E2002B388>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E2005BB88>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E200936C8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E200C7BC8>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000025E200C7DC8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20101C08>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E1FCE5488>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20197088>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000025E203EBF08>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20425E88>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20460C88>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E2049AB08>]],
      dtype=object)

邀月工作室

  分別觀察K=2和K=3時的結果,似乎不太容易分辨哪個效果更好,此時可以引入輪廓係數進行分析,這也是一種評價聚類效果好壞的方式。

   邀月工作室

1 from sklearn import metrics
2 score_scaled = metrics.silhouette_score(X,beer.scaled_cluster)
3 score = metrics.silhouette_score(X,beer.cluster)
4 print(score_scaled, score)
0.1797806808940007 0.6731775046455796
1 scores = []
2 for k in range(2,20):
3     labels = KMeans(n_clusters=k).fit(X).labels_
4     score = metrics.silhouette_score(X, labels)
5     scores.append(score)
6 
7 scores
[0.6917656034079486,
 0.6731775046455796,
 0.5857040721127795,
 0.422548733517202,
 0.3879716094433995,
 0.43776116697963124,
 0.38946337473125997,
 0.39746405172426014,
 0.4081599013899603,
 0.41282646329875183,
 0.3459775237127248,
 0.31221439248428434,
 0.30707782144770296,
 0.31834561839139497,
 0.2849514001174898,
 0.23498077333071996,
 0.1588091017496281,
 0.08423051380151177]
1 plt.plot(list(range(2,20)), scores)
2 plt.xlabel("Number of Clusters Initialized")
3 plt.ylabel("Sihouette Score")

邀月工作室

  從上圖可以看出,當n_clusters=2時,輪廊係數更接近於1,更合適。但是在聚類算法中,評估方法只作爲參考,真正數據集來時還是要具體分析一番。在使用sklearn工具包進行建模時,換一個算法非常便捷,只需更改函數即可:

 1 from sklearn.cluster import DBSCAN
 2 db = DBSCAN(eps=10, min_samples=2).fit(X)
 3 
 4 labels = db.labels_
 5 
 6 beer['cluster_db'] = labels
 7 beer.sort_values('cluster_db')
 8 
 9 beer.groupby('cluster_db').mean()
10 
11 pd.plotting.scatter_matrix(X, c=colors[beer.cluster_db], figsize=(10,10), s=100)
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0000025E212C8D48>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E21380BC8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E212D38C8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20BE4D88>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20D3EC48>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20EA0508>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E21002E08>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E21427A08>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000025E21427B48>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E214CB5C8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20E8BB48>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20B13E48>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20B99CC8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E20C8EA88>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E2145E948>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0000025E214BE7C8>]],
      dtype=object)

邀月工作室

  從上圖可以看出DBSCAN建模結果存在一些問題,參數與數據預處理都會對結果產生影響,大家也可以看看不同半徑對結果產生的影響。

 

本章小結:

  本章介紹了兩種最常用的聚類算法——K-means和DBSCAN,其工作原理不同,在處理不同效果時也有一定差別。在使用時,需要先分析數據可能的分佈形狀,再選擇合適的算法,因爲它們在處理不同類型數據時各有優缺點。

  比較麻煩就是選擇參數,無論是K值還是半徑都是令人十分頭疼的問題,需要針對具體問題,選擇可行的評估方法後進行實驗對比分析。在建模過程中,如果大家遇到非常龐大的數據集,那麼無論使用哪種算法,速度都比較慢。這裏再給大家推薦另外一種算法——BIRCH算法,其核心計算方式是增量的,它的計算速度比K-means和DBSCAN算法快很多,但是整體效果不如K-means和DBSCAN,在優先考慮速度問題的時候可以嘗試BIRCH算法,在sklearn中包括多種算法的實現和對比實驗,圖16-24所示的效果圖就是各種算法最直觀的對比,其官網就是最好的學習資源。

   邀月工作室

  圖16-24 聚類算法效果對比

 

第16章完。

python數據分析個人學習讀書筆記-目錄索引

 

該書資源下載,請至異步社區:https://www.epubit.com

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章