K-Means聚類講解:算法和Sklearn的實現(附代碼)

2021-01-08 人工智慧研究院

K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。

什麼是聚類

聚類是根據數據的屬性將數據分為兩個或更多組的任務,更確切地說,是基於數據中或多或少明顯的某些模式。目的是在數據中找到那些模式,以幫助我們確保在給定數據集中某個項目的情況下,我們能夠正確地將該項目放置在正確的組中,從而使其與該組中的其他項目相似,但與其他組中的項目不同。這意味著聚類實際上由兩部分組成:一個是識別組,另一個是儘可能地將每個項目放置在正確的組中。聚類算法的理想結果是,同一組中的兩個項目彼此相似,而不同組中的兩個項目則儘可能地不同。

一個真實的例子就是客戶細分。作為一家銷售各種產品或服務的企業,很難為每個客戶找到理想的業務策略。但是我們可以嘗試將客戶分為幾個子組,了解這些客戶的共同點,並針對每個組調整我們的業務策略。而向客戶提出錯誤的業務策略可能意味著失去該客戶,因此,重要的一點是我們必須實現良好的市場集群。

什麼是無監督機器學習

無監督機器學習是一種機器學習算法,試圖在沒有任何先驗知識的情況下推斷數據中的模式。與之相反的是有監督的機器學習,這裡我們有一個訓練集,該算法將嘗試通過將輸入與預定義的輸出進行匹配來查找數據中的模式。

之所以這樣說,是因為將無監督機器學習任務聚類。在應用聚類算法時,儘管我們可以設置要標識的類別數量,但我們也不會先驗地知道類別。

類別將從分析數據的算法中得出。因此,我們可以將集群稱為探索性機器學習任務,因為我們只知道類別的數量,但不知道其屬性。然後,我們可以嘗試使用不同數量的類別,看看是否可以更好地對數據進行聚類。

然後,我們必須了解我們的集群,這實際上可能是最不同的任務。讓我們將示例與客戶細分一起重用。假設我們已經運行了聚類算法,並且將客戶分為三類。但是那些團體是什麼?為什麼算法會確定這些客戶屬於該組,而那些客戶屬於該組?這是需要我們非常豐富的經驗以及非常了解業務的人員的任務。他們將查看數據,嘗試分析每個類別中的一些項目並嘗試猜測一些條件。然後,將在找到有效模式後進行推斷。

當我們獲得新客戶時會發生什麼?我們必須將該客戶放入我們已經擁有的一個集群中,因此我們可以通過算法來運行有關該客戶的數據,該算法將使我們的客戶放入一個集群。另外,將來,在獲得大量新客戶之後,我們可能需要重建集群——也許新集群或舊集群會消失。

集群應用

有哪些常見的集群應用程式?

最常見的用例是我們已經討論過的用例:客戶/市場細分。公司一直在進行這些類型的分析,以便他們可以了解其客戶和市場,並量身定製其業務戰略,服務和產品,以更好地去適應需求。

另一個常見的用例是信息提取任務。在信息提取任務中,我們經常需要查找實體,單詞,文檔等之間的關係。現在,假設如果直覺發現,我們更有可能找到彼此之間更相似的項目之間的關係,那麼這麼做是可行的,因為對數據點進行聚類可以幫助我們找出在哪裡尋找關係。

另一個非常流行的用例是使用聚類進行圖像分割。圖像分割是查看圖像並嘗試識別該圖像中不同項目的任務。我們可以使用聚類分析圖像的像素並確定圖像中的哪個項目包含哪個像素。

K-均值聚類說明

K-Means聚類算法是一種迭代聚類算法,它試圖將數據點準確分配給我們預定義的K個聚類中的一個聚類。

與其他任何聚類算法一樣,它試圖使一個聚類中的項目儘可能相似,同時也使聚類之間彼此儘可能不同。通過確保群集中的數據點與該群集的質心之間的平方距離之和最小。群集的質心是群集中所有值的平均值。也可以從本段獲得K-Means名稱的來源。

用更多的技術術語,我們嘗試使數據儘可能地同質化,而使集群儘可能不異質。該號碼是我們試圖獲得集群的數量。我們可以和K一起玩直到對結果滿意為止。

K均值聚類算法

K-Means聚類算法只需幾個簡單步驟即可工作。

分配K個集群隨機整理數據,並將每個數據點隨機分配給K個聚類之一,並分配初始隨機質心。計算每個數據點和所有質心之間的平方和。根據步驟3的計算,將每個數據點重新分配給最近的質心。通過計算每個群集的平均值來重新分配質心重複步驟3、4、5,直到我們不再需要更改集群中的任何內容運行K-Means聚類算法所需的時間取決於數據集的大小,我們定義的K數和數據中的模式。

使用Scikit-Learn和Python的K-Means聚類實現

我們將使用Sckikit-Learn Python庫在較小的數據集上運行K-Means聚類算法。

K均值聚類算法的數據集

數據包含有關倫敦,巴黎和柏林的3種文字。我們將提取有關這3個城市的Wikipedia文章的摘要部分,並通過我們的聚類算法運行它們。

然後,我們將提供我們自己的3個新句子,並檢查它們是否正確分配給各個群體。如果發生這種情況,那麼我們將知道我們的聚類算法有效。

K-Means聚類實施

首先,讓我們安裝依賴項。

# 用於集群的Sklearn庫pip3 install scikit-learn#我們將使用nltk(自然語言工具包)從文本刪除停用詞pip3 install nltk# 我們將使用Wikipedia庫從Wikipedia頁面下載文本pip3 install wikipedia

現在,讓我們定義一個小類,以幫助從Wikipedia頁面收集文本。我們會將文本存儲到本地的3個文件中,以便在每次運行算法時都不會再次下載文本。第一次使用該算法時,請立即使用class,第二次使用時,可以注釋第8-12行和取消注釋第13-15行。

import wikipediaclass TextFetcher: def __init__(self, title): self.title = title page = wikipedia.page(title) # 8 f = open(title + ".txt", "w") # 9 f.write(page.summary) # 10 f.close() # 11 self.text = page.summary # 12 #f = open(title + ".txt", "r") #self.text = f.read() #f.close() def getText(self): return self.text

現在,我們來構建數據集。我們將獲取有關每個城市的文字,並刪除停用詞。停用詞是我們通常在每個文本處理任務之前過濾掉的詞。它們是英語中非常常見的單詞,不會給文本帶來任何價值和意義。由於它們大多數都在各處使用,因此它們將阻止我們正確地對文本進行聚類。

from text_fetcher import TextFetcherfrom nltk.corpus import stopwordsfrom nltk.tokenize import word_tokenizefrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.cluster import KMeansimport nltkdef preprocessor(text): nltk.download('stopwords') tokens = word_tokenize(text) return (" ").join([word for word in tokens if word not in stopwords.words()])if __name__ == "__main__": textFetcher = TextFetcher("London") text1 = preprocessor(textFetcher.getText()) textFetcher = TextFetcher("Paris") text2 = preprocessor(textFetcher.getText()) textFetcher = TextFetcher("Berlin") text3 = preprocessor(textFetcher.getText()) docs = [text1, text2, text3]

詞向量化技術

眾所周知,計算機在理解文本方面非常差,但是在處理數字方面卻表現得更好。因為我們的數據集是由單詞組成的,所以我們需要將單詞轉換為數字。

詞嵌入或詞向量化表示用於將詞分配給實數向量的技術的集合,機器學習可將這些詞用於某些目的,其中之一是文本聚類。

Scikit-Learn庫包含一些單詞向量器,但是對於本文,我們將選擇TfidfVectorizer。

tfidf_vectorizer = TfidfVectorizer()tfidf = tfidf_vectorizer.fit_transform(docs)

現在是時候應用我們的K-Means聚類算法了。我們很幸運,Scikit-Learn很好地實現了K-Means算法,我們將使用它。因為我們知道我們要將文本分為3類(每個城市一個),所以我們將K值定義為3。

kmeans = KMeans(n_clusters = 3).fit(tfidf)print(kmeans)#輸出:[0 1 2]

簡而言之,這3個值就是我們的3個類。

為了測試它們,我們現在可以提供3個文本,我們可以肯定地知道它們應該在不同的群集中,並查看它們是否分配正確。我們必須確保不要忘記也將這三個文本向量化,以便我們的算法能夠理解它們。

test = ["This is one is about London.", "London is a beautiful city", "I love London"] results = kmeans.predict(tfidf_vectorizer.transform(test)) print (results) # Prints [0, 0, 0] test = ["This is one is about Paris.", "Paris is a beautiful city", "I love Paris"] results = kmeans.predict(tfidf_vectorizer.transform(test)) print (results) # Prints [2, 2, 2] test = ["This is one is about Berlin.", "Berlin is a beautiful city", "I love Berlin"] results = kmeans.predict(tfidf_vectorizer.transform(test)) print(results) # Prints [1, 1, 1] test = ["This is about London", "This is about Paris", "This is about Vienna"] results = kmeans.predict(tfidf_vectorizer.transform(test)) print (results) # Prints [0, 2, 1]

假設會得到另一條我們什麼都不知道的文本。我們可以將該文本通過分類器,然後查看其適合的類別。而這是一個非常有效的文本分類器。

相關焦點

  • 機器學習之分類算法K-Means介紹與代碼分析(篇四)
    維基百科,自由的百科全書中提到K-平均算法(英文:k-means clustering)源於信號處理中的一種向量量化方法,現在則更多地作為一種聚類分析方法流行於數據挖掘領域。k-平均聚類的目的是:把n個點(可以是樣本的一次觀察或一個實例)劃分到k個聚類中,使得每個點都屬於離他最近的均值(此即聚類中心)對應的聚類,以之作為聚類的標準。
  • 機器學習之基於sklearn的KMeans聚類
    聚類算法,無監督學習的代表算法,又叫做「無監督分類」即在訓練的時候只需要特徵矩陣,不需要真實值標籤可以有效地幫助我們探索數據的自然分布一、KMeans算法的運行過程運行的流程如下:自動聚類時的質心點的每步驟變化如下:
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖1假設每個點的維度是n,即每個點有n個特徵維度,計算這些點數據到數據中心A、B、C的距離,從而將每個數據歸類到A或B或C。
  • 你需要的最全面的K-means聚類指南
    的步驟1和2是關於選擇簇數(k)和為每個簇選擇隨機質心。請注意,我們是隨機選擇了這些點,因此每次運行此代碼時,你可能會得到不同的質心。接下來,我們將定義一些條件來實現K-means聚類算法。我們先來看看代碼:# 第三步:將所有點分配給到某個質心距離最近的簇# 第四步:重新計算新形成的簇的質心# 第五步:重複第三步和第四步diff = 1j=0while(diff!
  • 有了K均值聚類,為什麼還需要DBSCAN聚類算法?
    它可以從大量的數據中發現不同形狀和大小的聚類,這些聚類中正包含著噪聲和異常值。DBSCAN算法使用以下兩種參數:· eps (ε):一種距離度量,用於定位任何點的鄰域內的點。· minPts:聚類在一起的點的最小數目(一個閾值),使一個區域界定為密集。
  • 機器學習算法一覽(附python和R代碼)
    原標題:機器學習算法一覽(附python和R代碼) 屬於無監督式學習的算法有:關聯規則,K-means聚類算法等。 3. 強化學習 這個算法可以訓練程序做出某一決定。程序在某一情況下嘗試所有的可能行動,記錄不同行動的結果並試著找出最好的一次嘗試來做決定。 屬於這一類算法的有馬爾可夫決策過程。
  • 機器學習算法基礎(使用Python代碼)
    對於我這樣的人來說,這段時期真的是讓人興奮和著迷的,因為隨著技術的發展,各種工具和技術都實現了飛躍化,現在歡迎人類來到數據科學的世界!今天,作為一名數據科學家,我可以用每小時幾美元的成本,用複雜算法構建數據處理機器。但是實現這並不容易!因為我需要面臨度過無數個黑暗的日日夜夜。
  • Kmeans中的K值確定*
    上篇文章為大家介紹了我們常用的聚類算法Kmenas算法,也為大家整理了一點小案例,今天為大家繼續分享我們Kmenas算法,對Kmenas算法來說,如何確定簇數K值是一個至關重要的問題,為了解決這個問題,通常會選用探索法,即給定不同的k值下,對比某些評估指標的變動情況,進而選擇一個比較合理的k值,在這我們上篇文章給大家推薦了三種方法(簇內離差平方和拐點法,輪廓係數法和間隔統計量法
  • 高斯混合模型(GMM):理念、數學、EM算法和python實現
    高斯混合模型是一種流行的無監督學習算法。GMM方法類似於K-Means聚類算法,但是由於其複雜性,它更健壯,更有用。K-means聚類使用歐式距離函數來發現數據中的聚類。只要數據相對於質心呈圓形分布,此方法就可以很好地工作。
  • 機器學習算法的基本知識(使用Python和R代碼)
    創建本指南背後的理念是簡化全球有抱負的數據科學家和機器學習愛好者的旅程。 本指南能夠使你在研究機器學習問題的過程中獲取經驗。 我提供了關於各種機器學習算法以及R&Python代碼的高級理解以及運行它們,這些應該足以使你得心順手。
  • 聚類算法 Hierarchical Clustering算法
    Hierarchical Clustering算法概述HC算法,又稱層次聚類算法,就是按照某種方法進行層次分類,直到滿足某種條件為止。簡單說它是將數據集中的每個樣本初始化為一個簇,然後找到距離最近的兩個簇,將他們合併,不斷重複這個過程,直達到到預設的聚類數目為止。
  • 基於KNN和Kmeans算法利用MNIST數據集實現手寫數字識別
    Kmeans算法發展狀況K-means算法(Lloyod,1982)是簡單而又有效的統計聚類算法,使機器能夠將具有相同屬性的樣本歸置到一塊兒。與分類不同,對於一個分類器,通常需要告訴它「這個樣本被分成哪些類」這樣一些標籤,在最理想情況下,一個分類器會從所得到的訓練集中進行「學習」,我們將這種提供訓練的過程稱為「監督學習」。
  • 生物學的機器學習:使用K-Means和PCA進行基因組序列分析 COVID-19...
    DNA中只有四種:腺嘌呤,胸腺嘧啶,鳥嘌呤和胞嘧啶。腺嘌呤僅與胸腺嘧啶結合,而鳥嘌呤僅與胞嘧啶結合。這些鹼基分別用A,T,G和C表示。這些鹼基構成了指示生物體如何構建蛋白質的各種代碼-實際上是控制病毒行為的DNA。
  • 使用Python進行K均值聚類
    聚類意味著對一組對象進行分組。K-means聚類是無監督學習的一部分,我們使用的是未標記的數據集,這個算法會自動為我們將數據分組成聚類。它是目前最流行、應用最廣泛的聚類算法之一。它用於各種應用程式,例如市場細分,圖像細分等。
  • Kmeans算法精簡版(無for loop循環)
    大家在學習算法的時候會學習到關於Kmeans的算法,但是網絡和很多機器學習算法書中關於Kmeans的算法理論核心一樣,但是代碼實現過於複雜,效率不高,不方便閱讀。這篇文章首先列舉出Kmeans核心的算法過程,並且會給出如何最大限度的在不用for循環的前提下,利用numpy, pandas的高效的功能來完成Kmeans算法。
  • 回歸、分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R...
    Python 實現:http://scikit-learn.org/stable/modules/naive_bayes.htmlR 實現:https://cran.r-project.org/web/packages/naivebayes/index.html3、聚類聚類是一種無監督學習任務,該算法基於數據的內部結構尋找觀察樣本的自然族群(即集群)。
  • 樸素貝葉斯詳解及中文輿情分析(附代碼實踐)
    樸素貝葉斯數學原理知識該基礎知識部分引用文章"機器學習之樸素貝葉斯(NB)分類算法與Python實現"(https://blog.csdn.net/moxigandashu/article/details/71480251),也強烈推薦大家閱讀博主moxigandashu的文章,寫得很好。同時作者也結合概率論講解,提升下自己較差的數學。
  • 簡潔詳盡講解文本聚類
    起初,用於單詞和文檔的聚類的大量方法似乎不勝枚舉,讓我們仔細研究其中幾種。本文涵蓋的主題包括k均值,布朗聚類,tf-idf聚類,主題模型和潛在的Dirichlet分配(也稱為LDA)。聚類是數據科學中最大的主題之一,其規模如此之大,以至於你很容易會發現有大量書籍正探討它的每一個細節。文本聚類的子主題也不例外。
  • 「Workshop」第十期:聚類
    ❝本期由吳濤師弟講解聚類,內容很詳實,推薦感興趣的讀者通過原文連結觀看介紹視頻。(Partitioning clustering)劃分聚類需要我們指定類別的數量最常用的有:K-medoids clustering (PAM)K均值聚類k表示我們想要數據聚成的類數,最終的結果是實現高的類內相似性和低的類間相似性