Kmeans聚類代碼實現、作業及優化

一. 案例實現

        這裏不再贅述,詳見第二篇文章,直接上代碼,這是我的學生完成的作業。
        數據集:
        下載地址:KEEL-dataset - Basketball data set
        籃球運動員數據,每分鐘助攻和每分鐘得分數。通過該數據集判斷一個籃球運動員屬於什麼位置(控位、分位、中鋒等)。完整數據集包括5個特徵,每分鐘助攻數、運動員身高、運動員出場時間、運動員年齡和每分鐘得分數。

[python] 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    
        完整代碼:
[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2.     
  3. from sklearn.cluster import Birch    
  4. from sklearn.cluster import KMeans    
  5.     
  6. X = [[0.08880.5885],    
  7.      [0.13990.8291],    
  8.      [0.07470.4974],    
  9.      [0.09830.5772],    
  10.      [0.12760.5703],    
  11.      [0.16710.5835],    
  12.      [0.19060.5276],    
  13.      [0.10610.5523],    
  14.      [0.24460.4007],    
  15.      [0.16700.4770],    
  16.      [0.24850.4313],    
  17.      [0.12270.4909],    
  18.      [0.12400.5668],    
  19.      [0.14610.5113],    
  20.      [0.23150.3788],    
  21.      [0.04940.5590],    
  22.      [0.11070.4799],    
  23.      [0.25210.5735],    
  24.      [0.10070.6318],    
  25.      [0.10670.4326],    
  26.      [0.19560.4280]       
  27.     ]    
  28. print X    
  29.   
  30. # Kmeans聚類  
  31. clf = KMeans(n_clusters=3)    
  32. y_pred = clf.fit_predict(X)    
  33. print(clf)     
  34. print(y_pred)    
  35.   
  36.   
  37. import numpy as np    
  38. import matplotlib.pyplot as plt    
  39.     
  40. x = [n[0for n in X]    
  41. print x    
  42. y = [n[1for n in X]    
  43. print y    
  44.   
  45. # 可視化操作  
  46. plt.scatter(x, y, c=y_pred, marker='x')     
  47. plt.title("Kmeans-Basketball Data")     
  48. plt.xlabel("assists_per_minute")    
  49. plt.ylabel("points_per_minute")    
  50. plt.legend(["Rank"])     
  51. plt.show()    

        運行結果:
        從圖中可以看到聚集成三類,紅色比較厲害,得分很高;中間藍色是一類,普通球員;右小角綠色是一類,助攻高得分低,是控位。


        代碼分析:

[python] view plain copy
  1. from sklearn.cluster import KMeans  
        表示在sklearn中處理kmeans聚類問題,用到 sklearn.cluster.KMeans 這個類。
[python] view plain copy
  1. X = [[164,62],[156,50],...]  
        X是數據集,包括2列20行,即20個球員的助攻數和得分數。
[python] view plain copy
  1. clf = KMeans(n_clusters=3)  
        表示輸出完整Kmeans函數,包括很多省略參數,將數據集分成類簇數爲3的聚類。
[python] view plain copy
  1. y_pred =clf.fit_predict(X)  
        輸出聚類預測結果,對X聚類,20行數據,每個y_pred對應X的一行或一個孩子,聚成3類,類標爲0、1、2。
[python] view plain copy
  1. print(y_pred)  
        輸出結果:[0 2 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 1]
[python] view plain copy
  1. import matplotlib.pyplot as plt  
        matplotlib.pyplot是用來畫圖的方法,matplotlib是可視化包。
[python] view plain copy
  1. x = [n[0for n in X]  
  2. y = [n[1for n in X]  
        獲取第1列的值, 使用for循環獲取 ,n[0]表示X第一列。
        獲取第2列的值,使用for循環獲取 ,n[1]表示X第2列。

[python] view plain copy
  1. plt.scatter(x, y, c=y_pred, marker='o')  
        繪製散點圖(scatter),橫軸爲x,獲取的第1列數據;縱軸爲y,獲取的第2列數據;c=y_pred對聚類的預測結果畫出散點圖,marker='o'說明用點表示圖形。
[python] view plain copy
  1. plt.title("Kmeans-Basketball Data")  
        表示圖形的標題爲Kmeans-heightweight Data。
[python] view plain copy
  1. plt.xlabel("assists_per_minute")  
        表示圖形x軸的標題。
[python] view plain copy
  1. plt.ylabel("points_per_minute")  
        表示圖形y軸的標題。
[python] view plain copy
  1. plt.legend(["Rank"])  
        設置右上角圖例。
[python] view plain copy
  1. plt.show()  
        表示顯示圖形。


二. 學生圖例 

        下面簡單展示學生做的作業及分析,感覺還是不錯,畢竟才上幾節課而且第一次作業,希望後面的作業更加精彩吧。因爲學生的專業分佈不同,所以儘量讓學生設計他們專業的內容。
        eg 遺傳學身高體重數據
        第一列表示孩子的身高,單位cm;第二列表示孩子的體重,單位kg。從上圖可以看出,數據集被分爲了三類。綠色爲一類、藍色爲一類,紅色爲一類。

  
       
        eg 微博數據集
        第一列代表微博中某條信息的轉發量,第二列代表微博中某條信息的評論數。從上圖可以看出,總共分爲3類,共三種顏色,綠色一層說明該信息轉發量與評論數都很高。

        eg 上市公司財務報表
        第一列表示公司利潤率;第二列表示公司資產規模。從上圖可以看出,總共分爲4類,共四種顏色。暗紅色爲資產規模最大,依次至藍色資產規模減小。


        eg 世界各國家人均面積與土地面積
        第一列表示各國家的人均面積(人/ 平方公里);第二列表示各國家的土地面積(萬平方公里)。從上圖可以看出,總共分爲3類,共三種顏色。紅色表示的國家相對來說最擁擠,可能是孟加拉這樣土地面積少且人口衆多的國家;藍色就是地廣人稀的代表,比如俄羅斯、美國、、墨西哥、巴西;綠色表示人口密度分佈比較平均的國家。


        eg employee  salaries數據集
        第一列表示員工工資;第二列表示員工年齡數。從上圖可以看出,總共分爲5類,共5種顏色。總體呈現正相關性,年齡越大,工資越高;除個別外,總體正線性關係。


        eg 學生英語成績數據集
        第一列表示學生英語平時成績;第二列表示學生英語期末成績。從上圖可以看出,總共分爲4類,共四種顏色。黃色一層,平時成績和末考成績都很高,屬於“學霸”級別的人物;其次,藍色一層和紅色一層;最後,天藍色一層,暫且稱之爲“學渣”。



三. Matplotlib繪圖優化

        Matplotlib代碼的優化:
        1.第一部分代碼是定義X數組,實際中是讀取文件進行的,如何實現讀取文件中數據再轉換爲矩陣進行聚類呢?
        2.第二部分是繪製圖形,希望繪製不同的顏色及類型,使用legend()繪製圖標。
        假設存在數據集如下圖所示:data.txt



        數據集包括96個運動員的數據,源自:KEEL-dataset - Basketball data set
        現需要獲取第一列每分鐘助攻數、第五列每分鐘得分數存於矩陣中。

[python] view plain copy
  1. 0.0888     201     36.02     28     0.5885  
  2. 0.1399     198     39.32     30     0.8291  
  3. 0.0747     198     38.8     26     0.4974  
  4. 0.0983     191     40.71     30     0.5772  
  5. 0.1276     196     38.4     28     0.5703  
  6. 0.1671     201     34.1     31     0.5835  
  7. 0.1906     193     36.2     30     0.5276  
  8. 0.1061     191     36.75     27     0.5523  
  9. 0.2446     185     38.43     29     0.4007  
  10. 0.167     203     33.54     24     0.477  
  11. 0.2485     188     35.01     27     0.4313  
  12. 0.1227     198     36.67     29     0.4909  
  13. 0.124     185     33.88     24     0.5668  
  14. 0.1461     191     35.59     30     0.5113  
  15. 0.2315     191     38.01     28     0.3788  
  16. 0.0494     193     32.38     32     0.559  
  17. 0.1107     196     35.22     25     0.4799  
  18. 0.2521     183     31.73     29     0.5735  
  19. 0.1007     193     28.81     34     0.6318  
  20. 0.1067     196     35.6     23     0.4326  
  21. 0.1956     188     35.28     32     0.428  
  22. 0.1828     191     29.54     28     0.4401  
  23. 0.1627     196     31.35     28     0.5581  
  24. 0.1403     198     33.5     23     0.4866  
  25. 0.1563     193     34.56     32     0.5267  
  26. 0.2681     183     39.53     27     0.5439  
  27. 0.1236     196     26.7     34     0.4419  
  28. 0.13     188     30.77     26     0.3998  
  29. 0.0896     198     25.67     30     0.4325  
  30. 0.2071     178     36.22     30     0.4086  
  31. 0.2244     185     36.55     23     0.4624  
  32. 0.3437     185     34.91     31     0.4325  
  33. 0.1058     191     28.35     28     0.4903  
  34. 0.2326     185     33.53     27     0.4802  
  35. 0.1577     193     31.07     25     0.4345  
  36. 0.2327     185     36.52     32     0.4819  
  37. 0.1256     196     27.87     29     0.6244  
  38. 0.107     198     24.31     34     0.3991  
  39. 0.1343     193     31.26     28     0.4414  
  40. 0.0586     196     22.18     23     0.4013  
  41. 0.2383     185     35.25     26     0.3801  
  42. 0.1006     198     22.87     30     0.3498  
  43. 0.2164     193     24.49     32     0.3185  
  44. 0.1485     198     23.57     27     0.3097  
  45. 0.227     191     31.72     27     0.4319  
  46. 0.1649     188     27.9     25     0.3799  
  47. 0.1188     191     22.74     24     0.4091  
  48. 0.194     193     20.62     27     0.3588  
  49. 0.2495     185     30.46     25     0.4727  
  50. 0.2378     185     32.38     27     0.3212  
  51. 0.1592     191     25.75     31     0.3418  
  52. 0.2069     170     33.84     30     0.4285  
  53. 0.2084     185     27.83     25     0.3917  
  54. 0.0877     193     21.67     26     0.5769  
  55. 0.101     193     21.79     24     0.4773  
  56. 0.0942     201     20.17     26     0.4512  
  57. 0.055     193     29.07     31     0.3096  
  58. 0.1071     196     24.28     24     0.3089  
  59. 0.0728     193     19.24     27     0.4573  
  60. 0.2771     180     27.07     28     0.3214  
  61. 0.0528     196     18.95     22     0.5437  
  62. 0.213     188     21.59     30     0.4121  
  63. 0.1356     193     13.27     31     0.2185  
  64. 0.1043     196     16.3     23     0.3313  
  65. 0.113     191     23.01     25     0.3302  
  66. 0.1477     196     20.31     31     0.4677  
  67. 0.1317     188     17.46     33     0.2406  
  68. 0.2187     191     21.95     28     0.3007  
  69. 0.2127     188     14.57     37     0.2471  
  70. 0.2547     160     34.55     28     0.2894  
  71. 0.1591     191     22.0     24     0.3682  
  72. 0.0898     196     13.37     34     0.389  
  73. 0.2146     188     20.51     24     0.512  
  74. 0.1871     183     19.78     28     0.4449  
  75. 0.1528     191     16.36     33     0.4035  
  76. 0.156     191     16.03     23     0.2683  
  77. 0.2348     188     24.27     26     0.2719  
  78. 0.1623     180     18.49     28     0.3408  
  79. 0.1239     180     17.76     26     0.4393  
  80. 0.2178     185     13.31     25     0.3004  
  81. 0.1608     185     17.41     26     0.3503  
  82. 0.0805     193     13.67     25     0.4388  
  83. 0.1776     193     17.46     27     0.2578  
  84. 0.1668     185     14.38     35     0.2989  
  85. 0.1072     188     12.12     31     0.4455  
  86. 0.1821     185     12.63     25     0.3087  
  87. 0.188     180     12.24     30     0.3678  
  88. 0.1167     196     12.0     24     0.3667  
  89. 0.2617     185     24.46     27     0.3189  
  90. 0.1994     188     20.06     27     0.4187  
  91. 0.1706     170     17.0     25     0.5059  
  92. 0.1554     183     11.58     24     0.3195  
  93. 0.2282     185     10.08     24     0.2381  
  94. 0.1778     185     18.56     23     0.2802  
  95. 0.1863     185     11.81     23     0.381  
  96. 0.1014     193     13.81     32     0.1593  
        代碼如下:
[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2.   
  3. """ 
  4. By: Eastmount CSDN 2016-10-12 
  5. 該部分講數據集讀取,然後賦值給X變量 
  6. 讀取文件data.txt 保存結果爲X 
  7. """  
  8.   
  9. import os  
  10.   
  11. data = []  
  12. for line in open("data.txt""r").readlines():  
  13.     line = line.rstrip()    #刪除換行  
  14.     #刪除多餘空格,保存一個空格連接  
  15.     result = ' '.join(line.split())  
  16.     #獲取每行五個值 '0 0.0888 201 36.02 28 0.5885' 注意:字符串轉換爲浮點型數  
  17.     s = [float(x) for x in result.strip().split(' ')]  
  18.     #輸出結果:['0', '0.0888', '201', '36.02', '28', '0.5885']  
  19.     print s  
  20.     #數據存儲至data  
  21.     data.append(s)  
  22.   
  23. #輸出完整數據集  
  24. print u'完整數據集'  
  25. print data  
  26. print type(data)  
  27.   
  28. ''''' 
  29. 現在輸出數據集: 
  30. ['0 0.0888 201 36.02 28 0.5885',  
  31.  '1 0.1399 198 39.32 30 0.8291',  
  32.  '2 0.0747 198 38.80 26 0.4974',  
  33.  '3 0.0983 191 40.71 30 0.5772',  
  34.  '4 0.1276 196 38.40 28 0.5703' 
  35. ] 
  36. '''  
  37.   
  38. print u'第一列 第五列數據'  
  39. L2 = [n[0for n in data]  
  40. print L2  
  41. L5 = [n[4for n in data]  
  42. print L5  
  43.   
  44. ''''' 
  45. X表示二維矩陣數據,籃球運動員比賽數據 
  46. 總共96行,每行獲取兩列數據 
  47. 第一列表示球員每分鐘助攻數:assists_per_minute 
  48. 第五列表示球員每分鐘得分數:points_per_minute 
  49. '''  
  50.   
  51. #兩列數據生成二維數據  
  52. print u'兩列數據合併成二維矩陣'  
  53. T = dict(zip(L2,L5))  
  54. type(T)  
  55.   
  56. #dict類型轉換爲list  
  57. print u'List'  
  58. X = list(map(lambda x,y: (x,y), T.keys(),T.values()))  
  59. print X  
  60. print type(X)  
  61.   
  62.   
  63. """ 
  64. KMeans聚類 
  65. clf = KMeans(n_clusters=3) 表示類簇數爲3,聚成3類數據,clf即賦值爲KMeans 
  66. y_pred = clf.fit_predict(X) 載入數據集X,並且將聚類的結果賦值給y_pred 
  67. """  
  68.   
  69. from sklearn.cluster import Birch  
  70. from sklearn.cluster import KMeans  
  71.   
  72. clf = KMeans(n_clusters=3)  
  73. y_pred = clf.fit_predict(X)  
  74. print(clf)  
  75. #輸出聚類預測結果,96行數據,每個y_pred對應X一行或一個球員,聚成3類,類標爲0、1、2  
  76. print(y_pred)  
  77.   
  78.   
  79. """ 
  80. 可視化繪圖 
  81. Python導入Matplotlib包,專門用於繪圖 
  82. import matplotlib.pyplot as plt 此處as相當於重命名,plt用於顯示圖像 
  83. """  
  84.   
  85. import numpy as np  
  86. import matplotlib.pyplot as plt  
  87.   
  88.   
  89. #獲取第一列和第二列數據 使用for循環獲取 n[0]表示X第一列  
  90. x = [n[0for n in X]  
  91. print x  
  92. y = [n[1for n in X]  
  93. print y   
  94.   
  95. #繪製散點圖 參數:x橫軸 y縱軸 c=y_pred聚類預測結果 marker類型 o表示圓點 *表示星型 x表示點  
  96. #plt.scatter(x, y, c=y_pred, marker='x')  
  97.   
  98.   
  99. #座標  
  100. x1 = []  
  101. y1 = []  
  102.   
  103. x2 = []  
  104. y2 = []  
  105.   
  106. x3 = []  
  107. y3 = []  
  108.   
  109. #分佈獲取類標爲0、1、2的數據 賦值給(x1,y1) (x2,y2) (x3,y3)  
  110. i = 0  
  111. while i < len(X):  
  112.     if y_pred[i]==0:  
  113.         x1.append(X[i][0])  
  114.         y1.append(X[i][1])  
  115.     elif y_pred[i]==1:  
  116.         x2.append(X[i][0])  
  117.         y2.append(X[i][1])  
  118.     elif y_pred[i]==2:  
  119.         x3.append(X[i][0])  
  120.         y3.append(X[i][1])  
  121.       
  122.     i = i + 1  
  123.   
  124.   
  125. #四種顏色 紅 綠 藍 黑    
  126. plot1, = plt.plot(x1, y1, 'or', marker="x")    
  127. plot2, = plt.plot(x2, y2, 'og', marker="o")    
  128. plot3, = plt.plot(x3, y3, 'ob', marker="*")    
  129.   
  130. #繪製標題  
  131. plt.title("Kmeans-Basketball Data")  
  132.   
  133. #繪製x軸和y軸座標  
  134. plt.xlabel("assists_per_minute")  
  135. plt.ylabel("points_per_minute")  
  136.   
  137. #設置右上角圖例  
  138. plt.legend((plot1, plot2, plot3), ('A''B''C'), fontsize=10)  
  139.   
  140. plt.show()    
        輸出結果如下圖所示:三個層次很明顯,而且右上角也標註。

        可視化部分強烈推薦資料:
        數字的可視化:python畫圖之散點圖sactter函數詳解 - hefei_cyp
        python 科學計算(一) - bovine
        Matplotlib scatter plot with legend - stackoverflow
        Python數據可視化——散點圖 Rachel-Zhang(按評論修改代碼)
        關於Matlab作圖的若干問題 - 張朋飛
        



四. Spyder常見問題


        下面是常見遇到的幾個問題:
        1.Spyder軟件如果Editor編輯框不在,如何調出來。

        2.會缺少一些第三方包,如lda,如何導入。使用cd ..去到C盤根目錄,cd去到Anaconda的Scripts目錄下,輸入"pip install selenium"安裝selenium相應的包,"pip install lda"安裝lda包。

        學生告訴我另一個更方便的方法:





        3.運行時報錯,缺少Console,點擊如下。



        4.如果Spyder安裝點擊沒有反應,重新安裝也沒有反應,建議在運行下試試。


        實在不行卸載再重裝:pip uninstall spyder  
                                          pip install spyder


        5.Spyder如何顯示繪製Matplotlib中文。

[python] view plain copy
  1. from matplotlib.font_manager import FontProperties  
  2. font = FontProperties(fname="C:\Windows\Fonts/msyh.ttf", size=10)  
  3. #繪製標題 fontproperties表示字體類型,用於顯示中文字符,下同  
  4. plt.title(u'世界各國家人均面積與土地面積',fontproperties=font)  
  5. #繪製x軸和y軸座標  
  6. plt.ylabel(u'人均面積(人/ 平方公里)',fontproperties=font)  
  7. plt.xlabel(u'面積(萬平方公里)',fontproperties=font)   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章