Python氣象數據處理與繪圖:聚類算法(K-means軌跡聚類)

2021-12-31 氣象學家

前一篇文章講到了軌跡的繪製,那麼今天就順著講下軌跡的聚類,比如說我們常見的,寒潮研究把寒潮的冷空氣路徑分為三類(西路,北路,西北路),或者颱風研究中也可以根據颱風的速度,或者拐點等要素對颱風軌跡分類研究,再比如降水可以對不同降水事件的水汽來源做聚類研究等等。
實際上NCL就可以實現聚類算法,官方提供了k-means的算法函數(kmeans_as136),這個函數筆者也用過,相比與Python的聚類可以說還是比較麻煩的。       另外我也見過大佬們用MetoInfo的軟體做軌跡和聚類研究,十分方便。

二、K-means聚類百度搜索python的K-means算法,可以得到的結果還是很多的,然而大部分都是基於鳶尾花數據實現的,例子有限,那我就結合我所使用的寒潮路徑數據來做個印證,對比起來更容易理解。

使用的數據是這樣的:

print(x.shape)print(y.shape)#(216, 68),216為216條路徑,68指每條路徑由68個時刻點構成。#(216, 68)

(這套數據是使用FLEXPART後向追蹤得到的,與我目前的論文有關,因此暫時不提供)
      首先調用庫
from sklearn.cluster import KMeans

      接著整合數據,因為我們的X和Y是兩個數組存放的,現在合併起來,這一步的方法有很多(concatenate,stack等等都可以),我給一個容易理解的方法:

traj = np.zeros((216,68,2))traj[:,:,0] = xtraj[:,:,1] = ytraj = traj.reshape((216,68*2))

最後的reshape我們得到了一個[216,136]的數組,要知道聚類是不會管你的點的實際物理意義的,對他來說都是數字而已,每一個時刻的一個點是由2個要素構成的,即經度和維度,那麼1條完整的路徑是由68*2個要素構成的,因此我們去聚類時,只要將需要考慮的要素全部按順序給進去就可以了,但是有一個問題是需要注意的,聚類時,如果要素過大,而樣本過少,就會導致信息熵很大,這樣的聚類雖然不能說有錯,但是起碼誤差很大,能否達到需要的效果就需要慎重考慮了,因此,當要素過大時,可以考慮用PCA方法或者其他手段,提取主成分,降低信息熵,對於一般的軌跡聚類,是不用考慮這些的,就比如這個例子,雖然我們給出了136個要素,但是效果還是符合預期的。
      那麼接下來就可以聚類了
km = KMeans(n_clusters=3)#構造聚類器km.fit(traj)#聚類label = km.labels_ #獲取聚類標籤

K-means需要我們實現給定標籤,這與層次聚類不同,層次聚類是兩兩最優合併,因此會得出一個聚類樹狀圖,根據結果選定聚類數。K-means則是事先給定聚類數,然後計算聚類效果(通過一些參數評估),不斷調整聚類數,最終確定聚類數。

      可以看到,216條路徑已經被分為了3種,我們現在逐類挑出即可
label0=np.array(np.where(labels==0))label1=np.array(np.where(labels==1))label2=np.array(np.where(labels==2))numlabel0=len(label0[0,:])numlabel1=len(label1[0,:])numlabel2=len(label2[0,:])#[0,:]是因為上面取出來的數據是兩維的,第一維是1,因此需要指定才可以獲取長度x0 = np.array([x[i,:]  for i in label0]).reshape((numlabel0,68))y0 = np.array([y[i,:]  for i in label0]).reshape((numlabel0,68))x1 = np.array([x[i,:]  for i in label1]).reshape((numlabel1,68))    y1 = np.array([y[i,:]  for i in label1]).reshape((numlabel1,68))     x2 = np.array([x[i,:]  for i in label2]).reshape((numlabel2,68))     y2 = np.array([y[i,:]  for i in label2]).reshape((numlabel2,68))

      這段就可以看出,python的代碼還是很簡潔的。
     那現在我們獲取了每一類的經度和緯度,按我上一篇文章的方法繪製即可。三、K-means聚類效果評估

最後,講一下K-means聚類的效果如何評估,通常用幾個參數來確定聚類數。這個要用數據說話,不能很主觀的我們想分幾類就分幾類。

1.SSE(簇內誤方差)

SSE參數的核心思想就是計算誤方差和,SSE的值越小,證明聚類效果越好,當然,聚類數越大,SSE必然是越小的,SSE的分布類似對數函數,是逐漸趨0的,同樣也類似對數函數,有一個突然的拐點,即存在一個下降趨勢突然變緩的點,這個點對應的K值即為最佳聚類數。

SSE = []for i in range(1,11):    km = KMeans(n_clusters=i)    km.fit(traj)        #獲取K-means算法的SSE    SSE.append(km.inertia_)

可以看到,k=3之後的誤方差和下降變緩,因此3類是最佳選擇。2.輪廓係數S對於其中的一個點 i 來說:
      計算 a(i) 為i向量到所有它屬於的簇中其它點的距離的平均值
      計算 b(i) i向量到各個非本身所在簇的所有點的平均距離的最小值
那麼 i 向量輪廓係數就為:S(i) = (b(i)-a(i))/(max(a(i),b(i)))
      當然了,公式並不重要,如果需要在論文中給出的話,建議查詢維基百科。
      SKLEANR庫給出了計算函數。
from sklearn.metrics import silhouette_scoreS = []  # 存放輪廓係數for i in range(2,10):    kmeans = KMeans(n_clusters=i)  # 構造聚類器    kmeans.fit(traj)    S.append(silhouette_score(traj,kmeans.labels_,metric='euclidean'))

要注意的是,這裡使用的衡量標準是"euclidean"也就是常說的歐氏距離。

可以看到,k=3時,局部輪廓係數最大(極大值),因此K=3為最優選擇。

3.如何確定數據是否合適使用K-means方法

通常的話前面介紹到的兩種評估參數即可確定該數據能否使用K-means聚類方法,不需要兩種同時使用,只需要其中一種評估參數可以挑選出一個最優K值即可。如果兩種參數都無法挑出最優K值,那麼說明你可能需要另外再找一種聚類方法了,再或者就是我前文提到的,數據要素太大,信息熵溢出了,使用PCA提取主成分,對數據進行降維。

★ TRMM 3B42降水數據(daily/3h)

   歡迎加入氣象學家交流群   

請備註:姓名/暱稱-單位/學校-研究方向

(未備註的不通過申請)

相關焦點

  • Python聚類算法——K-means軌跡聚類
    實際上NCL就可以實現聚類算法,官方提供了k-means的算法函數(kmeans_as136),這個函數筆者也用過,相比與Python的聚類可以說還是比較麻煩的。       另外我也見過大佬們用MetoInfo的軟體做軌跡和聚類研究,十分方便。
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖3kmeans實現邏輯:需要輸入待聚類的數據和欲聚類簇數k1.隨機生成k個初始點作為質心
  • K-Means聚類算法
    簡單來說,之前的算法中我們是利用特徵 x 和類別 y 來進行訓練、分類的,而無監督學習是指不需要我們提供具體的類別 y ,而讓數據自己聚在一起,形成 k 個簇,以實現分類的目的。具體方法是通過對給定的樣本進行劃分,分為 k 個簇,使得簇內的點儘量緊密的連在一起,而簇間的距離儘量大,評判的標準就是通過歐氏距離。
  • K-means 算法實現二維數據聚類
    聚類分析是一種無監督的觀察式學習方法,在聚類前可以不知道類別甚至不用給定類別數量。目前聚類廣泛應用於統計學、生物學、資料庫技術和市場營銷等領域。聚類算法有很多種,如K-means(K均值聚類)、K中心聚類、密度聚類、譜系聚類、最大期望聚類等。這裡我們重點介紹K-means聚類算法,該算法的基本思想是以空間中K個點為中心進行聚類,對最靠近它們的對象歸類。
  • python機器學習之k-means聚類算法(1)
    k-means算法是一種無監督的機器學習算法,雖然是機器學習,但它簡單易於實現。本篇採用python語言,自主編程實現k-menas算法,當然python用專門的庫函數來實現該算法,但本次主要使用該算法闡述編程思想,所以不採用內置函數。採用自主編寫的程序的方式。
  • k-means聚類算法原理總結
    目錄1. k-means聚類算法原理2. k-means聚類算法步驟3. k-means++聚類優化算法4.小批量處理的k-means聚類算法5. k值的選取6. k-means聚類算法不適用的幾個場景7. k-means與knn區別8. 小結聚類算法性能度量的文章提到若簇類相似度好簇間的相似度差,則聚類算法的性能較好。我們基於此定義k-means聚類算法的目標函數: 其中
  • K-Means聚類算法詳解
    random 的方式則是完全隨機的方式,一般推薦採用優化過的 k-means++ 方式;algorithm:k-means 的實現算法,有「auto」 「full」「elkan」三種。一般來說建議直接用默認的"auto"。簡單說下這三個取值的區別,如果你選擇"full"採用的是傳統的 K-Means 算法,「auto」會根據數據的特點自動選擇是選擇「full」還是「elkan」。
  • k-means聚類算法
    引入聚類算法一種無監督的(unsupervised)經典機器學習算法。先從感性上認識一下什麼是聚類。聚類的核心思想就是將具有相似特徵的事物給 「聚」 在一起,也就是說 「聚」 是一個動詞。俗話說人以群分,物以類聚說得就是這個道理。如圖所示為三種類型的數據樣本,其中每種顏色都表示一個類別。而聚類算法的目的就是就是將各個類別的樣本點分開,也就是將同一種類別的樣本點聚在一起。
  • k-means聚類算法從入門到精通
    k-means算法是非監督聚類最常用的一種方法,因其算法簡單和很好的適用於大樣本數據,廣泛應用於不同領域,本文詳細總結了k-means聚類算法原理 。小批量處理的k-means聚類算法5. k值的選取6. k-means聚類算法不適用的幾個場景7. k-means與knn區別8. 小結聚類算法性能度量的文章提到若簇類相似度好簇間的相似度差,則聚類算法的性能較好。我們基於此定義k-means聚類算法的目標函數: 其中
  • 機器學習之SKlearn(scikit-learn)的K-means聚類算法
    在工程應用中,用python手寫代碼來從頭實現一個算法的可能性非常低,這樣不僅耗時耗力,還不一定能夠寫出構架清晰,穩定性強的模型。更多情況下,是分析採集到的數據,根據數據特徵選擇適合的算法,在工具包中調用算法,調整算法的參數,獲取需要的信息,從而實現算法效率和效果之間的平衡。而sklearn,正是這樣一個可以幫助我們高效實現算法應用的工具包。
  • 深入理解K-Means聚類算法
    random 的方式則是完全隨機的方式,一般推薦採用優化過的 k-means++ 方式;algorithm:k-means 的實現算法,有「auto」 「full」「elkan」三種。一般來說建議直接用默認的"auto"。簡單說下這三個取值的區別,如果你選擇"full"採用的是傳統的 K-Means 算法,「auto」會根據數據的特點自動選擇是選擇「full」還是「elkan」。
  • 聚類算法入門:k-means
    比如垃圾分類就是分類算法,你知道豬能吃的是溼垃圾,不能吃的是幹垃圾……;打掃房間時你把雜物都分分類,這是聚類,你事先不知道每個類別的標準。二、劃分聚類方法: K-means:對於給定的樣本集,按照樣本之間的距離(也就是相似程度)大小,將樣本集劃分為K個簇(即類別)。
  • 聚類算法之Kmeans
    聚類算法之Kmeans聚類算法其實有很多,包括層次聚類,密度聚類,譜聚類等等。kmeans優缺點及其改進整體上看,Kmeans算法原理簡單,操作可行性高。重複迭代至找到k個簇心。多補充一句,sklearn中kmeans的簇心初始化方法,一般也默認選擇k-means++。當然,這個是可選可配的。由於k-means++計算的是所有的樣本點到簇心的距離和,其計算量龐大,故而又有了kmeansII算法。
  • 純Python實現k-means聚類算法
    開篇在本系列的前面幾期中,我們介紹了包含決策樹及其相關算法在內的一系列有監督學習算法。本期不妨換換口味,學習一種比較簡單的無監督學習算法:k-means.k-means 算法理論講解你可能已經聽說過這個算法,沒有也不要緊,它的原理並不複雜,讓我們來看看~給你一批樣本的數據,就像這樣:其中不同的id代表不同樣本,共10個樣本。x和y是兩個特徵,每一個樣本都有且只有這兩個特徵。
  • 詳解 kmeans 聚類算法
    也是聚類算法中最簡單的一種了,但是裡面包含的思想卻是不一般。最早我使用並實現這個算法是在學習韓爺爺那本數據挖掘的書中,那本書比較注重應用。看了Andrew Ng的這個講義後才有些明白K-means後面包含的EM思想。聚類屬於無監督學習,以往的回歸、樸素貝葉斯、SVM等都是有類別標籤y的,也就是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特徵x,比如假設宇宙中的星星可以表示成三維空間中的點集。
  • Python聚類算法學習之K-Means
    1.簡介       K-means算法是最為經典的基於劃分的聚類方法,是十大經典數據挖掘算法之一
  • K-means聚類
    距離公式什麼是K-means聚類?聚類是把一組數據點分割進少數幾個集群的過程。例如,超市裡的商品被分為幾類(黃油、奶酪和牛奶被分在奶製品)。當然,這是一種定性的劃分。一個定性的劃分方法通常都是測量產品的特定特徵,比如成分裡牛奶佔的比例等,牛奶成分比例比較高的產品被分在一類。
  • 算法雜貨鋪——k均值聚類(K-means)
    但是很多時候上述條件得不到滿足,尤其是在處理海量數據的時候,如果通過預處理使得數據滿足分類算法的要求,則代價非常大,這時候可以考慮使用聚類算 法。聚類屬於無監督學習,相比於分類,聚類不依賴預定義的類和類標號的訓練實例。
  • k均值聚類算法(k-means clustering algorithm)
    ——《周易·繫辭上》一、什麼是聚類?1.將有限集合中的對象劃分成個非空子集,使得類內的對象相似、類間的對象不相似。2.訓練樣本的標記信息未知,無監督學習。3.通過對無標記訓練樣本的學習來揭示數據的內在性質及規律,為進一步的數據分析提供基礎。4.無監督學習中,應用最廣的是「聚類」。
  • K-means 聚類算法及其代碼實現
    K-means算法是非監督學習(unsupervised learning)中最簡單也是最常用的一種聚類算法,具有的特點是:本文章介紹