Python手写K均值算法

Python手写K均值算法

1. 算法思维导图

开始
随机选择k个中心点
C 计算每个点到k个中心点的距离
D将每个点归到距离最近的中心点所在的簇
E 重新计算每个簇的中心点
重复C D E步骤直到簇不再变化
结束

2. 该算法的手写必要性及市场率调查

K均值算法是一种常用的聚类算法,用于将数据集划分为k个簇,使得同一簇内的数据点相似度较高,不同簇之间的相似度较低。该算法在数据挖掘、图像处理、自然语言处理等领域有着广泛的应用。

市场调查显示,K均值算法在企业中的应用越来越广泛,如在客户分析、市场细分、产品定位、风险评估等方面都有着重要作用。

手写该算法的必要性在于,通过手写算法可以更深入地理解算法原理和实现过程,从而更好地应用于实际问题中。

3. 该算法手写实现的详细介绍和详细步骤

3.1 算法实现步骤

  1. 随机选择k个中心点
  2. 计算每个点到k个中心点的距离
  3. 将每个点归到距离最近的中心点所在的簇
  4. 重新计算每个簇的中心点
  5. 重复步骤2~4直到簇不再变化

3.2 代码实现

3.2.1 导入需要的库
import numpy as np
import matplotlib.pyplot as plt
3.2.2 定义K均值算法函数
def k_means(X, k, max_iter=100):# 随机选择k个中心点centers = X[np.random.choice(len(X), k, replace=False)]for i in range(max_iter):# 计算每个点到k个中心点的距离distances = np.sqrt(((X - centers[:, np.newaxis])**2).sum(axis=2))# 将每个点归到距离最近的中心点所在的簇labels = distances.argmin(axis=0)# 重新计算每个簇的中心点new_centers = np.array([X[labels == j].mean(axis=0) for j in range(k)])# 判断簇是否变化if np.allclose(centers, new_centers):breakcenters = new_centersreturn labels, centers
3.2.3 测试算法
# 生成测试数据
np.random.seed(0)
X = np.vstack([np.random.randn(100, 2) + [2, 2],np.random.randn(100, 2) + [-2, -2],np.random.randn(100, 2) + [-2, 2]])# 调用K均值算法函数
labels, centers = k_means(X, k=3)# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=200, c='r')
plt.show()

3.3 该算法手写实现总结及思维拓展

通过手写K均值算法,我们可以更深入地理解算法原理和实现过程,从而更好地应用于实际问题中。在实现过程中,需要注意以下几点:

  1. 随机选择初始中心点时,应该避免选择重复的点。
  2. 在计算每个点到k个中心点的距离时,可以使用numpy的广播机制,避免使用循环。
  3. 在判断簇是否变化时,可以使用numpy的allclose函数,判断两个数组是否近似相等。

思维拓展:K均值算法的改进。K均值算法存在着一些问题,如对初始中心点的敏感性、簇的数量需要事先指定等。因此,我们可以对K均值算法进行改进,如使用层次聚类算法来确定簇的数量,使用K均值++算法来选择初始中心点等。

总结

K均值算法是一种常用的聚类算法,它通过将数据点分为不同的簇,使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。该算法的实现步骤包括随机选择k个中心点、计算每个点到中心点的距离、将每个点归到距离最近的中心点所在的簇、重新计算每个簇的中心点,重复以上步骤直到簇不再变化。

K均值算法的应用广泛,特别是在数据挖掘、图像处理、自然语言处理等领域。手写该算法的目的是更深入地理解算法原理和实现过程,从而更好地应用于实际问题中。

在手写实现过程中,需要注意随机选择初始中心点时避免选择重复的点,使用numpy的广播机制计算每个点到中心点的距离,使用numpy的allclose函数判断簇是否变化。

对于K均值算法的改进,可以使用层次聚类算法确定簇的数量,使用K均值++算法选择初始中心点等。这些改进可以提高算法的性能和效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记-接口测试(postman、jmeter)

目录 一、什么是接口测试 二、前端和后端 三、get请求和post请求的区别 四、cookie和session 五、接口测试的依据 六、HTTP状态码 七、通用接口用例 八、postman接口测试 九、Jmeter接口测试 一、什么是接口测试 通常做的接口测试指的是系统对外的接口,比…

Linux 驱动扫描所有线程调用栈

测试环境 root:curtis# uname -a Linux curtis-Aspire-E5-471G 5.15.0-52-generic #58~20.04.1-Ubuntu SMP Thu Oct 13 13:09:46 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux root:curtis# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: …

leetcode做题笔记145. 二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 思路一:递归 c语言解法 void postorder(struct TreeNode *root, int *res, int *resSize) {if (root NULL) {return;}postorder(root->left, res, resSize);postorder(root->right, …

机器学习:PCA(Principal Component Analysis主成分)降维

参考:PCA降维原理 操作步骤与优缺点_TranSad的博客-CSDN博客 PCA降维算法_偶尔努力翻身的咸鱼的博客-CSDN博客 需要提前了解的数学知识: 一、PCA的主要思想 PCA,即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想…

qt 6知识集

1.Use multi-arg instead [clazy-qstring-arg] 存在过个arg,连写形式如下: QString("%1 %2").arg(a).arg(b);QString("%1 %2").arg(a, b); // one less temporary heap allocation详见参考文献[1]。 参考文献 [1] qstring-arg

【element-ui】el-date-picker 之picker-options时间选择区间禁用效果的实现

element-ui 时间选择器的时间区间禁用dom层引入:picker-option <el-date-pickerv-model"searchFormObj.workTime"clearablevalue-formate"yyyy-MM-dd":picker-options"pickerOptions"placeholder"请选择时间" ></el-date-pi…

基于深度强化学习的四旋翼无人机航线跟随

源自&#xff1a;指挥与控制学报 作者&#xff1a;杨志鹏 李波 甘志刚 梁诗阳 “人工智能技术与咨询” 发布 摘 要 针对无人机在空中执行航线跟随任务时无法对未知环境作出合理应对措施等问题, 提出了一种基于深度强化学习的四 旋翼无人机航线跟随方法. 通过无人机受力…

SpringMVC之JSON数据返回与异常处理机制---全方面讲解

一&#xff0c;JSON数据返回的理解 在Spring MVC中&#xff0c;当需要将数据以JSON格式返回给客户端时&#xff0c;可以使用ResponseBody注解或RestController注解将Controller方法的返回值直接转化为JSON格式并返回。这使得开发者可以方便地将Java对象转换为JSON&#xff0c;并…

【C++】STL之vector操作

文章目录 简介vector中的成员类型模板参数头文件的包含构造函数vector的访问方式&#xff1a;下标[ ]迭代器范围for 交换swap 简介 vector是stl中的一种数组容器&#xff0c;vector在英文中有矢量的意思&#xff0c;但实际上在数据结构中就是一种类似于数组的结构&#xff1b;…

AI大模型服务应用场景

大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域&#xff0c;大模型通常是指具有数百万到数十亿参数的神经网络模型。这些模型通常在各种领域&#xff0c;例如自然语言处理、图像识别和语音识别等&#xff0c;表现出高度准确和广泛的泛化能力。伴随…

Jmeter系列-定时器Timers的基本介绍(11)

简介 JMeter中的定时器&#xff08;Timer&#xff09;是一种重要的元件&#xff0c;用于模拟用户在不同时间间隔内发送请求的场景。通过使用定时器&#xff0c;可以模拟负载、并发和容量等不同情况下的请求发送频率。 使用定时器 可以在取样器下添加定时器&#xff0c;这样定…

MySQL日常使用记录

1.时间 1.1.时间格式化 yyyy-MM-dd HH:mm:ss格式&#xff0c;如下&#xff1a; select date_format(now(), %Y-%m-%d %H:%i:%s) from dual;date_format函数是将date类型按照指定的格式转换成varchar类型 1.2.日期加减 当前天 1 天 select date_format(now(), %Y-%m-%d), …

C++中将类成员函数作为变量传递给函数

假设类ClassName有一个成员函数 void ClassName::funcname(int);通过typedef定义一个类成员函数指针类型,参数和返回值类型都要与成员函数对应 typedef void (ClassName::*FuncPtr)(int); // 定义类成员函数指针获取到的参数就是 FuncPtr pf

持安科技孙维伯:零信任理念下的实战攻防:ISC2023数字小镇演讲

近日&#xff0c;在ISC 2023第十一届互联网安全大会上&#xff0c;持安科技联合创始人孙维伯作为零信任办公安全赛道代表&#xff0c;亮相数字小镇New50&#xff0c;并发表《全方位防御&#xff1a;零信任理念下的实战攻防》主题演讲。 以下是本次演讲实录&#xff1a; 这几年…

系统灰度随笔记

系统灰度随笔记 这段时间系统重构&#xff0c;负责重构的其中一个模块需要与四个上游系统对接进行切换&#xff0c;虽然自己在这个过程中也设计了一套灰度方案来承接&#xff0c;将灰度的主动权控制在下游&#xff0c;但是很难同时应对四个上游系统&#xff0c;因为每个上游系…

Redis的介绍以及简单使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据存储系统&#xff0c;它以键值对的形式将数据存在内存中&#xff0c;并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持&#xff0c;可以广泛应用于缓存、消息队列、实…

vue的由来、vue教程和M-V-VM架构思想、vue的使用、nodejs

vue vue的由来 vue教程和M-V-VM架构思想 vue的初步简单使用 nodejs vue的由来 # 1 HTML(5)、CSS(3)、JavaScript(ES5、ES6、ES11)&#xff1a;编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 ->…

ATLAS 200通过PCIE 接入RK3588-EP模式

ATLAS 200 作为算理模块&#xff0c;可以作为主/协处理器接入RK3588,有两种模式&#xff1a;RC 模式和EP模式 RC模式&#xff1a;rk3588 和 ATLAS 200 可分别独立处理自身业务数据&#xff0c;不存在业务互相依赖&#xff0c;二者可通过网络等方式进行通信&#xff0c;ATLAS …

【SpringCloud微服务全家桶学习笔记-服务注册zookeeper/consul】

SpringCloud微服务全家桶学习笔记 Eureka服务注册 gitee码云仓库 9.其他服务注册框架 &#xff08;1&#xff09;zookeeper安装与使用 zookeeper需安装在虚拟机上&#xff0c;建议使用CentOS&#xff0c;安装地址如下&#xff1a; zookeeper镜像源 选择第一个进入后下载ta…

WebSocke(简略笔记)

介绍 WebSocket是基于TCP的一种新的网络协议&#xff0c;实现了浏览器域服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者直接就可以创建持久性的连接&#xff0c;并进行双向数据传输。 Http协议和WebSocket协议对比&#xff1a; * HTTP是短连接 * We…