一、前言:

今天在宿舍弄了一个下午的代码,总算还好,把这个东西算是熟悉了,还不算是力竭,只算是知道了怎么回事。今天就给大家分享一下我的代码。代码可以运行,运行的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
 45     def updateLabel(self,dataset,centerpoints):
 46         row,col = self.X.shape
 47         for i in range(0,row):
 48             dataset[i,-1] = self.getLabel(dataset[i,:-1],centerpoints)
 49             #[i,j] 表示i行j列
 50
 51     #返回当前行和中心点之间的距离最短的中心点的类别,即当前点和那个中心点最近就被划分到哪一部分
 52     def getLabel(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 = dist
 59                 label = centerpoints[i,-1]
 60         print("minDist:" + str(minDist) + ",belong to label:" + str(label))
 61         return label
 62
 63     def getCenterpoint(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=1表示对行求平均值,=0表示对列求平均值
 68             newCenterpoint[i-1, -1] = i#重新对新的中心点进行分类,初始类
 69
 70         return newCenterpoint
 71
 72     #将散点图画出来
 73     def drawScatter(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 in c:
 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()

 三、显示效果:

转载于:https://www.cnblogs.com/jums/p/10420603.html

Python之机器学习K-means算法实现相关推荐

  1. 机器学习——K近邻算法(KNN)(K Nearest Neighbor)

    参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...

  2. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  3. python机器学习 | K近邻算法学习(1)

    K近邻算法学习 1 K近邻算法介绍 1.1算法定义 1.2算法原理 1.3算法讨论 1.3.1 K值选择 1.3.2距离计算 1.3.3 KD树 2 K近邻算法实现 2.1scikit-learn工具 ...

  4. [机器学习]K近邻算法及其应用--WEKA工具

    K近邻算法理论基础 k近邻模型 距离度量 k值的选择 分类决策规则 WEKA实战 问题背景 数据预处理 得到分类器 对未知的数据进行分类预测 K近邻算法理论基础 (本节内容参考了:李航<统计学习 ...

  5. 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别

    机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...

  6. k means算法C语言伪代码,K均值算法(K-Means)

    1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...

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

    k近邻算法简称kNN算法,由Thomas等人在1967年提出[1].它基于以下思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计这些样本的类别进行投票, ...

  8. 机器学习——K近邻算法(KNN)及其python实现

    参考视频与文献: https://www.bilibili.com/video/BV1HX4y137TN/?spm_id_from=333.788&vd_source=77c874a500ef ...

  9. 【机器学习-K近邻算法】

    K-近邻算法 K-近邻算法的快速入门 K-近邻(KNN)算法概念 殴式距离公式 电影分类案例 K-近邻算法API Scikit-learn工具 Scikit-learn包含内容 K-近邻算法API方法 ...

  10. 机器学习--K近邻算法(KNN)(2)

    一.简介 K-Nearest-Neighbor 算法是一种常用的监督学习算法,它没有显式的训练过程,是'懒惰学习'的显著代表,此类学习算法仅在训练阶段将训练集保存起来,训练时间开销为0,待收到测试样本 ...

最新文章

  1. 由浅入深:自己动手开发模板引擎——置换型模板引擎(三)
  2. 大二c语言数电课程设计,数电课程设计报告(数字钟的设计).doc
  3. 【Python基础】入门Pandas不可不知的技巧
  4. 我的工作日志 - 2020年9月29日 星期二 晴
  5. 前端程序员怎么面试找工作?前端面试技巧分享
  6. # Mysql免登录重置root密码
  7. Palo Alto 再次修复一个严重的 PAN-OS 漏洞
  8. Pr 入门教程,如何倾斜移位效果?
  9. 2017cad光标大小怎么调_关于调整input里面的输入光标大小
  10. 用C语言实现“电子词典”项目
  11. 游戏数据分析方法-活跃向
  12. 树的深度优先和广度优先
  13. 固定螺栓系统行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  14. 机器学习小白入门--统计学知识 Z-Value for Proportions
  15. js 获取当天23点59分59秒 时间戳 (最简单的方法)
  16. linux根文件系统 /etc/shadow文件详解
  17. 华为在线笔试题-python
  18. 关于阿里云OOS文件上传的一些问题
  19. 区块链革命 - 第1篇 假如需要变革 - 第2章 区块链经济七大设计原则
  20. windows系统镜像修复计算机,电脑映像损坏怎么修复_windows提示损坏的映像怎么处理...

热门文章

  1. Linux环境编译安装Mysql以及补装innodb引擎方法
  2. 码农技术炒股之路——任务管理器
  3. 人脸检测库libfacedetection介绍
  4. 【Qt】error: undefined reference to `vtable for MainWindow‘
  5. android用户界面设计:基本按钮,Android用戶界面設計:基本按鈕
  6. 98级计算机应用教材,西安外事学院98级计算机应用9806班毕业二十年校友返校
  7. 基于jsp的图书管理系统_计算机毕业设计基于JSP书籍租阅管理系统的设计与实现...
  8. mysql 慢日志 作用_MySQL慢查询日志的作用和开启
  9. Java学习总结:12
  10. java 重载 参数子类_java - Java中带有子类参数的函数重载 - 堆栈内存溢出