【K-Means】

K-Means是一种经典的聚类算法,常用于数据挖掘、机器学习等领域,以下是关于它的详细介绍:

基本原理

  • K-Means算法的目标是将给定的数据集划分成K个不同的簇(cluster),使得同一簇内的数据点相似度较高,而不同簇之间的数据点相似度较低。
  • 这里的相似度通常是通过计算数据点之间的距离来衡量的,常见的距离度量方式有欧几里得距离等。

算法步骤

  1. 确定聚类的数量K:这通常需要根据具体问题的领域知识、数据的特点或者通过一些经验法则来预先设定。
  2. 初始化聚类中心:随机从数据集中选取K个数据点作为初始的聚类中心,也可以采用其他的初始化方法来尽量避免得到局部最优解。
  3. 分配数据点到最近的聚类中心:对于数据集中的每个数据点,计算它到各个聚类中心的距离,然后将该数据点分配到距离它最近的那个聚类中心所对应的簇中。
  4. 更新聚类中心:在将所有数据点都分配到相应的簇之后,重新计算每个簇的中心位置,通常是计算该簇内所有数据点的均值作为新的聚类中心。
  5. 重复步骤3和4:不断重复分配数据点和更新聚类中心的操作,直到聚类中心的位置不再发生明显变化(达到预设的收敛条件,比如前后两次迭代中聚类中心的移动距离小于某个阈值)或者达到了预设的最大迭代次数。

特点

  • 优点
    • 原理简单,容易理解和实现,计算复杂度相对较低,在处理大规模数据时也能有较好的表现。
    • 对于具有明显球形分布的数据聚类效果较好。
  • 缺点
    • 需要事先确定聚类的数量K,而K值的选择往往并不容易,如果K值选择不当,可能会得到不合理的聚类结果。
    • 对初始聚类中心的选取比较敏感,不同的初始中心可能会导致不同的聚类结果,有可能陷入局部最优解而错过全局最优解。
    • 只能处理数值型数据,对于非数值型数据需要进行适当的转换才能应用该算法。

应用场景

  • 在市场细分中,根据客户的消费行为、人口统计学特征等数据将客户划分成不同的群体,以便企业制定针对性的营销策略。

  • 在图像识别领域,对图像中的像素点进行聚类,从而实现图像分割等任务。

  • 在文本挖掘中,对文档向量进行聚类,将相似的文档归为一类,便于信息的整理和分析。

以下是使用Python实现K-Means聚类算法的示例代码

一、代码实现

import numpy as np
import randomdef kmeans(data, k, max_iterations=100):"""K-Means聚类算法实现:param data: 输入的数据集,形状为 (n_samples, n_features),n_samples为数据点个数,n_features为每个数据点的特征数:param k: 要聚类的簇的数量:param max_iterations: 最大迭代次数,默认为100:return: centroids(聚类中心)和 labels(每个数据点所属的簇的标签)"""# 随机选择k个数据点作为初始聚类中心n_samples, _ = data.shapecentroids = data[random.sample(range(n_samples), k)]for _ in range(max_iterations):# 计算每个数据点到聚类中心的距离,并分配到最近的聚类中心对应的簇labels = []for point in data:distances = [np.linalg.norm(point - centroid) for centroid in centroids]label = np.argmin(distances)labels.append(label)labels = np.array(labels)# 更新聚类中心new_centroids = []for i in range(k):cluster_points = data[labels == i]new_centroid = np.mean(cluster_points, axis=0)new_centroids.append(new_centroid)new_centroids = np.array(new_centroids)# 如果聚类中心不再变化,就提前结束迭代if np.all(centroids == new_centroids):breakcentroids = new_centroidsreturn centroids, labels

二、函数调用示例

# 生成一些示例数据,这里假设数据是二维的,你可以根据实际情况替换
data = np.random.rand(100, 2)# 设置聚类的簇数量
k = 3# 调用kmeans函数进行聚类
centroids, labels = kmeans(data, k)print("聚类中心:", centroids)
print("每个数据点所属的簇的标签:", labels)

三、代码注释说明

  1. kmeans函数

    • 这个函数实现了K-Means聚类算法的核心步骤。
    • 参数
      • data:传入的数据集,是一个二维数组,其中第一维表示数据点的数量,第二维表示每个数据点的特征数量。例如,data可以是一个形状为(100, 2)的数组,表示有100个数据点,每个数据点有2个特征。
      • k:指定要将数据集聚类成的簇的数量。
      • max_iterations:算法的最大迭代次数,默认设置为100次。如果在达到这个次数之前聚类中心不再变化,算法会提前结束迭代。
    • 返回值:返回两个结果,centroids是聚类中心的数组,形状为(k, n_features),即有k个聚类中心,每个聚类中心的维度与数据点的特征维度相同;labels是一个一维数组,其长度等于数据点的数量,每个元素表示对应的数据点所属的簇的标签(从0到k - 1)。
  2. 初始化聚类中心

    • 在函数内部,首先通过n_samples, _ = data.shape获取数据集的行数(即数据点个数)。
    • 然后使用centroids = data[random.sample(range(n_samples), k)]随机从数据集中选取k个数据点作为初始的聚类中心。
  3. 迭代过程

    • 在每次迭代中:
      • 分配数据点到簇
        • 对于数据集中的每个数据点,通过循环计算它到各个聚类中心的距离。这里使用distances = [np.linalg.norm(point - centroid) for centroid in centroids]计算距离,其中np.linalg.norm是计算欧几里得距离的函数。然后通过label = np.argmin(distances)找到距离最近的聚类中心对应的簇标签,并将其添加到labels列表中。最后将labels列表转换为数组形式。
      • 更新聚类中心
        • 对于每个簇(从0到k - 1),通过cluster_points = data[labels == i]获取属于该簇的所有数据点。然后使用new_centroid = np.mean(cluster_points, axis=0)计算这些数据点的均值作为新的聚类中心,并将其添加到new_centroids列表中。最后将new_centroids列表转换为数组形式。
      • 检查收敛条件
        • 通过if np.all(centroids == new_centroids):检查当前迭代得到的聚类中心和上一次迭代的聚类中心是否完全相同。如果相同,说明聚类中心已经不再变化,算法提前结束迭代。否则,继续下一次迭代,并更新聚类中心为新得到的聚类中心。
  4. 函数调用示例部分

    • 首先使用data = np.random.rand(100, 2)生成了一些随机的二维数据作为示例数据集。这里你可以根据实际情况替换为真实的数据集。
    • 接着通过k = 3设置了聚类的簇数量为3。
    • 最后调用kmeans函数进行聚类,并通过print("聚类中心:", centroids)print("每个数据点所属的簇的标签:", labels)输出聚类中心和每个数据点所属的簇的标签。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

setContentView调用流程(二) -将布局添加到mContentParent

Android setContentView执行流程(一)-生成DecorView Android setContentView执行流程(二)-将布局添加到mContentParent 上篇博客我们介绍了setContentView的第一步即生成DecorView以及获取到mContentParent的流程,同时还提到继承自Activity和AppCompatActivity生成…

【C#设计模式(2)——工厂模式】

前言 工厂模式:使用工厂创建对象。工厂模式的主要目的是分离对象的创建与调用,通过使用工厂统一管理对象的创建。工厂模式可以隐藏对象的创建细节,使客户终端代码只关注使用对象而不需要关注对象的创建过程。 运行结果 代码 #region 食品 /…

Dockerfile

1. Dockerfile 简介 1.1 什么是Dockerfile Dockerfile是一个用于定义和构建Docker镜像的文本文件,它通过一系列指令和参数来描述镜像的构建过程和配置。这些指令包括基础镜像、软件包安装、文件拷贝、环境变量设置等,使得应用程序及其依赖项可以被打包…

VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列

《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…

C++OJ_二叉树的层序遍历

✨✨ 欢迎大家来到小伞的大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C_OJ 小伞的主页:xiaosan_blog 二叉树的层序遍历 102. 二叉树的层序遍历 - 力扣(LeetCode&#xff0…

ctfshow-web入门-反序列化(web265-web270)

目录 1、web265 2、web266 3、web267 4、web268 5、web269 6、web270 1、web265 很简单的一个判断,满足 $this->token$this->password; 即可 由于 $ctfshow->tokenmd5(mt_rand()) 会将 token 随机为一个 md5 值,我们使用 & 绕一下&am…

【STL】queue,stack的底层实现

在前面的介绍中我们已经知道了queue和stack是一个容器适配器,它并没有被划分到容器的行列,它只是对其他容器的再封装,在STL中queue和stack默认使用的容器是deque 在数据结构的学习中,我们知道stack和queue可以使用顺序表和链表实现…

Tomcat安装和配置(超详细)

一、Tomcat安装准备 1、tomcat下载 1.1、百度网盘链接下载 链接:https://pan.baidu.com/s/1uceOKe_QcpSQ6yhNxi4T5g?pwd1234 提取码:1234 1.2、官网在线下载 Tomcat官网:https://tomcat.apache.org/download-80.cg…

Ozone调试WSL系统的STM32编译文件配置

文章目录 背景步骤Ozone新建工程流程配置Ozeon找到WSL的代码文件ozone字体调整快速在Ozone中定位到代码文件参考 背景 在使用WSL进行嵌入式软件开发的时候,在debug方面,比较好用的工具有Ozone,那在Windows下调试需要配置和注意的点&#xff…

洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵

本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。 因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。 违者必究,谢谢配合。 个人主页:blog.csdn.net/jzw…

python通过usb连接标签打印机-开源的

背景: 最近接到了一个新需求,单位想做一个ERP系统,想把打印机一起兼容进去,实现自动化打印工作。主要我是做爬虫的没接触过这些,就到网上搜索了很多先关资料,最终发现,一大堆全都是什么VIP的才能…

Codeforces Round 984 (Div. 3)

题目链接 A. Quintomania 题意 思路 模拟即可 示例代码 void solve() {int n;cin >> n;vector<int>arr(n);fer(i, 0 ,n) cin >> arr[i];fer(i, 1, n){if(abs(arr[i] - arr[i - 1]) ! 5 && abs(arr[i] - arr[i - 1]) ! 7){cout << "N…

【2】GD32H7xx 串口Idle + DMA接收不定长数据

目录 1. IDLE中断相关介绍2. D-Cache与DMA同时使用2.1 I-Cache与D-Cache2.2 D-Cache与DMA同时使用时的数据一致性问题2.2.1 CPU读取DMA写入到SRAM的数据2.2.2 DMA读取CPU写入到SRAM的数据 3. Uart Idle DMA收发程序4. 程序测试 1. IDLE中断相关介绍 在 GD32H7xx MCU 中&#…

python数据结构基础(8)

今天来使用python实现二叉树,二叉树中每个节点都是Node类对象,通过Tree类中的add()方法逐个向二叉树中加入树节点,构成完全二叉树或者非完全二叉树,代码如下: class Node(object):"""树节点类&#xff0c;用于构建二叉树。Attributes:- val: 节点存储的值。- r…

IEEE 1588:电信网络的精确时间协议 (PTP)

IEEE 1588&#xff1a;电信网络的精确时间协议 IEEE 1588 PTP 概述PTP 协议特征同步类型IEEE 1588 PTP 角色IEEE 1588 PTP 的工作原理PTP 设备类型PTP 消息类型事件消息一般信息 PTP 时钟类规范PTP 配置文件 https://www.techplayon.com/ieee-1588-precision-time-protocol-ptp…

深度学习基础—了解词嵌入

引言 上图是使用one-hot向量表示词向量的一种方式&#xff0c;这种表示方式优点是方面简洁&#xff0c;但是缺点也很明显&#xff0c;就是词与词之间独立性太强&#xff0c;没有关联&#xff0c;这样使得算法对相关词的泛化能力不强。 举个例子&#xff0c;假如我们已经学习到了…

实战:索引的命中机制

在 SQL Server 中,查询是否能命中索引(即是否能使用 Index Seek)取决于多个因素,包括索引的结构、查询条件的排列、和数据库优化器的策略。以下是一些常见的命中索引和不能命中索引的情况,及其详细解释: 一、命中索引的情况 1. 前导列匹配(典型的命中索引场景) 索引结…

Mac 安装protobuf2.5.0

文章目录 一、修改platform_macros.h二、编译protobuf三、配置环境变量四、测试 一、修改platform_macros.h platform_macros.h的目录位置为/Users/xxxx/protobuf-2.5.0/src/google/protobuf/stubs 在platform_macros.h中增加如下代码 #elif defined(__arm64__) #define GOOG…

ubuntu24.04安装matlab失败

又是摸鱼摆烂的一天&#xff0c;好难过&#xff5e; 官方教程&#xff1a;https://ww2.mathworks.cn/help/install/ug/install-products-with-internet-connection.html 问题描述&#xff1a;https://ww2.mathworks.cn/matlabcentral/answers/2158925-cannot-install-matlab-r2…

python使用turtle画图快速入门,轻松完成作业练习

turtle介绍 turtle是一个绘图库&#xff0c;可以通过编程进行绘图。其模拟了一个乌龟在屏幕上的运动过程。该库通常用于给青少年学习编程&#xff0c;当然&#xff0c;也可以使用其进行作图。 在一些学校中&#xff0c;可能在python学习的课程中&#xff0c;要求完成turtle绘…