python实现K均值聚类算法
之前做大作业的时候本来想用聚类法给点集分类的,但是太复杂了,于是最后没有采用这个方案。现在把之前做的一些工作整理出来写个小博客。
K-means聚类法原理:
聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
如何计算?
如果用数据表达式表示,假设簇划分为(C1,C2,...Ck)({C_1},{C_2},...{C_k})(C1,C2,...Ck),则我们的目标是最小化平方误差E:
E=∑i=1k∑x∈Ci∥x−μi∥22E = \sum\limits_{i = 1}^k {\sum\limits_{x \in {C_i}} {\left\| {x - {\mu _i}} \right\|_2^2} } E=i=1∑kx∈Ci∑∥x−μi∥22
其中μiμ_iμi是簇CiC_iCi的均值向量,有时也称为质心,表达式为:
μi=1∣Ci∣∑x∈Cix{\mu _i} = \frac{1}{{\left| {{C_i}} \right|}}\sum\limits_{x \in {C_i}} x μi=∣Ci∣1x∈Ci∑x
如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的迭代方法。
下图是K均值聚类法的一个示意图:
上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图4所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。
当然在实际K-Mean算法中,我们一般会多次运行图c和图d,才能达到最终的比较优的类别。
我的解决方案是在代码中使用的是循环10次(可调),选择总距离最小的那个方案。
代码部分:
class KMeansClusterer: # k均值聚类def __init__(self, ndarray, cluster_num):self.ndarray = ndarrayself.cluster_num = cluster_numself.points = self.__pick_start_point(ndarray, cluster_num)def cluster(self):result = []for i in range(self.cluster_num):result.append([])for item in self.ndarray:distance_min = sys.maxsizeindex = -1for i in range(len(self.points)):distance = self.__distance(item, self.points[i])if distance < distance_min:distance_min = distanceindex = iresult[index] = result[index] + [item.tolist()]new_center = []for item in result:new_center.append(self.__center(item).tolist())# 中心点未改变,说明达到稳态,结束递归if (self.points == new_center).all():sum=self.__sumdis(result)return result,self.points,sumself.points = np.array(new_center)return self.cluster()def __sumdis(self,result):#计算总距离和sum=0for i in range(len(self.points)):for j in range(len(result[i])):sum+=self.__distance(result[i][j],self.points[i])return sumdef __center(self, list):# 计算每一列的平均值return np.array(list).mean(axis=0)def __distance(self, p1, p2):#计算两点间距tmp = 0for i in range(len(p1)):tmp += pow(p1[i] - p2[i], 2)return pow(tmp, 0.5)def __pick_start_point(self, ndarray, cluster_num):if cluster_num < 0 or cluster_num > ndarray.shape[0]:raise Exception("簇数设置有误")# 取点的下标indexes = random.sample(np.arange(0, ndarray.shape[0], step=1).tolist(), cluster_num)points = []for index in indexes:points.append(ndarray[index].tolist())return np.array(points)
运行结果如下:
结果如上图所示,这是之前大作业得到的点集,不同颜色的点分属于不同类型的点集,五角星为每个点集的中心点。
调用函数后得到的是点集以及总距离。代码使用示例我放在资源包里,有需要自取。
python实现K均值聚类算法相关推荐
- k均值聚类算法python_K均值和其他聚类算法:Python快速入门
k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...
- python(scikit-learn)实现k均值聚类算法
k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...
- Python金融数据挖掘 第11章 复习思考题1 (聚类)给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,用K均值聚类算法来训练模型,分4类。
1.题目 给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,如图11-12所示. data_multivar.txt 图11-12 数据集 da ...
- 基于Python的k均值聚类不同规格的商品名
基于Python的k均值聚类不同规格的商品名 前言 聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大.以此来区分不同的群体. 本篇讲述使用k均值算法对超市购物记录集中的商品名称进 ...
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- k均值聚类算法原理和(TensorFlow)实现
顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...
- 【模式识别】K均值聚类算法应用实验报告及MATLAB仿真
一. 实验目的 1.掌握K均值聚类算法的原理和实现过程: 2.掌握K均值聚类算法的应用方法. 二. 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图).步 ...
- k均值聚类算法优缺点_Grasshopper实现K均值聚类算法
本文很长很长,有很多很多图,包含以下部分: 1.算法简介 2.如何分类平面点 3.如何分类空间点 4.如何分类多维数据 5.后记 提醒:以下内容包括:智障操作,无中生友,重复造轮子 等 1.算法简介 ...
- K-Means(K均值聚类算法)
K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...
- K均值聚类算法(HCM,K-Means)
K均值聚类核心思想如下: 算法把n个向量分为个组,并求每组的聚类中心,使得非相似性(或距离)指标的价值函数(或目标函数)达到最小.当选择欧几里德距离为组j中向量与相应聚类中心间的非相似性指标时,价值函 ...
最新文章
- python复制文件夹到另一个目录_【python】复制文件到另一个相同目录的文件夹中...
- 网站排名在首位后,为什么还要继续做SEO?
- 利用yarn capacity scheduler在EMR集群上实现大集群的多租户的集群资源隔离和quota限制...
- php编程习惯,经验分享:PHP编程的5个良好习惯(二)
- 用python的五种方式_Python加载数据的5种不同方式(收藏)
- mysql获取离当前数据最近的数据_Mysql 获取最近数据信息
- 天梯赛-是否完全二叉搜索树
- mysql update 批量修改数据_MySQL 中实现数据的批量修改
- sudo和su命令简介
- e-r模型教案高中计算机,E-R模型实例答案.ppt
- QT与游戏手柄测试(数据与UI相连,ui界面作出反应)
- lnmp平台的简单基础搭建
- 运维审计系统----堡垒机的部署
- 使用Mac终端给文件夹加密压缩
- DNS解析与CDN加速
- 解决BMap is not defined?
- chrome使用tab键切换搜索
- THINKPAD T14 Windows 10系统安装
- 浏览器状态响应码详解 1XX/2XX/3XX/4XX/5XX
- 营救(广度优先搜索)题解