機器學習之分類算法K-Means介紹與代碼分析(篇四)

2021-01-08 悅上心靈

什麼是K-Means?

維基百科,自由的百科全書中提到

K-平均算法(英文:k-means clustering)源於信號處理中的一種向量量化方法,現在則更多地作為一種聚類分析方法流行於數據挖掘領域。k-平均聚類的目的是:把n個點(可以是樣本的一次觀察或一個實例)劃分到k個聚類中,使得每個點都屬於離他最近的均值(此即聚類中心)對應的聚類,以之作為聚類的標準。這個問題將歸結為一個把數據空間劃分為Voronoi cells的問題。

這個問題在計算上是NP困難的,不過存在高效的啟發式算法。一般情況下,都使用效率比較高的啟發式算法,它們能夠快速收斂於一個局部最優解。這些算法通常類似於通過迭代優化方法處理高斯混合分布的最大期望算法(EM算法)。而且,它們都使用聚類中心來為數據建模;然而k-平均聚類傾向於在可比較的空間範圍內尋找聚類,期望-最大化技術卻允許聚類有不同的形狀。

簡單理解為:聚類是一個將數據集中在某些方面相似的數據成員進行分類組織的過程,聚類就是一種發現這種內在結構的技術,聚類技術經常被稱為無監督學習。k均值聚類是最著名的劃分聚類算法,由於簡潔和效率使得他成為所有聚類算法中最廣泛使用的。給定一個數據點集合和需要的聚類數目k,k由用戶指定,k均值算法根據某個距離函數反覆把數據分入k個聚類中

K-Means做法與生活例子

做法

隨機選取K各中心點,生成對應的k個簇遍歷所有的數據點,依據「距離」將每一個數據點劃分到最近的中心點所在的簇計算每個簇所有的數據點的平均值,並作為該簇新的中心。重複2-3步,直到這k個簇的中心點不再變化,或者達到我們規定的迭代次數生活中的例子

文檔分類器根據標籤、主題和文檔內容將文檔分為多個不同的類別。這是一個非常標準且經典的K-means算法分類問題。首先,需要對文檔進行初始化處理,將每個文檔都用矢量來表示,並使用術語頻率來識別常用術語進行文檔分類,這一步很有必要。然後對文檔向量進行聚類,識別文檔組中的相似性。這裡是用於文檔分類的K-means算法實現案例。物品傳輸優化使用K-means算法的組合找到無人機最佳發射位置和遺傳算法來解決旅行商的行車路線問題,優化無人機物品傳輸過程。識別犯罪地點使用城市中特定地區的相關犯罪數據,分析犯罪類別、犯罪地點以及兩者之間的關聯,可以對城市或區域中容易犯罪的地區做高質量的勘察。乘車數據分析面向大眾公開的乘車信息的數據集,為我們提供了大量關於交通、運輸時間、高峰乘車地點等有價值的數據集。分析這些數據不僅對大有好處,而且有助於我們對城市的交通模式進行深入的了解,來幫助我們做城市未來規劃網絡分析犯罪分子網絡分析是從個人和團體中收集數據來識別二者之間的重要關係的過程。網絡分析源自於犯罪檔案,該檔案提供了調查部門的信息,以對犯罪現場的罪犯進行分類。保險欺詐檢測機器學習在欺詐檢測中也扮演著一個至關重要的角色,在汽車、醫療保險和保險欺詐檢測領域中廣泛應用。利用以往欺詐性索賠的歷史數據,根據它和欺詐性模式聚類的相似性來識別新的索賠。由於保險欺詐可能會對公司造成數百萬美元的損失,因此欺詐檢測對公司來說至關重要。客戶分類聚類能過幫助營銷人員改善他們的客戶群(在其目標區域內工作),並根據客戶的購買歷史、興趣或活動監控來對客戶類別做進一步細分。這是關於電信運營商如何將預付費客戶分為充值模式、發送簡訊和瀏覽網站幾個類別的白皮書。對客戶進行分類有助於公司針對特定客戶群制定特定的廣告。球隊狀態分析分析球員的狀態一直都是體育界的一個關鍵要素。隨著競爭越來愈激烈,機器學習在這個領域也扮演著至關重要的角色。如果你想創建一個優秀的隊伍並且喜歡根據球員狀態來識別類似的球員,那麼K-means算法是一個很好的選擇。K-Means數學算法

已知觀測集{x1,x2,…,xn},其中每個觀測都是一個d-維實向量,K-Means要把這n個觀測劃分到k個集合中(k≤n),使得組內平方和最小。換句話說,它的目標是找到使得下式滿足的聚類Ci其中:x是Ci中的樣本點, mi是Ci的質心(Ci中所有樣本的均值),SSE(誤差平方和)是所有樣本的聚類誤差,代表了聚類效果的好壞

怎樣讓SSE最小呢?——求導!

K-Means代碼實現

1. 引入依賴

1import numpy as np2import matplotlib.pyplot as plt34# 從sklearn中直接生成聚類數據5from sklearn.datasets.samples_generator import make_blobsmake_blobs方法常被用來生成聚類算法的測試數據,直觀地說,make_blobs會根據用戶指定的特徵數量、中心點數量、範圍等來生成幾類數據,這些數據可用於測試聚類算法的效果。下面會介紹參數詳情。

Sklearn提供的常用數據集

自帶的小數據集(packageddataset):sklearn.datasets.load_

還有可在線下載的數據集;計算機生成的數據集;svmlight/libsvm格式的數據集;data.org在線下載獲取的數據集。 這裡不在一一羅列。列舉的目的是讓你知道有這個東西

2. 數據加載

1x, y = make_blobs( n_samples=200, centers=6, random_state=1234, cluster_std=0.6 )23plt.figure(figsize=(6,6))4plt.scatter(x[:,0], x[:,1], c=y)5plt.show()6x,ymake_blobs參數解釋

返回值類型

效果圖

3. 算法實現

1# 引入scipy中的距離函數,默認歐式距離 2from scipy.spatial.distance import cdist 3 4classK_Means(object): 5# 初始化,參數 n_clusters(K)、迭代次數max_iter、初始質心 centroids 6def__init__(self, n_clusters=6, max_iter=300, centroids=[]): 7self.n_clusters = n_clusters 8self.max_iter = max_iter 9self.centroids = np.array( centroids, dtype=np.float )1011# 訓練模型方法,k-means聚類過程,傳入原始數據12deffit(self, data):13# 假如沒有指定初始質心,就隨機選取data中的點作為初始質心14if( self.centroids.shape == (0,) ):15# 從data中隨機生成0到data行數的6個整數,作為索引值16self.centroids = data[ np.random.randint( 0, data.shape[0], self.n_clusters ) ,: ]1718# 開始迭代19for i in range(self.max_iter):20# 1. 計算距離矩陣,得到的是一個100*6的矩陣21 distances = cdist(data, self.centroids)2223# 2. 對距離按有近到遠排序,選取最近的質心點的類別,作為當前點的分類24 c_ind = np.argmin( distances, axis=1 )2526# 3. 對每一類數據進行均值計算,更新質心點坐標27for i in range(self.n_clusters):28# 排除掉沒有出現在c_ind裡的類別29if i inc_ind:30# 選出所有類別是i的點,取data裡面坐標的均值,更新第i個質心31self.centroids[i] = np.mean( data[c_ind==i], axis=0 )3233# 實現預測方法34defpredict(self, samples):35# 跟上面一樣,先計算距離矩陣,然後選取距離最近的那個質心的類別36 distances = cdist(samples, self.centroids)37 c_ind = np.argmin( distances, axis=1 )3839return c_ind4041dist = np.array([[121,221,32,43],42 [121,1,12,23],43 [65,21,2,43],44 [1,221,32,43],45 [21,11,22,3],])46c_ind = np.argmin( dist, axis=1 )47x_new=x[0:5]48np.mean(x_new[c_ind==2], axis=0)一些方法解釋

numpy.argmin(a, axis)表示最小值在數組中所在的位置若添加答axis這個參數求在回行或者列方向上的最小值索答引axis=0 表示列方向上的最小值索引,axis=1表示行方向的最小值索引numpy.mean(a, axis, dtype, out,keepdims)求取均值,經常操作的參數為axis,以m * n矩陣舉例:axis 不設置值,對 m*n 個數求均值,返回一個實數axis = 0:壓縮行,對各列求均值,返回 1* n 矩陣axis =1 :壓縮列,對各行求均值,返回 m *1 矩陣4. 測試

1# 定義一個繪製子圖函數 2def plotKMeans(x, y, centroids, subplot, title): 3 # 分配子圖,121表示1行2列的子圖中的第一個 4 plt.subplot(subplot) 5 plt.scatter(x[:,0], x[:,1], c='r') 6 # 畫出質心點 7 plt.scatter(centroids[:,0], centroids[:,1], c=np.array(range(6)), s=100) 8 plt.title(title) 910kmeans = K_Means(max_iter=300, centroids=np.array([[2,1],[2,2],[2,3],[2,4],[2,5],[2,6]]))111213plt.figure(figsize=(16, 6))14plotKMeans( x, y, kmeans.centroids, 121, 'Initial State' )1516# 開始聚類17kmeans.fit(x)1819plotKMeans( x, y, kmeans.centroids, 122, 'Final State' )2021# 預測新數據點的類別22x_new = np.array([[0,0],[-3,7]])23y_pred = kmeans.predict(x_new)2425print(kmeans.centroids)26print(y_pred)2728plt.scatter(x_new[:,0], x_new[:,1], s=100, c='black')效果圖

附加:用肘部法則來確定最佳的K值

當Kmeans聚類的K沒有指定時,可以通過肘部法來估計聚類數量K_means參數的最優解是以成本函數最小化為目標每個類的畸變程度等於該類重心與其內部成員位置距離的平方和

參數解釋

代碼

1import numpy as np 2from sklearn.cluster import KMeans 3from scipy.spatial.distance import cdist 4import matplotlib.pyplot as plt 5cluster1 = np.random.uniform(0.5, 1.5, (2, 10)) 6cluster2 = np.random.uniform(3.5, 4.5, (2, 10)) 7X = np.hstack((cluster1, cluster2)).T 8K = range(1, 10) 9meandistortions = []10for k in K:11 kmeans = KMeans(n_clusters=k)12 kmeans.fit(X)13 meandistortions.append(sum(np.min(cdist(X,kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])14print(meandistortions)15plt.plot(K, meandistortions, 'bx-')16plt.xlabel('k')17# plt.ylabel('平均畸變程度',fontproperties=font)18plt.ylabel('Ave Distor')19# plt.title('用肘部法則來確定最佳的K值',fontproperties=font);20plt.title('Elbow method value K');21plt.show()一些方法解釋

效果圖

從圖中可以看出圖片像一隻手肘,肘處的K即為最佳K值:K=2

至此,K-Means算法介紹完了

機器學習未完待續 ……歡迎關注

相關焦點

  • 機器學習算法基礎(使用Python代碼)
    創建本指南背後的想法是簡化世界各地有抱負的數據科學家和機器學習愛好者的旅程。通過本指南,我將幫助您解決機器學習問題並從經驗中獲益。我提供了對各種機器學習算法的高級理解以及運行它們的R&Python代碼。這些應該足以弄髒你的手。線性回歸主要有兩種類型:簡單線性回歸和多元線性回歸。簡單線性回歸的特徵在於一個自變量。
  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。什麼是聚類聚類是根據數據的屬性將數據分為兩個或更多組的任務,更確切地說,是基於數據中或多或少明顯的某些模式。
  • 機器學習算法一覽(附python和R代碼)
    寫這篇文章的目的,就是希望它可以讓有志於從事數據科學和機器學習的諸位在學習算法的路上少走些路。我會在文章中舉例一些機器學習的問題,你們也可以在思考解決這些問題的過程中得到啟發。我也會寫下對於各種機器學習算法的一些個人理解,並且提供R和Python的執行代碼。讀完這篇文章,讀者們至少可以行動起來親手試試寫一個機器學習的程序。
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖1假設每個點的維度是n,即每個點有n個特徵維度,計算這些點數據到數據中心A、B、C的距離,從而將每個數據歸類到A或B或C。
  • 機器學習算法的基本知識(使用Python和R代碼)
    本指南能夠使你在研究機器學習問題的過程中獲取經驗。 我提供了關於各種機器學習算法以及R&Python代碼的高級理解以及運行它們,這些應該足以使你得心順手。我可以進一步詳細介紹,但這將會打破這篇文章的目的。
  • 機器學習初學者必須知道的十大算法
    還在為不知道學什麼算法入門機器學習感到頭疼?本文作者通過自身的學習向初學者介紹十大機器學習(ML)算法,並附有數字和實例以便於理解。哈佛商業評論稱數據科學家是21世紀最性感的工作。所以,對於那些ML剛剛開始的人來說,這篇博客機器學習算法工程師需要知道的十大算法是非常有用的。ML算法是可以從數據中學習並從中改進的算法,無需人工幹預。
  • 「機器學習」機器學習算法優缺點對比(匯總篇)
    主要回顧下幾個常用算法的適應場景及其優缺點!機器學習算法太多了,分類、回歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,所以在實際應用中,我們一般都是採用啟發式學習方式來實驗。但是如果你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裡有些技巧可以參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於我們去選擇它。天下沒有免費的午餐在機器學習領域,一個基本的定理就是「沒有免費的午餐」。
  • Python機器學習10:機器學習中的六種分類算法及實現(上)
    本文將會介紹六種常見的機器學習分類算法及其scikit-learn實現,當你在處理分類問題時,可以嘗試使用這些算法。比較不同算法在具體問題上的效果,然後選擇一種最佳算法。引言本教程分為三部分,分別如下所示。本文將會介紹前二部分,第三部分將會在後面的文章中介紹。
  • 流行的機器學習算法總結,幫助你開啟機器學習算法學習之旅
    定期將算法應用於新數據和新經驗的過程可提高機器學習的整體效率。機器學習算法對於與分類,預測建模和數據分析相關的各種任務至關重要。「機器學習方面的突破將價值十個微軟。」- Bill Gates機器學習算法的類型在本節中,我們將重點介紹現有的各種ML算法。
  • 史上最全十大機器學習算法,入門必看!
    1介紹關於機器學習算法的研究已經獲得了巨大的成功,哈佛商業評論甚至將數據科學家稱為二十一世紀最具誘惑力的工作。機器學習算法是在沒有人為幹涉的情況下,從大量的數據和歷史經驗中學習數據的結構並提升對某一目標的估計的算法。
  • 算法應用|機器學習python應用,簡單機器學習項目實踐
    上一篇文章中介紹了機器學習的簡單知識,還有python中進行機器學習實踐需要的生態環境,接下來將會通過鳶尾花分類這個例子對機器學習做一個簡要的介紹。通過一步一步地實現這個項目來介紹以下內容。導入和使用python中機器學習的各個方面的類庫。導入數據,並通過描述性分析、可視化等對數據進行分析。創建六個模型,並從中選擇準確度最高的模型。
  • 獨家 | 機器學習中的四種分類任務(附代碼)
    分別是二分類、多類別分類、多標籤分類、不平衡分類,並提供了實戰代碼。 標籤:機器學習機器學習是一個研究領域,其涉及到從示例中學習的算法。分類是一項需要使用機器學習算法去學習如何根據問題域為示例分配類標籤的任務。一個簡單易懂的例子是將電子郵件分為「垃圾郵件」或「非垃圾郵件」。在機器學習中,你可能會遇到許多不同類型的分類任務,並且每種模型都會使用專門的建模方法。
  • 17個機器學習的常用算法!
    在機器學習或者人工智慧領域,人們首先會考慮算法的學習方式。在機器學習領域,有幾種主要的學習方式。將算法按照學習方式分類是一個不錯的想法,這樣可以讓人們在建模和算法選擇的時候考慮能根據輸入數據來選擇最合適的算法來獲得最好的結果。1. 監督式學習:
  • 生物學的機器學習:使用K-Means和PCA進行基因組序列分析 COVID-19...
    使用K-Means創建突變聚類K-Means是用於聚類的算法,它是機器學習中在特徵空間中查找數據點並結合成組的一種方法。我們的K-Means的目標是找到突變簇,由此我們可以得出有關的突變性質以及如何解決突變的見解。但是,我們仍然需要選擇簇數k。
  • 數據科學家應該知道的頂級機器學習算法
    機器學習算法簡介有兩種方法可以對您可能在現場遇到的機器學習算法進行分類。首先是按照學習風格對算法進行分組。第二個是通過形式或功能上的相似性對算法進行分組。通常,兩種方法都是有用的。但是,我們將專注於通過相似性進行算法分組,並瀏覽各種不同的算法類型。
  • 在機器學習的世界裡打怪升級——KNN算法篇
    「全文約2000字,閱讀時間約6分鐘」 來自機器學習世界裡的勇士,你剛走出新手村,還沒完全武裝自己,就碰到了旅途中第一個小boss——KNN算法。 不過也別害怕,這是入門機器學習zui簡單、也zui容易理解的一個算法。
  • 你需要的最全面的K-means聚類指南
    K-means聚類介紹回想一下簇的第一個屬性,它表明簇中的點應該彼此相似。因此,我們的目標是最小化簇內點之間的距離。有一種算法試圖通過它們的質心最小化簇中點的距離,那就是K-means聚類技術。K-means是一種基於質心的算法,或基於距離的算法,我們計算將點分配給一個簇的距離。在K-means中,每個聚類都與一個質心相關聯。
  • 常見的機器學習算法,你知道幾個?
    各種算法以及對應的任務類型接下來就簡單介紹幾種常用的機器學習算法及其應用場景,通過本篇文章大家可以對機器學習的常用算法有個常識性的認識。 一、監督學習(1)支持向量機(Support Vector Machine,SVM):是一類按監督學習方式對數據進行二元分類的廣義線性分類器,其決策邊界是對學習樣本求解的最大邊距超平面。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    總目錄 零基礎全能篇(4套課程) 實用編程技巧進價(1套課程) 數據分析與挖掘(8套課程) 辦公自動化(3套課程) 機器學習與人工智慧(7套課程) 開發實戰篇(4套課程) 量化投資(2套課程) 網絡爬蟲(6套課程) 資料庫操作(1套課程) python
  • 8種常見機器學習算法比較
    ,在機器學習中選擇一個恰當的算法十分重要,文中主要介紹了8種計算機算法及其優缺點,為大家進行算法選擇時提供一點意見。簡介機器學習算法太多了,分類、回歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,所以在實際應用中,我們一般都是採用啟發式學習方式來實驗。通常最開始我們都會選擇大家普遍認同的算法,諸如SVM,GBDT,Adaboost,現在深度學習很火熱,神經網絡也是一個不錯的選擇。