Python之机器学习K-means算法实现
一、前言:
今天在宿舍弄了一个下午的代码,总算还好,把这个东西算是熟悉了,还不算是力竭,只算是知道了怎么回事。今天就给大家分享一下我的代码。代码可以运行,运行的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算法实现相关推荐
- 机器学习——K近邻算法(KNN)(K Nearest Neighbor)
参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
- 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工具 ...
- [机器学习]K近邻算法及其应用--WEKA工具
K近邻算法理论基础 k近邻模型 距离度量 k值的选择 分类决策规则 WEKA实战 问题背景 数据预处理 得到分类器 对未知的数据进行分类预测 K近邻算法理论基础 (本节内容参考了:李航<统计学习 ...
- 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别
机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...
- k means算法C语言伪代码,K均值算法(K-Means)
1. K-Means算法步骤 算法步骤 收敛性定义,畸变函数(distortion function): 伪代码: 1) 创建k个点作为K个簇的起始质心(经常随机选择) 2) 当任意一个点的蔟分配结果 ...
- 机器学习[k近邻算法]
k近邻算法简称kNN算法,由Thomas等人在1967年提出[1].它基于以下思想:要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本,统计这些样本的类别进行投票, ...
- 机器学习——K近邻算法(KNN)及其python实现
参考视频与文献: https://www.bilibili.com/video/BV1HX4y137TN/?spm_id_from=333.788&vd_source=77c874a500ef ...
- 【机器学习-K近邻算法】
K-近邻算法 K-近邻算法的快速入门 K-近邻(KNN)算法概念 殴式距离公式 电影分类案例 K-近邻算法API Scikit-learn工具 Scikit-learn包含内容 K-近邻算法API方法 ...
- 机器学习--K近邻算法(KNN)(2)
一.简介 K-Nearest-Neighbor 算法是一种常用的监督学习算法,它没有显式的训练过程,是'懒惰学习'的显著代表,此类学习算法仅在训练阶段将训练集保存起来,训练时间开销为0,待收到测试样本 ...
最新文章
- 由浅入深:自己动手开发模板引擎——置换型模板引擎(三)
- 大二c语言数电课程设计,数电课程设计报告(数字钟的设计).doc
- 【Python基础】入门Pandas不可不知的技巧
- 我的工作日志 - 2020年9月29日 星期二 晴
- 前端程序员怎么面试找工作?前端面试技巧分享
- # Mysql免登录重置root密码
- Palo Alto 再次修复一个严重的 PAN-OS 漏洞
- Pr 入门教程,如何倾斜移位效果?
- 2017cad光标大小怎么调_关于调整input里面的输入光标大小
- 用C语言实现“电子词典”项目
- 游戏数据分析方法-活跃向
- 树的深度优先和广度优先
- 固定螺栓系统行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 机器学习小白入门--统计学知识 Z-Value for Proportions
- js 获取当天23点59分59秒 时间戳 (最简单的方法)
- linux根文件系统 /etc/shadow文件详解
- 华为在线笔试题-python
- 关于阿里云OOS文件上传的一些问题
- 区块链革命 - 第1篇 假如需要变革 - 第2章 区块链经济七大设计原则
- windows系统镜像修复计算机,电脑映像损坏怎么修复_windows提示损坏的映像怎么处理...
热门文章
- Linux环境编译安装Mysql以及补装innodb引擎方法
- 码农技术炒股之路——任务管理器
- 人脸检测库libfacedetection介绍
- 【Qt】error: undefined reference to `vtable for MainWindow‘
- android用户界面设计:基本按钮,Android用戶界面設計:基本按鈕
- 98级计算机应用教材,西安外事学院98级计算机应用9806班毕业二十年校友返校
- 基于jsp的图书管理系统_计算机毕业设计基于JSP书籍租阅管理系统的设计与实现...
- mysql 慢日志 作用_MySQL慢查询日志的作用和开启
- Java学习总结:12
- java 重载 参数子类_java - Java中带有子类参数的函数重载 - 堆栈内存溢出