直播案例 | K-Means 的 Python 實現及在圖像分割和新聞聚類中的應用

2021-02-25 數據科學人工智慧

K-Means 是一種最經典和常用的聚類方法。它通過多輪迭代的方式不斷更新不同類樣本的中心,計算樣本到每個中心的距離,然後更新樣本所屬的類。最終能夠把樣本劃分到 K 個類中。本案例中,我們首先使用 Python 實現 K-Means 算法,基於一份隨機數據集,使用動畫演示聚類過程和優化目標的變化。然後將 K-Means 應用於圖像分割問題。最後我們還將使用一份中文新聞數據集,用 K-Means 算法進行自動新聞主題聚類,並使用柱狀圖和詞雲圖對聚類結果進行可視化分析。

1 實現 K-Means 算法

K-Means 算法的基本運行流程為:

在整個算法中,2.1 步驟運算量最大,因為該步驟需要計算每一個樣本到 

1.1 使用 iterrows 遍歷的方式實現

假設我們使用歐式距離計算樣本到中心的距離。對於樣本 

使用最簡單的方式來實現,先用一個函數 point_dist 計算一個樣本到中心的距離。這裡我們使用 Numpy 的線性代數模塊 linalg 中的 norm 方法。




然後使用 iterrows 方法遍歷樣本計算樣本到中心的距離,定義 k_means_iterrows 方法實現 K-Means 算法。










用一個簡單的隨機數據集來測試時間性能。Sklearn 中的 datasets 模塊的 make_blobs 函數能夠自動生成一些供測試聚類算法的隨機數據集。它能夠根據輸入的參數生成數據集和對應的類標籤。常用的參數如下表:

參數含義說明n_samples需要生成的樣本數量,默認值100n_features特徵數量,默認值是2centers數據的中心點數量,默認值3cluster_std數據集的標準差,浮點數或者浮點數序列,默認值1.0center_box中心確定之後的數據邊界,默認值(-10.0, 10.0)shuffle打亂樣本順序,默認值是Truerandom_state官網解釋是隨機生成器的種子




在該數據集上用我們實現的 k_means1 方法運行 K-Means 聚類。使用 iPython 提供的魔法命令 %time 記錄運行時間。


CPU times: user 5.16 s, sys: 39.3 ms, total: 5.19 s Wall time: 5.14 s

1.2 使用 apply 遍歷的方式實現

提高運算效率,可以使用 DataFrame 的 apply 函數,它可以對數據框中的每一行執行一個複雜的函數。在我們的例子中,是計算每一行與每一個中心的距離。












CPU times: user 3.24 s, sys: 19.9 ms, total: 3.26 s Wall time: 3.23 s

1.3 矩陣運算的方式實現

數據集表示成 

已經聚類中心,計算樣本到中心距離,並將樣本劃分到距離最小的類的流程如下圖所示。

png

使用 Numpy 實現上述計算流程的代碼為:






得到樣本的類標籤後,聚類中心的更新流程為:1)根據類標籤對樣本進行分組;2)將聚類中心更新為每一組樣本的均值。Python 實現的代碼為:


現在我們更新 K-Means 算法的實現,函數名為 k_means。













CPU times: user 150 ms, sys: 0 ns, total: 150 ms Wall time: 149 ms

1.4 聚類結果可視化

下面我們使用一份隨機生成的二維數據集,使用我們上一小節實現的 k_means 完成聚類,然後使用不同顏色標註不同類的樣本以及類中心。









Text(0, 0.5, '

1.5 使用動畫展示 K-Means 聚類過程

要動態展示 K-Means 聚類過程,我們需要在每一步迭代中記錄每一個類的中心,以及每一個類的樣本集合。創建 k_means_steps,在完成聚類的同時,將每一步迭代的每類樣本和中心返回。












我們可以藉助 matplotlib.animation 動畫模塊來實現下面的 init_draw 函數是動畫最開始時繪製的內容,包含數據。update_draw 則是每次更新的內容。























1.6 失真度量 J 的變化

我們來查看隨著迭代的進行,K-Means聚類模型的優化目標,即失真度量 













在隨機數據上進行聚類,並將失真度量的變化以折線圖的形式繪製出來。







Text(0.5, 1.0, 'K-Means算法優化目標的變化')

2 使用 K-Means 算法進行圖像分割

我們先加載一張測試圖片,將圖片列印出來。使用 PIL.Image.open 方法來打開圖片,然後使用 matplotlib 中的 imshow 方法將圖片可視化。








(-0.5, 599.5, 514.5, -0.5)

將一張圖片轉換成表格形式。每一行為一個像素,三列分別為像素的 R,B,G取值。獲取圖片的每一個像素 









列印轉換的數據框如下:



RBG02472482431247248243224724824332472482434247248243

600 515 309000 309000

使用我們在上一節實現的 K-Means 算法對像素進行聚類。


將生成的灰度圖可視化,對圖像可視化使用 plt.imshow 方法。










(-0.5, 599.5, 514.5, -0.5)

實現一個函數 img_from_labels ,將像素聚類類別標籤,轉換成一張灰度圖。









調整聚類數量 









3 使用 K-Means 進行中文新聞聚類

首先,我們使用 Pandas 的 read_csv 方法將中文新聞語料讀取進來, encoding 參數和 sep 參數分別設置為 "utf8" 和 "\t" 。





分類分詞文章0科技「 一路 聽 天下 」 開拓 「 無聊 經濟 」 在 納斯達克  風光 上市 的 分眾傳媒...1旅遊中國 赴美 旅遊 首發 團 6 月 1 7 日 啟程   報價  兩萬左右 六月 初 的 ...2新聞科學家 教育家 蒙特 梭利 :給 孩子 愛 與 自由 ( 圖  ) 蒙特 梭利 和 「 ...3教育7 名 大學生 作出 「 震後 恢復 建議 」   獲 國務院  肯定 大學生 災後 重建...4教育最牛 高 考生 :重慶 學生 稱 「 押 中 」 今年  作文題 最牛 鼓勁 :數學考...

汽車     544
科技     511
旅遊     510
健康     492
文化     491
房地產    480
財經     469
新聞     458
體育     437
教育     437
娛樂     370
女人     322
Name: 分類, dtype: int64

3.1 將新聞表示成向量格式

使用 sklearn.feature_extraction.text 模塊的 TfidfVectorizer,將詞列表格式的新聞轉換成向量形式。向量中的每一個維度代表字典中的一個詞,維度的取值代表詞在對應文檔中的 TF-IDF 取值。











3.2 使用 k_means 方法對新聞進行聚類

在真實的文本應用中,文本表示成向量後,由於詞典的詞通常會很大,我們得到的是稀疏矩陣。例如上一步 news_vectors 就是一個稀疏存儲格式。


scipy.sparse.csr.csr_matrix

在本案例中,為了簡便我們直接使用 todense 方法將稀疏向量轉換成稠密矩陣。(!注意,實際中很少這麼操作!)


現在我們可以直接使用第一節實現的 k_means 方法對新聞進行聚類,這裡我們將聚類個數設置成 12 。


在 news 中新建 labels 列保存將得到的樣本聚類結果。


3.3 使用柱狀圖查看新聞聚類的主題分布

在新聞數據集中,由於 分類 一列已經標註了新聞的主題類別,我們可以聚類得到的每一組新聞中的主題分布,從而定性地觀察聚類效果。將聚類結果按照聚類結果進行分組,可以使用 DataFrame 的 groupby 方法。然後使用 value_counts 方法統計每一組的不同主題的新聞數量分布。









從上圖可以看到,部分分組對應於特定主題,然而在另一上部分分組中,不同主題的新聞分布較為分散。

3.4 使用詞雲圖查看新聞聚類結果

首先,使用 groupby 方法,根據聚類結果對新聞進行分組。


將 wordcloud 模塊導入詞雲類 WordCloud,新建一個詞雲對象 cloud 。為了顯示效果,構造詞雲對象時需要設置停用詞詞表。由於我們顯示的是中文,為了避免亂碼,還需要制定顯示字體。其中字體文件為 ./input/simfang.ttf 。









遍歷每一個聚類的新聞樣本,得到新聞內容的內容,然後顯示成詞雲圖。










可以看到,我們可以直接根據詞雲圖對得到的聚類進行解釋。

4 總結

本案例中我們使用首先使用三種方式實現了 K-Means 算法並對不同實現的時間性能進行了對比,結果發現向量化實現能夠大大提高運行效率。然後我們使用 K-Means 算法進行圖像分割,展示了不同 K 取值下生成的灰度圖的變化。最後,我們使用 K-Means 在一份中文新聞數據集進行了主題聚類。

本案例使用的主要 Python 工具如下:

工具包用途NumPy矩陣運算Pandas數據讀取與預處理Matplotlib數據集可視化、聚類結果動畫Sklearn中文新聞的向量化Wordcloud繪製聚類結果詞雲圖

相關焦點

  • K-Means聚類算法詳解
    通過今天的學習,掌握KMeans算法的工作原理,然後會使用sklearn實現KMeans聚類,最後我們來做一個實戰項目:如何使用KMeans對圖像進行分割? 下面我們開始吧。還是老規矩,我們在實戰之前,先看一下如何調用sklearn實現KMeans。4.1 如何使用sklearn中的KMeans算法sklearn 是 Python 的機器學習工具庫,如果從功能上來劃分,sklearn 可以實現分類、聚類、回歸、降維、模型選擇和預處理等功能。
  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。
  • 機器學習之SKlearn(scikit-learn)的K-means聚類算法
    在工程應用中,用python手寫代碼來從頭實現一個算法的可能性非常低,這樣不僅耗時耗力,還不一定能夠寫出構架清晰,穩定性強的模型。更多情況下,是分析採集到的數據,根據數據特徵選擇適合的算法,在工具包中調用算法,調整算法的參數,獲取需要的信息,從而實現算法效率和效果之間的平衡。而sklearn,正是這樣一個可以幫助我們高效實現算法應用的工具包。
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖3kmeans實現邏輯:需要輸入待聚類的數據和欲聚類簇數k1.隨機生成k個初始點作為質心
  • 你需要的最全面的K-means聚類指南
    如果你看一下案例一:紅色和藍色簇中的客戶彼此非常相似。紅色簇中的前四個點與藍色簇中的前兩個客戶具有相似的屬性,他們有高收入和高債務。在這裡,我們對它們進行了不同的聚類。然而,如果你看看案例二:紅色簇與藍色簇中的客戶完全不同。紅色簇中的所有客戶都有高收入和高負債,藍色簇中的客戶收入高,債務價。
  • K-Means聚類算法
    簡單來說,之前的算法中我們是利用特徵 x 和類別 y 來進行訓練、分類的,而無監督學習是指不需要我們提供具體的類別 y ,而讓數據自己聚在一起,形成 k 個簇,以實現分類的目的。具體方法是通過對給定的樣本進行劃分,分為 k 個簇,使得簇內的點儘量緊密的連在一起,而簇間的距離儘量大,評判的標準就是通過歐氏距離。
  • k均值聚類算法原理和(TensorFlow)實現(無師自通)
    我們知道,在機器學習中,有三種不同的學習模式:監督學習、無監督學習和強化學習:監督學習,也稱為有導師學習,網絡輸入包括數據和相應的輸出標籤信息。例如,在 MNIST 數據集中,手寫數字的每個圖像都有一個標籤,代表圖片中的數字值。
  • python機器學習之k-means聚類算法(1)
    k-means算法是一種無監督的機器學習算法,雖然是機器學習,但它簡單易於實現。本篇採用python語言,自主編程實現k-menas算法,當然python用專門的庫函數來實現該算法,但本次主要使用該算法闡述編程思想,所以不採用內置函數。採用自主編寫的程序的方式。
  • K_means聚類的matlab應用
    如果公眾號文章對您有幫助,別忘了點擊分享和「在看」哦!若您對公眾號有什麼意見或建議,請在公眾號中回復或在任意文章底部留言!本文作者:南海一號在機器學習中,我們往往會遇到很大量的數據的處理,其中有一項就是聚類,即將相似的數據聚到一起,比較基礎的就是K_means聚類算法。聚類是一種無監督學習,不需要訓練樣本有對應的標籤就可以將不同的類分開。
  • 吳恩達《Machine Learning》精煉筆記 8:聚類 KMeans 及其 Python實現
    :聚類和降維。本文中首先介紹的是聚類中的K均值算法,包含:算法思想圖解K-Meanssklearn實現Python實現無監督學習unsupervised learning無監督學習簡介聚類和降維是無監督學習方法,在無監督學習中數據是沒有標籤的。
  • 機器學習十大經典算法之K-Means聚類算法
    聚類介紹聚類在機器學習,數據挖掘,模式識別,圖像分析以及生物信息等領域有廣泛的應用。聚類是把相似的對象通過靜態分類的方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性,常見的包括在坐標系中更加短的空間距離(一般是歐式距離)等。
  • 不足 20 行 Python 代碼,高效實現 k-means 均值聚類算法!
    )、聚類(clustering)、回歸(regression)和降維(dimensionality reduction)。k-mk-means均值算法雖然是聚類算法中比較簡單的一種,卻包含了豐富的思想內容,非常適合作為初學者的入門習題。關於 k-means 均值聚類算法的原理介紹、實現代碼,網上有很多,但運行效率似乎都有點問題。今天稍微有點空閒,寫了一個不足20行的 k-means 均值聚類算法,1萬個樣本平均耗時20毫秒(10次均值)。同樣的數據樣本,網上流行的算法平均耗時3000毫秒(10次均值)。
  • k-means聚類算法原理總結
    k-means算法是非監督聚類最常用的一種方法,因其算法簡單和很好的適用於大樣本數據,廣泛應用於不同領域,本文詳細總結了k-means聚類算法原理
  • 詳解 kmeans 聚類算法
    也是聚類算法中最簡單的一種了,但是裡面包含的思想卻是不一般。最早我使用並實現這個算法是在學習韓爺爺那本數據挖掘的書中,那本書比較注重應用。看了Andrew Ng的這個講義後才有些明白K-means後面包含的EM思想。聚類屬於無監督學習,以往的回歸、樸素貝葉斯、SVM等都是有類別標籤y的,也就是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特徵x,比如假設宇宙中的星星可以表示成三維空間中的點集。
  • k-means聚類簡介
    K-means聚類簡介K-means聚類是一種無監督學習,用於有未標記的數據時(例如,數據沒有定義類別或組)。該算法的目標是在數據中找到分組,變量K代表分組的個數。該算法迭代地分配每個數據點到提供特徵的K分組中的一個。數據點基於特徵相似性聚集。K-means聚類算法的結果是:1. K聚類的質心,它可以用來標記新數據2.
  • 【無監督學習】K-means聚類算法原理介紹,以及代碼實現
    分類和聚類的區別是什麼呢?對於分類來說,在給定一個數據集,我們是事先已知這個數據集是有多少個種類的。聚類算法主要包含:K-means、DBSCAN(未完善)一、K-means聚類算法1.1、K-means 算法思想、算法描述1.2、K-means 算法運行圖示
  • K-means 聚類算法及其代碼實現
    K-means算法是非監督學習(unsupervised learning)中最簡單也是最常用的一種聚類算法,具有的特點是:本文章介紹
  • 聚類算法之Kmeans
    實際應用中,對於數據而言,如果會有一些預處理操作,那麼就會使得後面更加高效快捷。而這裡最重要的選簇依據一般有兩種:一種是簇中樣本數最多的。另一種即對所有簇進行SSE(即簇中所有非簇心點到簇心點的距離平方和相加所得)計算,選擇SSE最大的簇進行劃分。2、k-means++算法:其核心也是簇心數目從小到大不斷累加上去。
  • k-means聚類算法從入門到精通
    k-means算法是非監督聚類最常用的一種方法,因其算法簡單和很好的適用於大樣本數據,廣泛應用於不同領域,本文詳細總結了k-means聚類算法原理 。,若樣本量達到上萬時,k-means聚類算法非常耗時,因此對該數據集進行無放回隨機抽樣得到合適的小批量樣本數據集,sklearn.cluster包提供了相應的實現方法MiniBatchKMeans。
  • 使用Python進行K均值聚類
    在機器學習中,當我們要處理一個未標記的數據集時,稱為「無監督學習」。有時我們只是想知道我們的數據是如何組織起來的這樣我們就能知道數據是如何組織起來的。聚類意味著對一組對象進行分組。K-means聚類是無監督學習的一部分,我們使用的是未標記的數據集,這個算法會自動為我們將數據分組成聚類。它是目前最流行、應用最廣泛的聚類算法之一。它用於各種應用程式,例如市場細分,圖像細分等。