Python實現KMeans算法

2021-01-07 高效工作的方法

「Python實現一個算法總是比你理解這個算法更簡單,這也是Python如此流行的原因之一。」

在前面的文章中講過數據離散化和KMeans算法的理論理解。

參見:數據離散化及其KMeans算法實現的理解

這篇文章來看看怎樣用Python實現這個事。

01

目標

有下圖所示的一系列數據,總共有900多條,這是《Python數據分析與挖掘實戰》這本書第4章的案例數據。

從圖中可見,測量值非常多,但實際上肝氣鬱結要麼就是有要麼就是沒有,就兩種情況;再細緻一點,我們可能分成好、不太好、差、很差四類。當然,具體怎樣分法需要這方面的專業人士來定。

反正,就拿過來這樣一堆數據,根據這組數據情況呢把病人給分成四類。

也就是說,我們的目標就是將這900多條數據用K-Means算法給分成4類。

02

實現步驟

Step1,當然是把需要用到的第三方庫給import進來

import pandas as pdimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeans

KMeans就是要用到第三行。

Step2,當然是把數據讀到pandas的dataframe中

datafile = u'../data/discretization_data.xls'data = pd.read_excel(datafile) #這個地方的data的類型是DataFramedata = data[u'肝氣鬱結證型係數'] #這裡的data已經是DataFrame的一列,變成了Series了

上面這個第三行是啥意思呢?因為我們待會要用到的KMeans的輸入數據類型是ndarray的行向量,所以先在這裡把data的一列拿出來。

Step3,創建KMeans的分類器並對Step2中的數據進行聚類。

請看代碼:

k = 4kmodel = KMeans(n_clusters = k, n_jobs = 2) #n_jobs是進程的數量,和cpu個數有關kmodel.fit(data.values.reshape((len(data),1)))c = pd.DataFrame(kmodel.cluster_centers_).sort_values(0) #對聚類中心排序w1 = c.rolling(2).mean().iloc[1:]w = [0] + list(w1[0]) + [data.max()]d_result = pd.cut(data, w, labels = range(k))

就這麼簡單,就7行就搞定了這個事。在這裡,我有必要把這幾行代碼簡要說一下。

第1-3行,就是拿Step2中的數據用KMeans算法給聚類,不是會得到4個分類麼?每個分類不是會有一個中心點麼?如果忘記了,請回過頭去看看這篇文章:數據離散化及其KMeans算法實現的理解。

拿這4個圓心也是存放在第2行創建的這個KMeans的對象kmodel中,確切說在它的cluster_centers_中。它的值是下面圖這樣的,然後再對它們從小到大排序給到c。

第4行,然後我們再把它轉成DataFrame類型,再排一下序(就是代碼第4行幹的事)

第5行,是做窗口平均的,也就是說以rolling的輸入2為窗口大小求平均值。更直白一點,就是第c的(第1個值+第2個值)/2作為新的第2個值,第1個值就沒了,c經過rolling(2)窗口平均後的結果是這樣的。

然後我們把上圖中的第1個值NaN給切掉後再賦給w1。

第6行,是將0作為最小,將data中的最大值作為最大,加入到w1中,w就變成5個值了,c\w1\w分別如下圖的左、中、右。

第7行,所有前面6行都是為這一行服務的,就是要把我們對data分類的5個分類的界限(值)確定下來之後,用cut函數將data分成5類。

Step4:把分類好後的結果給畫出來。代碼如下:

defcluster_plot(d, k): plt.rcParams['font.sans-serif']=['SimHei'] #正常顯示中文標籤 plt.rcParams['axes.unicode_minus'] = False#正常顯示負號 plt.figure(figsize=(8,3))for j in range(0,k): plt.plot(data[d==j],[j for i in d[d==j]],'o') plt.ylim(-0.5, k-0.5)return pltcluster_plot(d_result,k).show()

這裡呢,定義了一個函數cluster_plot的函數,返回一個畫好了cluster的pyplot。

繪製的結果見「03 效果分析」。

03

效果分析

下面這個圖就是聚類完成的結果圖。可以看出來,我們通過KMeans算法找到的幾個分界點將900多個數據給很好的分成了4類。

在沒聚類之前的原始數據是這樣的:

上面那個圖看著舒服多了。

在這篇文章中,我們用KMeans算法對數據進行聚類是非常簡單、粗暴的。並沒有指定距離的計算方法、初始的中心點、結束條件等,都是使用了sklearn.cluster中KMeans的默認值,如果需要更詳細的了解需要去看看sklearn的官方文檔。

04

小結

用Python做數據分析的感覺就是:做之前沒頭緒、做之後感覺挺簡單。

相關焦點

  • 數學推導+純 Python 實現機器學習算法:Kmeans 聚類
    下面我們基於numpy按照前述算法流程來實現一個kmeans算法。回顧上述過程,我們可以先思考一下對算法每個流程該如何定義。首先要定義歐式距離計算函數,然後類中心初始化、根據樣本與類中心的歐式距離劃分類別並獲取聚類結果、根據新的聚類結果重新計算類中心點、重新聚類直到滿足停止條件。
  • 教程 | matlab實現kmeans聚類算法
    kmeans聚類算法是一種簡單實用的聚類算法,matlab自帶函數kmeans可直接對數據進行kmeans聚類。
  • 基於matlab的RBFNN的kmeans算法研究
    摘要:在這個信息量爆炸的社會,高效的處理數據成為重中之重,所以聚類算法就為此提供了技術幫助。聚類解析是把數據進行分類匯總的重要手段,被廣泛應用於當今統計學,大數據運行,信號辨別等眾多行業。聚類算法有多種實現方法,其中kmeans算法是基於距離劃分 的方法來實現聚類。
  • 改良的kmeans與K近鄰算法特性分析
    改良的kmeans算法通過遍歷樣本,篩選初始點,其準確率超過了k近鄰算法,同時穩定性也優於傳統的kmeans算法。無監督算法在一些情況下優於有監督算法。kmeans聚類算法應用於對烤菸外觀的區域分類 [3] 。
  • 最全 Python 算法實現資源匯總!
    整理 | Rachel責編 | Jane出品 | Python大本營(ID:pythonnews)【導語】數據結構與算法是所有人都要學習的基礎課程為了幫助大家在這個假期能提高學習效率,進階 Python 技能,筆者為大家推薦了一份用 Python代碼實現算法的資源帖,涵蓋從入門到高級的各類算法。下文中,筆者首先對項目的整體內容進行了一個歸納,之後為大家選取了幾個內容比較豐富的部分,供大家更高效地使用這一資源。
  • 【源碼】Kmeans聚類算法(超快速、簡潔的設計方法)
    這是一種超快速MATLAB實現的kmeans聚類算法。
  • Kmeans聚類算法
    ,而實現生活中大部分數據是不帶標籤的,從今天起我們要學一些處理不帶標籤數據的非監督算法,先從Kmeans聚類算法開始,我們將從以下幾個方面來介紹Kmeans聚類算法什麼是聚類?Kmeans算法常用的距離公式數學上常用距離來度量兩個對象之間相隔多遠,除此之外,距離還可以用來表示研究對象之間的近似程度,而聚類算法就是要根據研究對象的相似程度來決定哪些應該聚在一起,哪些不應該聚在一起,在聚類算法裡面常用的一些距離公式有歐幾裡得距離,曼哈頓距離,閔可夫斯基距離,切比雪夫距離,夾角餘弦距離和傑卡德距離等。
  • 使用K-means 算法進行客戶分類
    在本部分中,你將理解並學習到如何實現K-Means聚類。保證K-Means算法收斂到局部最優。對於python,我使用的是Spyder Editor。下面,我們將展示K-means算法如何處理客戶費用和發票數據的例子。我們有500個客戶數據,我們關注兩個客戶特徵: 客戶發票,客戶費用。
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。本案例通過鏈家數據進行測試,通過學習,可以學習python機器學習的一般步驟和整個過程。圖4是初始數據,其中面積特徵、格局特徵、裝修特徵都需要量化成數值型,大家可以根據實際情況進行量化。比如精裝對應80,簡裝對應30,毛坯對應10等,本文對這些數值進行如下量化,同時將面積的單位平米去掉,最終訓練數據見圖5.
  • 不足 20 行 Python 代碼,高效實現 k-means 均值聚類算法!
    k-means均值算法雖然是聚類算法中比較簡單的一種,卻包含了豐富的思想內容,非常適合作為初學者的入門習題。關於 k-means 均值聚類算法的原理介紹、實現代碼,網上有很多,但運行效率似乎都有點問題。今天稍微有點空閒,寫了一個不足20行的 k-means 均值聚類算法,1萬個樣本平均耗時20毫秒(10次均值)。同樣的數據樣本,網上流行的算法平均耗時3000毫秒(10次均值)。
  • 送你一份Python算法的打怪升級路線圖 | 用 Python 實現各種常用算法
    對程式設計師來說,算法的重要性不言而喻,算法基礎是否紮實,間接決定了你是月薪5000,還是月薪50000。實驗樓上線了一門免費的Python算法入門課——【用 Python 實現各種常用算法】,主要包括兩部分內容:一是各種算法的基本原理講解,二是各種算法的代碼實現,內容由淺入深,非常適合剛入門Python的同學學習。
  • 機器學習——詳解經典聚類算法Kmeans
    代碼實現Kmeans的原理以及牽引侯貴搞清楚了之後,用Python實現就變得很簡單了。創建完數據之後,下面我們就可以開始算法的實現了。首先,我們先開發整個算法的基礎方法,來簡化後續的開發。在KMeans問題當中,我們已經知道我們是通過向量和各類簇中心在樣本空間的距離來調整樣本的所屬類別。所以,我們先開發向量之間距離的計算方法。
  • 9種常用的機器學習算法實現
    關於算法的原理知乎上有很多精彩的回答,這裡不會贅述,僅給出代碼的實現與可視化。具體原理參考:樸素貝葉斯算法原理小結 - 劉建平Pinard,下面給出代碼的實現。準備數據kmeans_X_data, kmeans_y_data = make_blobs(n_samples=500, centers=5, cluster_std=0.60, random_state=0)# 2. 訓練模型kmeans_model = KMeans(n_clusters=5)kmeans_model.fit(kmeans_X_data)# 3.
  • 數學推導+純Python實現機器學習算法30:系列總結與感悟
    實現機器學習算法3:k近鄰數學推導+純Python實現機器學習算法4:決策樹之ID3算法數學推導+純Python實現機器學習算法5:決策樹之CART算法數學推導+純Python實現機器學習算法6:感知機數學推導+純Python實現機器學習算法7:神經網絡數學推導+純Python實現機器學習算法
  • 百度大數據三面題:shuffle過程+HBase+Spark優化+kmeans算法
    map-reduce程序運行的時候會有什麼比較常見的問題,你簡單描述一下hadoop的TextInputFormat作用是什麼,如何自定義實現?hadoop和spark的都是並行計算,那麼他們有什麼相同和區別呢?
  • k均值聚類算法原理和(TensorFlow)實現(無師自通)
    人是非常擅長分類的,聚類算法試圖讓計算機也具備這種類似的能力,聚類技術很多,例如層次法、貝葉斯法和劃分法。k 均值聚類屬於劃分聚類方法,將數據分成 k 個簇,每個簇有一個中心,稱為質心,k 值需要給定。k 均值聚類算法的工作原理如下:隨機選擇 k 個數據點作為初始質心(聚類中心)。
  • 機器學習之基於sklearn的KMeans聚類
    聚類算法,無監督學習的代表算法,又叫做「無監督分類」即在訓練的時候只需要特徵矩陣,不需要真實值標籤可以有效地幫助我們探索數據的自然分布一、KMeans算法的運行過程運行的流程如下:自動聚類時的質心點的每步驟變化如下:
  • 用python實現遺傳算法
    最近事情比較多,一個月沒有寫公眾號了,但也積累了些不錯的內容可以分享,今天就給大家介紹的是遺傳算法,並用python加以實現。在遺傳算法的學習過程中,在CSDN上看到一篇已有人分享的python代碼,因此直接借鑑過來,並結合《數學建模與數學實驗》進行補充。
  • Python & R數據分析常用包
  • 從零開始:用Python實現KNN算法
    Python部落(python.freelycode.com)組織翻譯,歡迎轉發,禁止轉載k-Nearest Neighbors