python实现K均值聚类算法

2023-05-16

之前做大作业的时候本来想用聚类法给点集分类的,但是太复杂了,于是最后没有采用这个方案。现在把之前做的一些工作整理出来写个小博客。

K-means聚类法原理:

聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

如何计算?

如果用数据表达式表示,假设簇划分为 ( C 1 , C 2 , . . . C k ) ({C_1},{C_2},...{C_k}) (C1,C2,...Ck),则我们的目标是最小化平方误差E:
E = ∑ i = 1 k ∑ x ∈ C i ∥ x − μ i ∥ 2 2 E = \sum\limits_{i = 1}^k {\sum\limits_{x \in {C_i}} {\left\| {x - {\mu _i}} \right\|_2^2} } E=i=1kxCixμi22
其中 μ i μ_i μi是簇 C i C_i Ci的均值向量,有时也称为质心,表达式为:
μ i = 1 ∣ C i ∣ ∑ x ∈ C i x {\mu _i} = \frac{1}{{\left| {{C_i}} \right|}}\sum\limits_{x \in {C_i}} x μi=Ci1xCix
如果我们想直接求上式的最小值并不容易,这是一个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 = ndarray
        self.cluster_num = cluster_num
        self.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.maxsize
            index = -1
            for i in range(len(self.points)):
                distance = self.__distance(item, self.points[i])
                if distance < distance_min:
                    distance_min = distance
                    index = i
            result[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,sum
        self.points = np.array(new_center)
        return self.cluster()

    def __sumdis(self,result):
        #计算总距离和
        sum=0
        for i in range(len(self.points)):
            for j in range(len(result[i])):
                sum+=self.__distance(result[i][j],self.points[i])
        return sum

    def __center(self, list):
        # 计算每一列的平均值
        return np.array(list).mean(axis=0)

    def __distance(self, p1, p2):
        #计算两点间距
        tmp = 0
        for 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)

运行结果如下:
运行结果
结果如上图所示,这是之前大作业得到的点集,不同颜色的点分属于不同类型的点集,五角星为每个点集的中心点。

调用函数后得到的是点集以及总距离。代码使用示例我放在资源包里,有需要自取。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现K均值聚类算法 的相关文章

  • sensor_data参数校验

    新的 xff1a Akamai sensor data zwl haley的博客 CSDN博客 只说下思路吧 xff0c 毕竟把加密代码公开对别网站不好 如有权益问题可以发私信联系我删除 xff0c 或q 1847858794 如图 xff
  • C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

    Muduo is a multithreaded C 43 43 network library based on the reactor pattern muduo库的介绍就是 xff1a 一个基于reactor反应堆模型的多线程C 43
  • FCT测试

    1 总论 2 启动过程 3 各模块实现 1 总论 FCT 作为 Android 的一个外来测试程序 xff0c 位于源码的 external 文件夹内 xff0c 其目的是作为产品在 PCBA 装配生产线中的一个制程 xff0c 对外围硬件
  • ARM上电启动及Uboot代码分析

    注意 xff1a 由于文档是去年写的 xff0c 内有多个图片 xff0c 上传图片很麻烦 xff08 需要截图另存插入等等 xff09 xff0c 我把文章的PDF版本上传到了CSDN下载资源中 为了给自己赚点积分 xff0c 所以标价2
  • 【解决】缺少libstdc++.so.6库的原因及解决办法

    问题原因 xff1a 系统是64bit xff0c 该库是32bit的 xff0c 在64bit系统上安装32bit库 解决办法 xff1a 1 查看哪个安装包包含该库 xff1a yum provides libstdc 43 43 so
  • 仿真器和模拟器的区别

    仿真器 xff08 emulator xff09 和模拟器 xff08 simulator xff09 是比较容易混淆的概念 xff0c 这两个概念不仅针对计算机体系结构 xff0c 在很多方面都有所应用 xff0c 例如航空模拟器 街机仿
  • Flush-Cache/Page-Lock/Flush-TLB说明

    Flush Cache Page Lock Flush TLB说明 理论上顺序 xff1a 获得页面锁 xff0c 保证后续flush操作完成之前不允许继续读写Flush cacheFlush tlb 以下用numa migrate pag
  • 内核动态补丁(kpatch)及kpatch pushsection popsection previous的解释

    内核动态补丁 xff08 katch xff09 解释 本文阅读体验不好 xff0c 因此做了pdf版本 xff0c 点击下载 xff0c 如果你没有分数 xff0c 可以直接留言找我要pdf版本 内核可以在运行时动态执行补丁中的代码 xf
  • Shell编程:字符串与数值之间的转换与计算

    shell编程往往需要对字符串进行操作 xff0c 有时需要将字符串转为数值 xff0c 并做加减运算 以下介绍将字符串转为数值并进行计算的方法 temp1 61 400d7c echo 16 temp1 43 4 xff08 打印默认是十
  • linux内核代码预处理后便于阅读

    inux 内核庞大而复杂 内核代码阅读的时候 xff0c 有没有遇到因为宏定义或者inline层次太深而不知道到底代码是什么样子 代码预处理可以解决这个难题 平台 xff1a linux 3 4 5 ARM xff0c PC linux上类
  • 深度学习(六):pointnet.pytorch环境配置与学习

    目录 0 前言 0 1 shapenet数据集 1 配置环境 1 1 配置Python环境与安装pytorch 1 2 安装pointnet及其他包与下载数据 2 默认训练 2 1 分类训练train classification 2 1
  • sed在行首(行尾)添加字符串;在某行后添加多行字符串

    sed在行首添加字符串 xff1b sed s xxx 39 filename gt output xff1a 符号代表行首 sed在行尾添加字符串 xff1b sed s string 39 filename gt output xff1
  • 【解决】xterm Xt error: Can't open display: xterm: DISPLAY is not set

    当你运行xterm出现错误如下 xff1a xterm Xt error Can 39 t open display xterm DISPLAY is not set 我的系统centos6 2 解决办法 xff1a 1 首先确定你安装了x
  • 【解决】yum 安装 出错 Error: Protected multilib versions:

    我安装zlib出错 xff1a yum install zlib 1 2 3 29 el6 i686 Error Protected multilib versions zlib 1 2 3 29 el6 i686 61 zlib 1 2
  • 贴一下我的 vimrc 以及 vim 效果

    贴一下我的vimrc 看起来真的很养眼 xff0c 呵呵 这几天一直忙活着配置VIM xff0c 这个编辑器太迷人了 虽然emacs也强大 xff0c 可是仔细想想 xff0c 还是vim的效率高一些 原因如下 xff1a emacs通过
  • vim语法高亮——使自定义类型也能高亮的简单办法

    说明 xff1a 判断是否类型的简单办法 xff0c 就是简单的观察 xff1a 如果该标志符后面有空格 xff0c 空格后又是一个标志符的话 xff0c 在 xff23 xff0f xff23 xff0b xff0b 语言中 xff0c
  • 原创:纠正国人对Linux的误解和错误认识

    错误印象和认识罗列如下 xff0c 一一解释 xff1a 1 linux下的软件太少 回答 xff1a linux 下的软件一点也不少 windows还在娘肚子里的时候 xff0c Unix已经如日中天了 要知道微软公司开发的第一个操作系统
  • 原创:自己写的端口数据转发工具pf (port forwarding)

    看了 子清行 朋友博客里的一篇文章 xff0c 讲述了一个叫 DuplexPipe 的小工具的实现 最开始没怎么懂意思 xff0c 看了他公开的源代码 xff0c 是用java写的 xff0c 一个jar包 可惜我不太会java 因此没法看
  • 又一次被linux的工具震惊了

    前一篇博客还写了自己写的端口转发工具 xff0c 今天偶然在网上看到讲命名管道和netcat配合的用法 xff0c 被彻底雷倒了 原来以为netcat做不到 xff0c 原来是自己想不到 xff0c 而不是netcat做不到 方法如下 xf
  • Ubuntu桌面旋转xrandr

    项目实行过程中 xff0c 设备安装为竖屏模式 xff0c 分辨率由19201080变为10801920 xff1b 最简单实现 xff0c 将桌面系统显示旋转 xff1a xff08 终端命令 xff09 xrandr o left 向左

随机推荐

  • VR应用在直播领域上的实践与探索

    声明 xff1a 本文来自 七牛云主办的架构师实践日 泛娱乐 43 直播技术最佳实践 的演讲内容整理 PPT 速记和现场演讲视频等参见 七牛架构师实践日 官网 嘉宾 xff1a 孙其瑞 xff0c 得图网络CTO 责编 xff1a 钱曙光
  • ubuntu(14):ubuntu16编译move_base报错与解决

    目录 1 Could NOT find OpenVDB missing OPENVDB LOCATION 2 Could not find a package configuration file provided by 34 costma
  • 在CSDN发布博客怎么改变代码块颜色

    第一步 CSDN首页 xff0c 最右侧点击创作中心 第二步 左侧导航栏滑到最下面 xff0c 点击博客设置 第三步 找到代码片样式 xff0c 简单吧 xff08 又水了一篇 xff09
  • 裸机驱动与Linux设备驱动的区别

    裸机驱动一般针对没有操作系统支持的层面 不用考虑操作系统对它的调用 Linux驱动是在裸机驱动基础上 按照一定的规范来实现 虽然实现的都是同一个东西 不过你发现在 Linux驱动 搀杂 了许多维护信息 总之 xff0c Linux设备驱动就
  • 使用2020版IDEA创建Servlet

    使用2020版IDEA创建一个完整的Web项目的整个过程分为四步 第一步 创建一个普通的Java项目 1 打开IDEA xff0c 选择菜单File gt New gt Project 2 选择Java xff0c 以及自己的JDK xff
  • Apache IoTDB 系列教程-5:常见问题汇总(1)

    在过去的一段时间 xff0c 收集了不少大家在使用过程中反馈的问题 xff0c 今天把一些常见问题列出来 xff0c 给更多人提供参考 开了个交流群二维码 xff0c 可以扫码进群 正文 1974 字 xff0c 预计阅读时间 5 分钟 常
  • Apache IoTDB 系列教程-6:性能优化(0.8-0.10)

    今天的内容包括建模优化 读写性能优化 xff0c 会涉及一些简单的原理介绍 主要面向 0 8 0 10 版本 正文 3754 字 xff0c 预计阅读时间 10 分钟 建模指南 关于存储组 现在每个存储组是一个相对独立的引擎 xff0c 而
  • Apache IoTDB 系列教程-8:文件同步工具

    在官网用户手册的系统工具 xff08 System Tools xff09 一栏 xff0c 有一个同步工具 xff08 Sync Tool xff09 xff0c 有很多人问这个东西怎么用 xff0c 延迟是多少 xff0c 今天就介绍一
  • Apache IoTDB failed to start RPC ServerService, because Could not create ServerSocket on address

    原因 一般是端口占用 xff0c 可以 jps 检查是不是已经启动了一个 IoTDB
  • Apache IoTDB Query is time out (-1ms)

    现象 查询超时 xff0c 服务器出现一下日志 2022 01 05 15 57 05 724 pool 12 IoTDB query time manager 1 WARN o a i d q c QueryTimeManager 71
  • 解读事务的ACID!

    事务的ACID特性大学数据库课程基本都学过 xff0c 但是学完也就大概知道是干嘛的 xff0c 后来也没仔细想这个东西了 xff0c 后来接触了NoSQL系统的一致性 xff0c 于是重新学习 ACID xff0c 发现还有很多误区 今天
  • 欢迎加入 Apache IoTDB !

    官方网站 xff1a http iotdb apache org zh IoTDB 是清华自研时间序列数据库 xff0c 2014年项目启动 xff0c 2018年11月18号 IoTDB 正式进入 Apache 孵化器 xff0c 成为中
  • Xavier(2):Xavier NX刷机步骤及报错解决

    1 下载和安装NVIDIA SDK Manager 官方网站 xff1a https developer nvidia com embedded jetpac 选择sdk manager xff0c sdk manager版本没有要求 安装
  • 模型评估与优化1--基本概念与最优化问题

    模型评估与优化1 基本概念与最优化问题 首先先看一下基本术语和概念 1 数据集的划分 xff08 1 xff09 数据集 dataset xff1a 在机器学习任务中使用的一组数据 数据集中每一个数据称为一个样本 反映样本在某方面的表现或性
  • windows中vscode编译运行c++程序

    1 vscode 安装 c 43 43 扩展 在vscode中创建一个后缀为 01 cpp 的程序 xff0c 程序文件如下 xff0c vscode会自动提示安装 c 43 43 扩展 xff0c 点击进行安装 01 cpp includ
  • leetcode 刷题指南 & 刷题顺序

    1 刷题方法 amp 顺序 xff1a 按类型刷 xff0c 这样能总结出每种类型题目的规律 优先树 链表 二分查找 DFS BFS 动态规划数目 xff1a 常见类型刷10道 43 顺序 xff1a 先做2 4道简单题 xff0c 然后做
  • 北邮计算机学院2017届复试经验分享

    北邮计算机学院2017届复试经验分享 建议初试完了再来担心复试 xff0c 有看复试经验的时间还不如多做两道数学题 xff01 导师 xff1a 了解导师的情况 xff0c 最差也不要找一个人不好的老师 xff0c 其次尽量选自己喜欢的方向
  • STM32 Cube BMP180 获取温度、气压、海拔

    一 介绍 BMP180中内置有E2PROM xff0c 所以要获取数据 xff0c 就要使用I2C读写E2PROM来实现获取数据 xff01 BMP180的整个流程 xff1a 1 首先要初始化 xff0c 读取几个E2PROM地址上的值共
  • int 类型究竟多少字节?

    今天发现NEON技术中 int类型的字节数是2 xff0c 感觉很奇怪 xff0c 最早写51单片机时也是2 xff0c 后来到了观念转变成了4 xff0c 现在有遇到了2 一 转自 http www tuicool com article
  • python实现K均值聚类算法

    之前做大作业的时候本来想用聚类法给点集分类的 xff0c 但是太复杂了 xff0c 于是最后没有采用这个方案 现在把之前做的一些工作整理出来写个小博客 K means聚类法原理 xff1a 聚类是一个将数据集中在某些方面相似的数据成员进行分