Python数据挖掘课程 三.Kmeans聚类代码实现、作业及优化

来源:互联网 发布:java 订单号生成规则 编辑:程序博客网 时间:2024/06/16 07:55
 这篇文章直接给出上次关于Kmeans聚类的篮球远动员数据分析案例,同时介绍这次作业同学们完成的图例,最后介绍Matplotlib包绘图的优化知识。
        前文推荐:
       【Python数据挖掘课程】一.安装Python及爬虫入门介绍
       【Python数据挖掘课程】二.Kmeans聚类数据分析及Anaconda介绍
        希望这篇文章对你有所帮助,尤其是刚刚接触数据挖掘以及大数据的同学,同时准备尝试以案例为主的方式进行讲解。如果文章中存在不足或错误的地方,还请海涵~


一. 案例实现

        这里不再赘述,详见第二篇文章,直接上代码,这是我的学生完成的作业。
        数据集:
        下载地址:KEEL-dataset - Basketball data set
        篮球运动员数据,每分钟助攻和每分钟得分数。通过该数据集判断一个篮球运动员属于什么位置(控位、分位、中锋等)。完整数据集包括5个特征,每分钟助攻数、运动员身高、运动员出场时间、运动员年龄和每分钟得分数。

[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  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
 在CODE上查看代码片派生到我的代码片
  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
 在CODE上查看代码片派生到我的代码片
  1. from sklearn.cluster import KMeans  
        表示在sklearn中处理kmeans聚类问题,用到 sklearn.cluster.KMeans 这个类。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. X = [[164,62],[156,50],...]  
        X是数据集,包括2列20行,即20个球员的助攻数和得分数。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. clf = KMeans(n_clusters=3)  
        表示输出完整Kmeans函数,包括很多省略参数,将数据集分成类簇数为3的聚类。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. y_pred =clf.fit_predict(X)  
        输出聚类预测结果,对X聚类,20行数据,每个y_pred对应X的一行或一个孩子,聚成3类,类标为0、1、2。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  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
 在CODE上查看代码片派生到我的代码片
  1. import matplotlib.pyplot as plt  
        matplotlib.pyplot是用来画图的方法,matplotlib是可视化包。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  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
 在CODE上查看代码片派生到我的代码片
  1. plt.scatter(x, y, c=y_pred, marker='o')  
        绘制散点图(scatter),横轴为x,获取的第1列数据;纵轴为y,获取的第2列数据;c=y_pred对聚类的预测结果画出散点图,marker='o'说明用点表示图形。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. plt.title("Kmeans-Basketball Data")  
        表示图形的标题为Kmeans-heightweight Data。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. plt.xlabel("assists_per_minute")  
        表示图形x轴的标题。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. plt.ylabel("points_per_minute")  
        表示图形y轴的标题。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. plt.legend(["Rank"])  
        设置右上角图例。
[python] view plain copy
 在CODE上查看代码片派生到我的代码片
  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
 在CODE上查看代码片派生到我的代码片
  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
 在CODE上查看代码片派生到我的代码片
  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
 在CODE上查看代码片派生到我的代码片
  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)   


        (By:Eastmount 2016-10-12 深夜3点半 http://blog.csdn.net/eastmount/ )

1 0