当前位置: 首页 > 编程日记 > 正文

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

相关文章:

C++中模板的使用

模板(Template)指C程序设计语言中的函数模板与类模板&#xff0c;是一种参数化类型机制。模板是C泛型编程中不可缺少的一部分。C templates enable you to define a family of functions or classes that can operate on different types of information.模板就是实现代码重用机…

php面试问答

结合实际PHP面试&#xff0c;汇总自己遇到的问题&#xff0c;以及网上其他人遇到的问题&#xff0c;尝试提供简洁准确的答案包含MySQL、Redis、Web、安全、网络协议、PHP、服务器、业务设计、线上故障、个人简历、自我介绍、离职原因、职业规划、准备问题等部分 GitHub: https:…

图解LSTM与GRU单元的各个公式和区别

作者 | Che_Hongshu来源 | AI蜗牛车 &#xff08;ID: AI_For_Car)因为自己LSTM和GRU学的时间相隔很远&#xff0c;并且当时学的也有点小小的蒙圈&#xff0c;也因为最近一直在用lstm&#xff0c;gru等等&#xff0c;所以今天没事好好缕了一下&#xff0c;接下来跟着我一起区分并…

iphone越狱神器

前阵子刚刚换了iphone5&#xff0c;老婆的4就留给我了。一到手就决定越狱&#xff0c;无意中发现了一款越狱神器&#xff1a;爱思助手http://www.i4.cn/ 确实很好用转载于:https://blog.51cto.com/shanks/1306423

json11库的使用

JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式&#xff0c;易于让人阅读。同时也易于机器解析和生成。尽管JSON是Javascript的一个子集&#xff0c;但JSON是独立于语言的文本格式&#xff0c;并且采用了类似于C语言家族的一些习惯。JSON解析器和JSON库支持许…

覆盖10亿设备,月活2亿,快应用要取代App?

作者 | 伍杏玲 来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 2017 年 1 月 9 日&#xff0c;微信小程序横空出世&#xff0c;紧接着支付宝小程序、百度智能小程序、今日头条小程序、12 大厂商联盟的快应用等布局小程序。自此&#xff0c;小程序迅速改变国内移…

跨域的四种方式

本文主要是关于跨域的几种方式&#xff0c;关于什么是跨域这里就不多说了&#xff0c;写这个也是为了记住一些知识点的。 一. jsonp jsonp的跨域方式很容易理解&#xff0c;页面的的每一个script标签浏览器都会发送get请求获取对应的文本资源&#xff0c;获取到了之后&#xff…

使用模式创建一个面向服务的组件中间件

引言 在本文中&#xff0c;您将了解面向服务的组件中间件在用于资源有限的语音设备时&#xff0c;在设计阶段所应用的模式。它涵盖了项目的问题上下文&#xff0c;并被看成是一组决定因素&#xff0c;是对相关体系结构远景的一个简要概括。您还会得到一份描述&#xff0c;其中介…

OpenCV代码提取:遍历指定目录下指定文件的实现

OpenCV 3.1之前的版本&#xff0c;在contrib目录下有提供遍历文件的函数&#xff0c;用起来比较方便。但是在最新的OpenCV 3.1版本给去除掉了。为了以后使用方便&#xff0c;这里将OpenCV 2.4.9中相关的函数给提取了出来&#xff0c;适合在Windows 64bits上使用。directory.hpp…

姚班三兄弟3万块创业八年,旷视终冲刺港股

作者 | 余洋洋 杨健楷编辑 | 张丽娟来源 | CV智识&#xff08;ID:CVAI2019&#xff09;旷视此次 IPO 或将成为整个 AI 行业的信号&#xff0c;不只是“ 四小龙”的另外三家——商汤、依图、云从&#xff0c;整个 AI 行业的创业公司都将受到影响。8月25日晚&#xff0c;AI 独角兽…

Java类加载器详解

Java虚拟机中的类加载有三大步骤&#xff1a;&#xff0c;链接&#xff0c;初始化&#xff0e;其中加载是指查找字节流&#xff08;也就是由Java编译器生成的class文件&#xff09;并据此创建类的过程&#xff0c;这中间我们需要借助类加载器来查找字节流&#xff0e; Java虚拟…

linux svn客户端的使用

一下内容转载于&#xff1a;http://blog.chinaunix.net/space.php?uid22976768&doblog&id1640924。这个总结的很好~ windows下的TortoiseSVN是资源管理器的一个插件&#xff0c;以覆盖图标表示文件状态&#xff0c;几乎所以命令都有图形界面支持&#xff0c;比较好用&…

C++中vector的使用

向量std::vector是一种对象实体&#xff0c;能够容纳许多各种类型相同的元素&#xff0c;包括用户自定义的类&#xff0c;因此又被称为序列容器。与string相同&#xff0c;vector同属于STL(Standard Template Library)中的一种自定义的数据类型&#xff0c;可以广义上认为是数组…

说出来你可能不信,现在酒厂都在招算法工程师

导语&#xff1a;虽然夏日已过&#xff0c;但人们喝啤酒的热情还在持续高涨。不过随着大众的追求和理念提升&#xff0c;对于啤酒的要求也越来越高&#xff0c;比如逐渐兴起的精酿之风&#xff0c;都在印证人们在啤酒的口感和风味上&#xff0c;拥有更加「苛刻」的要求。那么这…

「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

前言 这是前端面试题系列的第 7 篇&#xff0c;你可能错过了前面的篇章&#xff0c;可以在这里找到&#xff1a; 理解函数的柯里化ES6 中箭头函数的用法this 的原理以及用法伪类与伪元素的区别及实战如何实现一个圣杯布局&#xff1f;今日头条 面试题和思路解析最近&#xff0c…

安装Ecshop首页出现报错:Only variables should be passed by referen

出现下面这就话&#xff1a; Strict Standards: Only variables should be passed by reference in D:\wamp\ecshop\includes\cls_template.php on line 406 第406行&#xff1a;$tag_sel array_shift(explode( , $tag)); 解决办法 1 5.3以上版本的问题&#xff0c;应该也和配…

KDD 2019高维稀疏数据上的深度学习Workshop论文汇总

作者 | 深度传送门来源 | 深度传送门【导读】本文是“深度推荐系统”专栏的第九篇文章&#xff0c;这个系列将介绍在深度学习的强力驱动下&#xff0c;给推荐系统工业界所带来的最前沿的变化。本文简要总结一下阿里妈妈在 KDD 2019 上组织的第一届面向高维稀疏数据的深度学习实…

C++中fstream的使用

C中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream和fstream分别从类 istream、ostream和iostream派生而来。作为派生的类&#xff0c;它们继承了插入和提取运算符&#xff08;以及其他成员函数&#xff09;&#xff0c;还有与文件一起使用的成员和构造函数。可将…

浅谈Disruptor

Disruptor是一个低延迟(low-latency)&#xff0c;高吞吐量(high-throughput)的事件发布订阅框架。通过Disruptor&#xff0c;可以在一个JVM中发布事件&#xff0c;和订阅事件。相对于Java中的阻塞队列(ArrayBlockingQueue,LinkedBlockingQueue)&#xff0c;Disruptor的优点是性…

web 服务发布注意事项

1、在发布的时候首先查看服务器对外开放的端口&#xff0c;如果没有最好和客户进行沟通需要开放那些对应的端口&#xff0c;要不外界无法访问发布的站点。 2、在oracle需要远程控制服务器的数据库的时候需要开发1521端口。转载于:https://www.cnblogs.com/jzm53550629/p/337563…

OpenCV代码提取:resize函数的实现

之前在http://blog.csdn.net/fengbingchun/article/details/17335477 中有过对cv::resize函数五种插值算法的介绍。这里将OpenCV3.1中五种插值算法的代码进行了提取调整。支持N通道uchar和float类型。经测试&#xff0c;与OpenCV3.1结果完全一致。实现代码resize.hpp&#xff1…

IBM重磅开源Power芯片指令集?国产芯迎来新机遇?

整理 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自去年 IBM 以 340 亿美元收购了 Linux 巨头红帽之后&#xff0c;这家 107 岁的蓝色巨人终于又在开源方面有大动作了&#xff01;近日在 Linux 基金会开源峰会上&#xff0c;IBM 宣布向开源社区提供 Powe…

构造函数不能为虚/重载函数总结

构造函数不能为虚/重载函数总结 作为一个类&#xff0c;他最基础的成员函数就要数构造函数了。这里我们先探讨一下构造函数为什么不能是虚函数。 在解决这个问题之前&#xff0c;要先明白类中函数的调用方式。一个类的函数共用一个函数空间&#xff0c;因此在实例化的对象中是不…

通过data:image/png;base64把图片直接写在src里

2019独角兽企业重金招聘Python工程师标准>>> 关于用base64存储图片 网页上有些图片的src或css背景图片的url后面跟了一大串字符&#xff0c;比如&#xff1a;data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZS…

算力“竞速”,企业AI落地的当务之急

充足的算力资源&#xff0c;在数据量持续增长及算法持续复杂化的前提下&#xff0c;无疑是保障人工智能应用落地效果的关键。软件定义算力——打造AI转型最佳实践8月2日&#xff0c;第四范式联合英特尔共同举办了AI实践者之声夏令营活动。第四范式基础架构负责人刘一鸣以《软件…

内存检测工具Dr. Memory的使用

Dr. Memory是一个内存调试工具&#xff0c;它是一个开源免费的内存检测工具&#xff0c;它能够及时发现内存相关的编程错误&#xff0c;比如未初始化访问、内存非法访问、数组越界读/写、以及内存泄露等。它可以在Linux、Windows、Mac OS和Android操作系统上使用。关于Dr. Memo…

手把手教你如何新建scrapy爬虫框架的第一个项目(下)

前几天小编带大家学会了如何在Scrapy框架下创建属于自己的第一个爬虫项目&#xff08;上&#xff09;&#xff0c;今天我们进一步深入的了解Scrapy爬虫项目创建&#xff0c;这里以伯乐在线网站的所有文章页为例进行说明。在我们创建好Scrapy爬虫项目之后&#xff0c;会得到上图…

.net完整的图文验证

摘自:http://blog.csdn.net/durongjian/article/details/4336380 一、创建ValidaeCode类库工程&#xff1a; 1、创建ValidaeCode类库工程&#xff0c;在[解决胜方案资源管理器]面板中&#xff0c;右键单击[ValidateCode]节点&#xff0c;并选择[属性]命令。 2、单击[属性]命令&…

Tesseract-OCR 3.04在Windows7 vs2013上编译过程

从https://github.com/tesseract-ocr/tesseract下载最新源码,commit id: 86acff5, 2016.06.07. 里面有个vs2010目录&#xff0c;用vs2013打开tesseract.sln。Tesseract依赖图像库Leptonica&#xff0c;Leptonica的编译过程可以参考http://blog.csdn.net/fengbingchun/article/d…

【Laravel-海贼王系列】第九章, Events 功能解析

Events 注册 框架如何在启动的时候加载注册的事件?框架如何触发事件?1&#xff0c;先在容器中注册 events 的全局对象。 Application 构造函数中对 events 进行注册代码 protected function registerBaseServiceProviders(){$this->register(new EventServiceProvider($th…