1 importnumpy as np2 importrandom3 from matplotlib importpyplot as plt4

5 classK_means(object):6 def __init__(self,X,k,maxIter):7 self.X = X#数据集 是一个矩阵

8 self.k = k#所需要分的类的数

9 self.maxIter = maxIter#所允许的程序执行的最大的循环次数

10

11 defK_means(self):12 row,col = self.X.shape#得到矩阵的行和列

13

14 dataset = np.zeros((row,col + 1))#新生成一个矩阵,行数不变,列数加1 新的列用来存放分组号别 矩阵中的初始值为0

15 dataset[:,:-1] =self.X16 print("begin:dataset:\n" +repr(dataset))17 #centerpoints = dataset[0:2,:]#取数据集中的前两个点为中心点

18 centerpoints = dataset[np.random.randint(row,size=k)]#采用随机函数任意取两个点

19

20 centerpoints[:,-1] = range(1,self.k+1)21 oldCenterpoints = None #用来在循环中存放上一次循环的中心点

22 iterations = 1 #当前循环次数

23

24 while notself.stop(oldCenterpoints,centerpoints,iterations):25 print("corrent iteration:" +str(iterations))26 print("centerpoint:\n" +repr(centerpoints))27 print("dataset:\n" +repr(dataset))28

29 oldCenterpoints = np.copy(centerpoints)#将本次循环的点拷贝一份 记录下来

30 iterations += 1

31

32 self.updateLabel(dataset,centerpoints)#将本次聚类好的结果存放到矩阵中

33

34 centerpoints = self.getCenterpoint(dataset)#得到新的中心点,再次进行循环计算

35

36 np.save("kmeans.npy", dataset)37 returndataset38

39 defstop(self,oldCenterpoints,centerpoints,iterations):40 if iterations >self.maxIter:41 returnTrue42 return np.array_equal(oldCenterpoints,centerpoints)#返回两个点多对比结果

43

44

45 defupdateLabel(self,dataset,centerpoints):46 row,col =self.X.shape47 for i inrange(0,row):48 dataset[i,-1] = self.getLabel(dataset[i,:-1],centerpoints)49 #[i,j] 表示i行j列

50

51 #返回当前行和中心点之间的距离最短的中心点的类别,即当前点和那个中心点最近就被划分到哪一部分

52 defgetLabel(self,datasetRow,centerpoints):53 label = centerpoints[0, -1]#先取第一行的标签值赋值给该变量

54 minDist = np.linalg.norm(datasetRow-centerpoints[0, :-1])#计算两点之间的直线距离

55 for i in range(1, centerpoints.shape[0]):56 dist = np.linalg.norm(datasetRow-centerpoints[i, :-1])57 if dist < minDist:#当该变距离中心点的距离小于预设的最小值,那么将最小值进行更新

58 minDist =dist59 label = centerpoints[i,-1]60 print("minDist:" + str(minDist) + ",belong to label:" +str(label))61 returnlabel62

63 defgetCenterpoint(self,dataset):64 newCenterpoint = np.zeros((self.k,dataset.shape[1]))#生成一个新矩阵,行是k值,列是数据集的列的值

65 for i in range(1,self.k+1):66 oneCluster = dataset[dataset[:,-1] == i,:-1]#取出上一次分好的类别的所有属于同一类的点,对其求平均值

67 newCenterpoint[i-1, :-1] = np.mean(oneCluster,axis=0)#axis=0表示对行求平均值,=1表示对列求平均值

68 newCenterpoint[i-1, -1] = i#重新对新的中心点进行分类,初始类

69

70 returnnewCenterpoint71

72 #将散点图画出来

73 defdrawScatter(self):74 plt.xlabel("X")75 plt.ylabel("Y")76 dataset =self.K_means()77 x = dataset[:, 0] #第一列的数值为横坐标

78 y = dataset[:, 1] #第二列的数值为纵坐标

79 c = dataset[:, -1] #最后一列的数值用来区分颜色

80 color = ["none", "b", "r", "g", "y","m","c","k"]81 c_color =[]82

83 for i inc:84 c_color.append(color[int(i)])#给每一种类别的点都涂上不同颜色,便于观察

85

86 plt.scatter(x=x, y=y, c=c_color, marker="o")#其中x表示横坐标的值,y表示纵坐标的

87 #值,c表示该点显示出来的颜色,marker表示该点多形状,‘o’表示圆形

88 plt.show()89

90

91 if __name__ == ‘__main__‘:92

93

94 ‘‘‘

95 关于numpy中的存储矩阵的方法,这里不多介绍,可以自行百度。这里使用的是96 np.save("filename.npy",X)其中X是需要存储的矩阵97 读取的方法就是代码中的那一行代码,可以不用修改任何参数,导出来的矩阵和保存之前的格式一模一样,很方便。98 ‘‘‘

99 #X = np.load("testSet-kmeans.npy")#从文件中读取数据

100 #自动生成数据

101 X = np.zeros((1,2))102 for i in range(1000):103 X = np.row_stack((X,np.array([random.randint(1,100),random.randint(1,100)])))104 k = 5 #表示待分组的组数

105

106 kmeans = K_means(X=X,k=k,maxIter=100)107 kmeans.drawScatter()

python中kmeans怎么导入数据集_通过Python实践K-means算法相关推荐

  1. python从date目录导入数据集_使用python划分数据集

    无论是训练机器学习或是深度学习,第一步当然是先划分数据集啦,今天小白整理了一些划分数据集的方法,希望大佬们多多指教啊,嘻嘻~ 首先看一下数据集的样子,flower_data文件夹下有四个文件夹,每个文 ...

  2. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  3. python中for语句的使用_对Python中for复合语句的使用示例讲解

    当Python中用到双重for循环设计的时候我一般会使用循环的嵌套,但是在Python中其实还存在另一种技巧--for复合语句. 简单写一个小程序,用于延时循环嵌套功能如下: #!/usr/bin/p ...

  4. python中idx是什么意思_使用Python解析MNIST数据集(IDX文件格式)

    前言 最近在学习Keras,要使用到LeCun大神的MNIST手写数字数据集,直接从官网上下载了4个压缩包: MNIST数据集 解压后发现里面每个压缩包里有一个idx-ubyte文件,没有图片文件在里 ...

  5. python中for循环语句格式_关于Python中的for循环控制语句

    #第一个:求 50 - 100 之间的质数 import math for i in range(50, 100 + 1): for j in range(2, int(math.sqrt(i)) + ...

  6. python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解

    0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的m ...

  7. python中使用grpc方法示例_在Python中使用gRPC的方法示例

    本文介绍了在Python中使用gRPC的方法示例,分享给大家,具体如下: 使用Protocol Buffers的跨平台RPC系统. 安装 使用 pip pip install grpcio pip i ...

  8. python中mod是什么意思_【python中,mod_python到底做了些什么呢?】mod python 教程

    python 编程小白 ,不会用doctest 请大神指教怎么用!! >>> >>> def is_between(v, lower, higher): ...   ...

  9. python中二进制和文本不同_关于Python字符编码与二进制不得不说的一些事

    二进制 核心思想: 冯诺依曼 + 图灵机 电如何表示状态,才能稳定? 计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性, 简单始终是建立再稳定.可靠基础上 经过尝试10进制,但 ...

最新文章

  1. THE世界大学排名发布:牛津大学蝉联榜首,清华大学亚洲第一
  2. 《LeetCode力扣练习》第11题 C语言版 (做出来就行,别问我效率。。。。)
  3. springmvc二: @RequestMapping
  4. how is SAP OData metadata read from CDS view via SADL
  5. 越来越觉得现在的工作很枯燥
  6. Scala的抽象语法树打印小工具-小拉达
  7. 实现算法2.11、2.12的程序
  8. php管理nginx虚拟主机shell脚本
  9. ModuleNotFoundError: No module named ‘librosa‘
  10. input中name和id的区别
  11. java中excel转jpg_Java中excel转换为jpg/png图片 采用aspose-cells-18.6.jar
  12. 【星座】十二星座会因为什么变穷
  13. 令人敬畏的泰格伍兹 万维钢_使用SwiftUI创建令人敬畏的加载状态
  14. 网站中PV、UV、IP的区别
  15. Android中的指纹识别
  16. MyBatis 3.2.8 用户手册 4.1.5 Result Maps
  17. H264码流打包分析.整理
  18. 仓库摆放示意图_仓库合理堆放标准,货物入库摆放规范
  19. ARM状态寄存器-PSR
  20. tooltips插件

热门文章

  1. FMS关于代理共享对象
  2. Linux fork与vfork的区别
  3. 颜色空间YUV、RGB理解(二)
  4. Webrtc半小时搭建视频通话 视频会议
  5. linux /dev/null用法
  6. 机器学习人才的职业薪酬也发展
  7. Srs之state-threads研究
  8. java打印插件_java c/s项目中有没有好用的打印插件?
  9. python修改文件后缀_Python批量修改文件后缀的方法
  10. Android实战练习——简单的网络视频播放器