一、前言:

今天在宿舍弄了一个下午的代码,总算还好,把这个东西算是熟悉了,还不算是力竭,只算是知道了怎么回事。今天就给大家分享一下我的代码。代码可以运行,运行的Python环境是Python3.6以上的版本,需要用到Python中的numpy、matplotlib包,这一部分代码将K-means算法进行了实现。当然这还不是最优的代码,只是在功能上已经实现了该算法的功能。

二、代码部分:

  1. import numpy as np
  2. import random
  3. from matplotlib import pyplot as plt
  4.  
  5. class K_means(object):
  6. def __init__(self,X,k,maxIter):
  7. self.X = X#数据集 是一个矩阵
  8. self.k = k#所需要分的类的数
  9. self.maxIter = maxIter#所允许的程序执行的最大的循环次数
  10.  
  11. def K_means(self):
  12. row,col = self.X.shape#得到矩阵的行和列
  13.  
  14. dataset = np.zeros((row,col + 1))#新生成一个矩阵,行数不变,列数加1 新的列用来存放分组号别 矩阵中的初始值为0
  15. dataset[:,:-1] = self.X
  16. 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 not self.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. return dataset
  38.  
  39. def stop(self,oldCenterpoints,centerpoints,iterations):
  40. if iterations > self.maxIter:
  41. return True
  42. return np.array_equal(oldCenterpoints,centerpoints)#返回两个点多对比结果
  43.  
  44. def updateLabel(self,dataset,centerpoints):
  45. row,col = self.X.shape
  46. for i in range(0,row):
  47. dataset[i,-1] = self.getLabel(dataset[i,:-1],centerpoints)
  48. #[i,j] 表示i行j列
  49.  
  50. #返回当前行和中心点之间的距离最短的中心点的类别,即当前点和那个中心点最近就被划分到哪一部分
  51. def getLabel(self,datasetRow,centerpoints):
  52. label = centerpoints[0, -1]#先取第一行的标签值赋值给该变量
  53. minDist = np.linalg.norm(datasetRow-centerpoints[0, :-1])#计算两点之间的直线距离
  54. for i in range(1, centerpoints.shape[0]):
  55. dist = np.linalg.norm(datasetRow-centerpoints[i, :-1])
  56. if dist < minDist:#当该变距离中心点的距离小于预设的最小值,那么将最小值进行更新
  57. minDist = dist
  58. label = centerpoints[i,-1]
  59. print("minDist:" + str(minDist) + ",belong to label:" + str(label))
  60. return label
  61.  
  62. def getCenterpoint(self,dataset):
  63. newCenterpoint = np.zeros((self.k,dataset.shape[1]))#生成一个新矩阵,行是k值,列是数据集的列的值
  64. for i in range(1,self.k+1):
  65. oneCluster = dataset[dataset[:,-1] == i,:-1]#取出上一次分好的类别的所有属于同一类的点,对其求平均值
  66. newCenterpoint[i-1, :-1] = np.mean(oneCluster,axis=0)#axis=1表示对行求平均值,=0表示对列求平均值
  67. newCenterpoint[i-1, -1] = i#重新对新的中心点进行分类,初始类
  68.  
  69. return newCenterpoint
  70.  
  71. #将散点图画出来
  72. def drawScatter(self):
  73. plt.xlabel("X")
  74. plt.ylabel("Y")
  75. dataset = self.K_means()
  76. x = dataset[:, 0] # 第一列的数值为横坐标
  77. y = dataset[:, 1] # 第二列的数值为纵坐标
  78. c = dataset[:, -1] # 最后一列的数值用来区分颜色
  79. color = ["none", "b", "r", "g", "y","m","c","k"]
  80. c_color = []
  81.  
  82. for i in c:
  83. c_color.append(color[int(i)])#给每一种类别的点都涂上不同颜色,便于观察
  84.  
  85. plt.scatter(x=x, y=y, c=c_color, marker="o")#其中x表示横坐标的值,y表示纵坐标的
  86. # 值,c表示该点显示出来的颜色,marker表示该点多形状,‘o’表示圆形
  87. plt.show()
  88.  
  89. if __name__ == '__main__':
  90.  
  91. '''
  92. 关于numpy中的存储矩阵的方法,这里不多介绍,可以自行百度。这里使用的是
  93. np.save("filename.npy",X)其中X是需要存储的矩阵
  94. 读取的方法就是代码中的那一行代码,可以不用修改任何参数,导出来的矩阵和保存之前的格式一模一样,很方便。
  95. '''
  96. # X = np.load("testSet-kmeans.npy")#从文件中读取数据
  97. #自动生成数据
  98. X = np.zeros((1,2))
  99. for i in range(1000):
  100. X = np.row_stack((X,np.array([random.randint(1,100),random.randint(1,100)])))
  101. k = 5 #表示待分组的组数
  102.  
  103. kmeans = K_means(X=X,k=k,maxIter=100)
  104. kmeans.drawScatter()

 三、显示效果:

Python之机器学习K-means算法实现的更多相关文章

  1. 秒懂机器学习---k临近算法(KNN)

    秒懂机器学习---k临近算法(KNN) 一.总结 一句话总结: 弄懂原理,然后要运行实例,然后多解决问题,然后想出优化,分析优缺点,才算真的懂 1.KNN(K-Nearest Neighbor)算法的 ...

  2. [机器学习] k近邻算法

    算是机器学习中最简单的算法了,顾名思义是看k个近邻的类别,测试点的类别判断为k近邻里某一类点最多的,少数服从多数,要点摘录: 1. 关键参数:k值 && 距离计算方式 &&am ...

  3. 用Python从零开始实现K近邻算法

    KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...

  4. Python3入门机器学习 - k近邻算法

    邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

  5. 机器学习-K最近邻算法

    一.介绍 二.编程 练习一(K最近邻算法在单分类任务的应用): import numpy as np #导入科学计算包import matplotlib.pyplot as plt #导入画图工具fr ...

  6. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  7. 机器学习(1)——K近邻算法

    KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...

  8. 1.K近邻算法

    (一)K近邻算法基础 K近邻(KNN)算法优点 思想极度简单 应用数学知识少(近乎为0) 效果好 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 图解K近邻算法 上图是以 ...

  9. 机器学习 Python实践-K近邻算法

    机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...

  10. python 机器学习(二)分类算法-k近邻算法

      一.什么是K近邻算法? 定义: 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 来源: KNN算法最早是由Cover和Hart提 ...

随机推荐

  1. VUE递归树形目录(vue递归组件)的使用

    1.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...

  2. centos7 ntp服务器配置

    一.ntp服务是什么 1. 定义 NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 2. 发展 首次记载在Internet Enginee ...

  3. 手动制作CA证书

    一.安装 CFSSL 证书下载官方地址:https://pkg.cfssl.org #下面三个安装包,无需下载,之前百度云中的压缩包中都有[root@linux-node1 ~]# cd /usr/l ...

  4. cmake 查看配置选项

    cmake 查看配置选项可以用如下命令 cmake . -LH 查看help > cmake -h    cmake version 2.6-patch 4 Usage cmake [optio ...

  5. android studio打包apk

    转载:http://chenfeicqq.iteye.com/blog/1889160 1)Android Studio菜单Build->Generate Signed APK      (2) ...

  6. ThinkCMF框架使用 - 如何创建应用 -1

    .应用就是application目录下的一个模块,它是独立于其它模块存在的,有自己独立的运行空间: .应用采用MVC的结构: .拿Blog应用举例: Blog Controller 控制器目录(必备) ...

  7. ibatis 常用标签

    prepend:自动在前面加上:自动新手:自动预:自动前置 property:属性 compareValue:指定的常数,值 //判断不相等: <isNotEqual prepend=" ...

  8. 04 Python入门学习-流程控制(if else elif while for)

    一:流程控制if 语法一: if 条件: code1 code2 code3 ... age = 20 height = 170 weight = 60 sex = 'female' is_beaut ...

  9. dojo表格操作的简单示例(建立表格)

    代码示例: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w ...

  10. Photoshop 原画绘制

    ... <伯里曼> 手绘.鼠绘和板绘.