Kmeans聚類數據分析及Anaconda介紹

 這次課程主要講述一個關於Kmeans聚類的數據分析案例,通過這個案例讓同學們簡單瞭解大數據分析的基本流程,以及使用Python實現相關的聚類分析。
        主要內容包括:
        1.Anaconda軟件的安裝過程及簡單配置
        2.聚類及Kmeans算法介紹
        3.案例分析:Kmeans實現運動員位置聚集
        前文推薦:【Python數據挖掘課程】一.安裝Python及爬蟲入門介紹
        希望這篇文章對你有所幫助,尤其是剛剛接觸數據挖掘以及大數據的同學,同時準備嘗試以案例爲主的方式進行講解。如果文章中存在不足或錯誤的地方,還請海涵~


一. Anaconda軟件安裝及使用步驟

        前面兩節課我是通過Python命令行和IDLE工具進行介紹的,但是裏面的配置比較麻煩,包括pip安裝,selenium、lda各種第三方包的安裝。

        從這節課我準備使用Anacaonda軟件來講解,它集成了各種python的第三方包,尤其包括數據挖掘和數據分析常用的幾個包。
        下載地址:https://www.continuum.io/downloads/
        雲盤分享:http://pan.baidu.com/s/1hrEQ9xi

1. 配置過程


        首先簡單介紹安裝過程以及如何使用。

        安裝Anaconda
        安裝過程如下所示:

  

        安裝最好在C盤默認路徑下(空間不大,方便配置),同時不要使用中文路徑。

  

        安裝完成後,點擊“Finish”。點擊Anaconda文件夾,包括這些exe執行文件:


        這裏我們使用Spyder進行編寫Python程序。運行如下所示,左邊是進行代碼編寫的,右下角Console是輸出結果的地方。



        安裝第三方包
        雖然Anaconda軟件集成了各種各樣的包,但是還是缺少一些第三方包,需要通過調用pip或easy_install命令進行安裝。


        然後使用cd ..去到C盤根目錄,cd去到Anaconda的Scripts目錄下,輸入"pip install selenium"安裝selenium相應的包,"pip install lda"安裝lda包。


        推薦文章:Windows下Anaconda的安裝和簡單使用 - yido


2. 機器學習常用包

        下面這四個包通常用於Python數據挖掘和大數據分析的,包括:

        Scikit-Learn
        Scikit-Learn是一個基於python的用於數據挖掘和數據分析的簡單且有效的工具,它的基本功能主要被分爲六個部分:分類(Classification)、迴歸(Regression)、聚類(Clustering)、數據降維(Dimensionality Reduction)、模型選擇(Model Selection)、數據預處理(Preprocessing)。
        詳見官網:http://scikit-learn.org/stable/

        NumPy
        NumPy(Numeric Python)系統是Python的一種開源的數值計算擴展,一個用python實現的科學計算包。它提供了許多高級的數值編程工具,如:矩陣數據類型、矢量處理,以及精密的運算庫。專爲進行嚴格的數字處理而產生。

        SciPy
        SciPy (pronounced "Sigh Pie") 是一個開源的數學、科學和工程計算包。它是一款方便、易於使用、專爲科學和工程設計的Python工具包,包括統計、優化、整合、線性代數模塊、傅里葉變換、信號和圖像處理、常微分方程求解器等等。

        Matplotlib
        Matplotlib是一個Python的圖形框架,類似於MATLAB和R語言。它是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合交互式地進行製圖。而且也可以方便地將它作爲繪圖控件,嵌入GUI應用程序中。


二. 聚類及Kmeans介紹

        這部分內容主要簡單介紹聚類的原理及Kmeans相關知識。
        機器學習的基本思想,我還是介紹下面這張圖,非常經典。


        這裏講述聚類的部分,我簡單推薦"簡書-程sir"的文章,簡單易懂,很不錯。
        推薦地址:http://www.jianshu.com/p/fc91fed8c77b

1. 分類與聚類

        聚類
        俗話說“物以類聚”,其實從廣義上說,聚類就是將數據集中在某些方面相似的數據成員放在一起。一個聚類就是一些數據實例的集合,其中處於相同聚類中的數據元素彼此相似,但是處於不同聚類中的元素彼此不同。
        由於在聚類中那些表示數據類別的分類或分組信息是沒有的,即這些數據是沒有標籤的,所有聚類及時通常被成爲無監督學習(Unsupervised Learning)。
        下圖是800篇文章,每個點可以看成一篇文章,然後對文本進行聚類分析,可以看到相同主題的文章是聚集在一起的。總共四個主題,紅色表示景區Spot、藍色表示人物People、黑色表示國家Country、綠色表示動物Animal。

        分類
        在理解聚類之前,必須要先理解聚類和分類的區別,簡單舉個例子。
        分類其實是從特定的數據中挖掘模式,作出判斷的過程。比如Gmail郵箱裏有垃圾郵件分類器,一開始的時候可能什麼都不過濾,在日常使用過程中,我人工對於每一封郵件點選“垃圾”或“不是垃圾”,過一段時間,Gmail就體現出一定的智能,能夠自動過濾掉一些垃圾郵件了。
        這是因爲在點選的過程中,其實是給每一條郵件打了一個“標籤”,這個標籤只有兩個值,要麼是“垃圾”,要麼“不是垃圾”,Gmail就會不斷研究哪些特點的郵件是垃圾,哪些特點的不是垃圾,形成一些判別的模式,這樣當一封信的郵件到來,就可以自動把郵件分到“垃圾”和“不是垃圾”這兩個我們人工設定的分類的其中一個。


        分類學習主要過程如下:
       (1)訓練數據集存在一個類標記號,判斷它是正向數據集(起積極作用,不垃圾郵件),還是負向數據集(起抑制作用,垃圾郵件);
       (2)然後需要對數據集進行學習訓練,並構建一個訓練的模型;
       (3)通過該模型對預測數據集進預測,並計算其結果的性能。
 
        聚類的的目的也是把數據分類,但是事先我是不知道如何去分的,完全是算法自己來判斷各條數據之間的相似性,相似的就放在一起。在聚類的結論出來之前,我完全不知道每一類有什麼特點,一定要根據聚類的結果通過人的經驗來分析,看看聚成的這一類大概有什麼特點。
        總之,聚類主要是"物以類聚",通過相似性把相似元素聚集在一起,它沒有標籤;而分類通過標籤來訓練得到一個模型,對新數據集進行預測的過程,其數據存在標籤的。


2. Kmeans算法

        該部分轉載簡書-程sir的文章:聚類、K-Means、例子、細節

        K-Means是聚類算法中的最常用的一種,算法最大的特點是簡單,好理解,運算速度快,但是隻能應用於連續型的數據,並且一定要在聚類前需要手工指定要分成幾類。
        下面,我們描述一下K-means算法的過程,爲了儘量不用數學符號,所以描述的不是很嚴謹,大概就是這個意思,“物以類聚、人以羣分”:
        1、首先輸入k的值,即我們希望將數據集經過聚類得到k個分組。
        2、從數據集中隨機選擇k個數據點作爲初始大哥(質心,Centroid)
        3、對集合中每一個小弟,計算與每一個大哥的距離(距離的含義後面會講),離哪個大哥距離近,就跟定哪個大哥。
        4、這時每一個大哥手下都聚集了一票小弟,這時候召開人民代表大會,每一羣選出新的大哥(其實是通過算法選出新的質心)。
        5、如果新大哥和老大哥之間的距離小於某一個設置的閾值(表示重新計算的質心的位置變化不大,趨於穩定,或者說收斂),可以認爲我們進行的聚類已經達到期望的結果,算法終止。
        6、如果新大哥和老大哥距離變化很大,需要迭代3~5步驟。


        下面這個例子很好的,真心推薦大家學習他的博客。

        他搞了6個點,從圖上看應該分成兩推兒,前三個點一堆兒,後三個點是另一堆兒。現在手工執行K-Means,體會一下過程,同時看看結果是不是和預期一致。


        1.選擇初始大哥:
        我們就選P1和P2
        

        2.計算小弟和大哥的距離:
        P3到P1的距離從圖上也能看出來(勾股定理),是√10 = 3.16;P3到P2的距離√((3-1)^2+(1-2)^2 = √5 = 2.24,所以P3離P2更近,P3就跟P2混。同理,P4、P5、P6也這麼算,如下:


        P3到P6都跟P2更近,所以第一次站隊的結果是:
         組A:P1
        • 組B:P2、P3、P4、P5、P6

        3.人民代表大會:
        組A沒啥可選的,大哥還是P1自己
        組B有五個人,需要選新大哥,這裏要注意選大哥的方法是每個人X座標的平均值和Y座標的平均值組成的新的點,爲新大哥,也就是說這個大哥是“虛擬的”。
        因此,B組選出新大哥的座標爲:P哥((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)。
        綜合兩組,新大哥爲P1(0,0),P哥(6.2,5.6),而P2-P6重新成爲小弟。

        4.再次計算小弟到大哥的距離:



        這時可以看到P2、P3離P1更近,P4、P5、P6離P哥更近,第二次站隊的結果是:
        • 組A:P1、P2、P3
        • 組B:P4、P5、P6(虛擬大哥這時候消失)

        5.第二屆人民代表大會:
        按照上一屆大會的方法選出兩個新的虛擬大哥:P哥1(1.33,1) P哥2(9,8.33),P1-P6都成爲小弟。

        6.第三次計算小弟到大哥的距離:



        這時可以看到P1、P2、P3離P哥1更近,P4、P5、P6離P哥2更近,所以第二次站隊的結果是:
        • 組A:P1、P2、P3
        • 組B:P4、P5、P6

        我們發現,這次站隊的結果和上次沒有任何變化了,說明已經收斂,聚類結束,聚類結果和我們最開始設想的結果完全一致。




三. 案例分析:Kmeans聚類運動員數據


1. 數據集

        現在存在下面的數據集,是籃球球員比賽的數據。
        數據集地址:KEEL-dataset - Basketball data set
        該數據集主要包括5個特徵(Features),共96行數據。


        特徵描述:共5個特徵,每分鐘助攻數、運動員身高、運動員出場時間、運動員年齡和每分鐘得分數。

        20行數據集如下:

[html] view plain copy
  1. assists_per_minute  height  time_played  age  points_per_minute  
  2. 0               0.0888     201        36.02   28             0.5885  
  3. 1               0.1399     198        39.32   30             0.8291  
  4. 2               0.0747     198        38.80   26             0.4974  
  5. 3               0.0983     191        40.71   30             0.5772  
  6. 4               0.1276     196        38.40   28             0.5703  
  7. 5               0.1671     201        34.10   31             0.5835  
  8. 6               0.1906     193        36.20   30             0.5276  
  9. 7               0.1061     191        36.75   27             0.5523  
  10. 8               0.2446     185        38.43   29             0.4007  
  11. 9               0.1670     203        33.54   24             0.4770  
  12. 10              0.2485     188        35.01   27             0.4313  
  13. 11              0.1227     198        36.67   29             0.4909  
  14. 12              0.1240     185        33.88   24             0.5668  
  15. 13              0.1461     191        35.59   30             0.5113  
  16. 14              0.2315     191        38.01   28             0.3788  
  17. 15              0.0494     193        32.38   32             0.5590  
  18. 16              0.1107     196        35.22   25             0.4799  
  19. 17              0.2521     183        31.73   29             0.5735  
  20. 18              0.1007     193        28.81   34             0.6318  
  21. 19              0.1067     196        35.60   23             0.4326  
  22. 20              0.1956     188        35.28   32             0.4280  

        需求:現在需要通過運動員的數據,判斷他是什麼位置。
        如果某些運動員得分高,他可能是得分後衛;如果某些運動員身高高或籃板多,他可能是中鋒;助攻高可能是控衛。



2. 代碼

        這裏我僅僅使用兩列數據,助攻數和得分數進行實驗,相當於20*2的矩陣,其中輸出y_pred結果表示聚類的類標。類簇數設置爲3,類標位0、1、2,它也是與20個球員數據一一對應的。
        Sklearn機器學習包中導入了KMeans聚類,同時需要注意Matplotlib包繪製圖形的過程。代碼如下,幷包括詳細註釋:

[python] view plain copy
  1. """ 
  2. 第一部分:導入包 
  3. 從sklearn.cluster機器學習聚類包中導入KMeans聚類 
  4. """  
  5. # coding=utf-8    
  6. from sklearn.cluster import Birch  
  7. from sklearn.cluster import KMeans  
  8.   
  9. """ 
  10. 第二部分:數據集 
  11. X表示二維矩陣數據,籃球運動員比賽數據 
  12. 總共20行,每行兩列數據 
  13. 第一列表示球員每分鐘助攻數:assists_per_minute 
  14. 第二列表示球員每分鐘得分數:points_per_minute 
  15. """  
  16.   
  17. X = [[0.08880.5885],  
  18.      [0.13990.8291],  
  19.      [0.07470.4974],  
  20.      [0.09830.5772],  
  21.      [0.12760.5703],  
  22.      [0.16710.5835],  
  23.      [0.19060.5276],  
  24.      [0.10610.5523],  
  25.      [0.24460.4007],  
  26.      [0.16700.4770],  
  27.      [0.24850.4313],  
  28.      [0.12270.4909],  
  29.      [0.12400.5668],  
  30.      [0.14610.5113],  
  31.      [0.23150.3788],  
  32.      [0.04940.5590],  
  33.      [0.11070.4799],  
  34.      [0.25210.5735],  
  35.      [0.10070.6318],  
  36.      [0.10670.4326],  
  37.      [0.19560.4280]     
  38.     ]  
  39.   
  40. #輸出數據集  
  41. print X  
  42.   
  43.   
  44. """ 
  45. 第三部分:KMeans聚類 
  46. clf = KMeans(n_clusters=3) 表示類簇數爲3,聚成3類數據,clf即賦值爲KMeans 
  47. y_pred = clf.fit_predict(X) 載入數據集X,並且將聚類的結果賦值給y_pred 
  48. """  
  49.   
  50. clf = KMeans(n_clusters=3)  
  51. y_pred = clf.fit_predict(X)  
  52.   
  53. #輸出完整Kmeans函數,包括很多省略參數  
  54. print(clf)  
  55. #輸出聚類預測結果,20行數據,每個y_pred對應X一行或一個球員,聚成3類,類標爲0、1、2  
  56. print(y_pred)  
  57.   
  58.   
  59. """ 
  60. 第四部分:可視化繪圖 
  61. Python導入Matplotlib包,專門用於繪圖 
  62. import matplotlib.pyplot as plt 此處as相當於重命名,plt用於顯示圖像 
  63. """  
  64.   
  65. import numpy as np  
  66. import matplotlib.pyplot as plt  
  67.   
  68. #獲取第一列和第二列數據 使用for循環獲取 n[0]表示X第一列  
  69. x = [n[0for n in X]  
  70. print x  
  71. y = [n[1for n in X]  
  72. print y  
  73.   
  74. #繪製散點圖 參數:x橫軸 y縱軸 c=y_pred聚類預測結果 marker類型 o表示圓點 *表示星型 x表示點  
  75. plt.scatter(x, y, c=y_pred, marker='x')  
  76.   
  77. #繪製標題  
  78. plt.title("Kmeans-Basketball Data")  
  79.   
  80. #繪製x軸和y軸座標  
  81. plt.xlabel("assists_per_minute")  
  82. plt.ylabel("points_per_minute")  
  83.   
  84. #設置右上角圖例  
  85. plt.legend(["A","B","C"])  
  86.   
  87. #顯示圖形  
  88. plt.show()  
        注意:後面會介紹如何讀取數據進行聚類的。
        聚類核心代碼:
        from sklearn.cluster import KMeans
        clf = KMeans(n_clusters=3)
        y_pred = clf.fit_predict(X)


        繪圖核心代碼:
        import matplotlib.pyplot as plt
        plt.scatter(x, y, c=y_pred, marker='x')
        plt.title("Kmeans-Basketball Data")
        plt.xlabel("assists_per_minute")
        plt.ylabel("points_per_minute")
        plt.show()



3. 運行結果

運行結果如下所示:

[python] view plain copy
  1. #數據集  
  2. [[0.08880.5885], [0.13990.8291], [0.07470.4974], [0.09830.5772], [0.12760.5703], [0.16710.5835], [0.19060.5276], [0.10610.5523], [0.24460.4007], [0.1670.477], [0.24850.4313], [0.12270.4909], [0.1240.5668], [0.14610.5113], [0.23150.3788], [0.04940.559], [0.11070.4799], [0.25210.5735], [0.10070.6318], [0.10670.4326], [0.19560.428]]  
  3.   
  4. #KMeans函數  
  5. KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=3, n_init=10,  
  6.     n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,  
  7.     verbose=0)  
  8.   
  9. #y_pred 預測的聚類類標結果  
  10. [0 2 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1]  
  11.   
  12. #獲取x、y座標  
  13. [0.08880.13990.07470.09830.12760.16710.19060.10610.24460.1670.24850.12270.1240.14610.23150.04940.11070.25210.10070.10670.1956]  
  14. [0.58850.82910.49740.57720.57030.58350.52760.55230.40070.4770.43130.49090.56680.51130.37880.5590.47990.57350.63180.43260.428]  
        輸出圖形如下所示:


        如果設置marker='o',輸出圓形,可以看到紅色點很高,他得分和助攻都比較高,相當於籃球裏面的"喬丹",然後中間一部分,右下角一部分助攻很高、得分低,可能是控衛。當然數據集越多,聚類的效果越好。



        常見問題:
        1、安裝Anaconda不能使用中文路徑,以及電腦名稱爲中文;
        2、Spyder如何顯示中文,而不是"口口口"亂碼,需要改Fonts;
        3、Matplotlib如何顯示顏色,定義樣式等;
        4、如何讀取數據,賦值給變量,在讓其顯示。

        希望這篇文章對你有所幫助,主要是介紹一個基於Python的Kmeans聚類案例,後面會陸續詳細介紹各種知識。非常想上好這門課,因爲是我的專業方向,另外學生們真的好棒,好認真,用手機錄像、問問題、配環境等等,只要有用心的學生,我定不負你!同時,這節課的思路好點了,摸着石頭過馬路,需要慢慢學吧,但還是挺享受的,畢竟9800,哈哈哈!
        (By:Eastmount 2016-10-10 晚上10點  http://blog.csdn.net/eastmount/ )

最後提供籃球的完整數據集:

[python] view plain copy
  1. @relation basketball  
  2. @attribute assists_per_minuteReal real [0.04940.3437]  
  3. @attribute heightInteger integer [160203]  
  4. @attribute time_playedReal real [10.0840.71]  
  5. @attribute ageInteger integer [2237]  
  6. @attribute points_per_minuteReal real [0.15930.8291]  
  7. @inputs assists_per_minuteReal, heightInteger, time_playedReal, ageInteger, points_per_minuteReal  
  8. @data  
  9. 0.088820136.02280.5885  
  10. 0.139919839.32300.8291  
  11. 0.074719838.8260.4974  
  12. 0.098319140.71300.5772  
  13. 0.127619638.4280.5703  
  14. 0.167120134.1310.5835  
  15. 0.190619336.2300.5276  
  16. 0.106119136.75270.5523  
  17. 0.244618538.43290.4007  
  18. 0.16720333.54240.477  
  19. 0.248518835.01270.4313  
  20. 0.122719836.67290.4909  
  21. 0.12418533.88240.5668  
  22. 0.146119135.59300.5113  
  23. 0.231519138.01280.3788  
  24. 0.049419332.38320.559  
  25. 0.110719635.22250.4799  
  26. 0.252118331.73290.5735  
  27. 0.100719328.81340.6318  
  28. 0.106719635.6230.4326  
  29. 0.195618835.28320.428  
  30. 0.182819129.54280.4401  
  31. 0.162719631.35280.5581  
  32. 0.140319833.5230.4866  
  33. 0.156319334.56320.5267  
  34. 0.268118339.53270.5439  
  35. 0.123619626.7340.4419  
  36. 0.1318830.77260.3998  
  37. 0.089619825.67300.4325  
  38. 0.207117836.22300.4086  
  39. 0.224418536.55230.4624  
  40. 0.343718534.91310.4325  
  41. 0.105819128.35280.4903  
  42. 0.232618533.53270.4802  
  43. 0.157719331.07250.4345  
  44. 0.232718536.52320.4819  
  45. 0.125619627.87290.6244  
  46. 0.10719824.31340.3991  
  47. 0.134319331.26280.4414  
  48. 0.058619622.18230.4013  
  49. 0.238318535.25260.3801  
  50. 0.100619822.87300.3498  
  51. 0.216419324.49320.3185  
  52. 0.148519823.57270.3097  
  53. 0.22719131.72270.4319  
  54. 0.164918827.9250.3799  
  55. 0.118819122.74240.4091  
  56. 0.19419320.62270.3588  
  57. 0.249518530.46250.4727  
  58. 0.237818532.38270.3212  
  59. 0.159219125.75310.3418  
  60. 0.206917033.84300.4285  
  61. 0.208418527.83250.3917  
  62. 0.087719321.67260.5769  
  63. 0.10119321.79240.4773  
  64. 0.094220120.17260.4512  
  65. 0.05519329.07310.3096  
  66. 0.107119624.28240.3089  
  67. 0.072819319.24270.4573  
  68. 0.277118027.07280.3214  
  69. 0.052819618.95220.5437  
  70. 0.21318821.59300.4121  
  71. 0.135619313.27310.2185  
  72. 0.104319616.3230.3313  
  73. 0.11319123.01250.3302  
  74. 0.147719620.31310.4677  
  75. 0.131718817.46330.2406  
  76. 0.218719121.95280.3007  
  77. 0.212718814.57370.2471  
  78. 0.254716034.55280.2894  
  79. 0.159119122.0240.3682  
  80. 0.089819613.37340.389  
  81. 0.214618820.51240.512  
  82. 0.187118319.78280.4449  
  83. 0.152819116.36330.4035  
  84. 0.15619116.03230.2683  
  85. 0.234818824.27260.2719  
  86. 0.162318018.49280.3408  
  87. 0.123918017.76260.4393  
  88. 0.217818513.31250.3004  
  89. 0.160818517.41260.3503  
  90. 0.080519313.67250.4388  
  91. 0.177619317.46270.2578  
  92. 0.166818514.38350.2989  
  93. 0.107218812.12310.4455  
  94. 0.182118512.63250.3087  
  95. 0.18818012.24300.3678  
  96. 0.116719612.0240.3667  
  97. 0.261718524.46270.3189  
  98. 0.199418820.06270.4187  
  99. 0.170617017.0250.5059  
  100. 0.155418311.58240.3195  
  101. 0.228218510.08240.2381  
  102. 0.177818518.56230.2802  
  103. 0.186318511.81230.381  
  104. 0.101419313.81320.1593  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章