聚类及Python下实现 K-means 算法

news2024/12/12 19:47:36

聚类

聚类是无监督学习中的一种重要方法,旨在将数据集中相似的数据对象划分到同一个簇中,使得不同簇之间的数据对象差异尽可能大。在大数据环境下,聚类可以帮助挖掘数据中的隐藏结构和模式,应用场景十分广泛,比如在客户细分领域,根据客户的消费行为、年龄、地域等特征进行聚类,能将客户分为不同群体,方便企业制定针对性的营销策略;在图像识别中,可以依据图像的特征(如颜色、纹理等)聚类来进行图像分类等。

常见的聚类算法除了下面要详细说的 K-means 之外,还有层次聚类(如凝聚式层次聚类、分裂式层次聚类等,通过不断合并或拆分簇来构建聚类层次结构)、密度聚类(例如 DBSCAN 算法,基于数据点的密度来确定簇,能发现任意形状的簇并且能识别出数据集中的噪声点)等。

K-means 算法及其实现

K-means 是一种非常经典且应用广泛的聚类算法,它的核心思想比较简单直观:

  1. 步骤概述

    • 初始化:首先确定要划分的簇的数量 k,然后从数据集中随机选择 k 个数据点作为初始的聚类中心(也可以采用其他初始化方法来提高聚类效果,比如 K-means++ 初始化,尽量让初始聚类中心相互之间距离较远)。
    • 分配数据点到簇:对于数据集中的每个数据点,计算它与各个聚类中心的距离(通常采用欧几里得距离等度量方式),然后将该数据点分配到距离它最近的那个聚类中心所在的簇中。
    • 更新聚类中心:当所有数据点都被分配到相应的簇后,重新计算每个簇的中心位置(比如对于数值型数据,簇中心通常是簇内所有数据点对应维度的均值)。
    • 迭代:重复上述分配数据点和更新聚类中心的步骤,直到聚类中心不再发生明显变化(可以通过设置一个收敛阈值,比如前后两次迭代聚类中心的位置变化小于某个值时,就认为算法收敛)或者达到预设的最大迭代次数为止。
  2. Python 实现示例
    以下是 Python 代码实现 K-means 算法(使用 Python 的 numpy 库来进行数值计算),这里假设输入数据是一个二维的数值型数据集(可以方便可视化展示聚类效果,实际应用中可以处理多维数据):

import numpy as np


def euclidean_distance(point1, point2):
    """计算两点之间的欧几里得距离"""
    return np.sqrt(np.sum((point1 - point2) ** 2))


def k_means(data, k, max_iterations=100, tolerance=1e-4):
    """
    K-means聚类算法实现

    参数:
    data (numpy.ndarray): 输入的数据集,形状为 (样本数, 特征数)
    k (int): 要划分的簇的数量
    max_iterations (int, 可选): 最大迭代次数,默认为100
    tolerance (float, 可选): 收敛阈值,默认为1e-4

    返回:
    centroids (numpy.ndarray): 最终的聚类中心,形状为 (k, 特征数)
    labels (numpy.ndarray): 每个数据点所属的簇的标签,形状为 (样本数,)
    """
    # 随机选择k个初始聚类中心
    indices = np.random.choice(len(data), k, replace=False)
    centroids = data[indices]

    for _ in range(max_iterations):
        # 存储每个数据点所属的簇的标签
        labels = np.zeros(len(data), dtype=int)
        # 分配数据点到簇
        for i, point in enumerate(data):
            distances = [euclidean_distance(point, centroid) for centroid in centroids]
            labels[i] = np.argmin(distances)

        # 更新聚类中心
        new_centroids = np.array([data[labels == j].mean(axis=0) for j in range(k)])

        # 检查聚类中心是否收敛
        if np.all(np.abs(new_centroids - centroids) < tolerance):
            break

        centroids = new_centroids

    return centroids, labels

 调用这个函数进行测试,数据为随机生成的二维数据点

# 生成示例数据
np.random.seed(0)
data = np.random.rand(100, 2)

# 设置簇的数量
k = 3

# 运行K-means算法
centroids, labels = k_means(data, k)

# 简单打印聚类结果(可以进一步可视化展示等)
print("聚类中心:", centroids)
print("数据点所属簇的标签:", labels)

  K-means 算法有助于深入理解聚类的基本原理以及相关的距离计算、迭代优化等操作,但在实际应用中,为了更高效和方便地使用聚类功能,也可以直接调用一些成熟的机器学习库(如 scikit-learn 库中已经实现好且经过优化的 K-means 算法类)。

关于在写作过程中原创与使用AI的声明

本手稿的作者声明,在本作品的写作过程中,我们使用AI只包含:生成式AI图片/视频为了提高文章的观赏性、使用AI编辑器提升文章的可读性和精炼语言、修订程序过程中出现的错误以及添加标准化说明。这种使用是在严格的人为监督和控制下进行的。在应用AI技术后,作者对稿件进行了仔细的审查和编辑,以确保稿件的原创性、准确性和连贯性。

作者理解AI产生的内容可能是不正确的、不完整的或有偏见的。考虑到这一点,作者确保所有AI编辑器修订过的手稿以及语句最后经过了人类的眼睛和判断并彻底作者本人人工修改与校订,以符合人类的阅读习惯。所生成文本遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明,学术使用本文必须按期刊规定标注本文出处,翻用必究。

根据CSDN的原创政策,作者确认没有AI或AI辅助技术被列为本文的作者或合著者。作者完全理解,作者身份带来的责任和任务只能归因于人类并由人类执行,作者在准备本文时遵守了这些指导方针。

参考资料:

K均值(K-means)聚类算法(Python3实现代码)_聚类_helloWorld-GitCode 开源社区

K-means聚类算法原理及python实现_机器学习_杨Zz.-百度飞桨星河社区

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

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

相关文章

【Qt在线安装器】不能下载Qt5

qt在线下载不显示以前的版本时&#xff1a; 勾选”Archive“&#xff0c;点击”筛选“ 然后就会显示出QT5的版本&#xff0c; 按流程下载即可

html|本地实现浏览器m3u8播放器,告别网络视频卡顿

前言 网络上经常是以m3u8文件传输视频流的 &#xff0c;但是有时网络慢往往导致视频播放卡顿。于是我在想能不能先下载然后再播放呢&#xff1f;于是尝试下载然后实现本地播放m3u8视频。 正文 1.找到网络视频流的m3u8连接 一般在浏览器按F12就可以看到有请求视频流的连接。 …

[leetcode100] 101. 对称二叉树

https://leetcode.cn/problems/symmetric-tree/description/?envTypestudy-plan-v2&envIdtop-100-liked 心血来潮&#xff0c;突然感觉很久没做leetcode&#xff0c;刷一题。 看到“简单”&#xff0c;哦吼&#xff0c;应该很快吧。 结果真是《简单》 题目描述 给你一个…

技术速递|dotnet scaffold – .NET 的下一代内容创建

作者&#xff1a;Sayed Ibrahim Hashimi - 首席项目经理 排版&#xff1a;Alan Wang Visual Studio 中为 ASP.NET Core 项目搭建脚手架是一项长期特性&#xff0c;是在 ASP.NET Core 发布后不久添加的。多年来&#xff0c;我们一直支持从命令行搭建脚手架。根据从命令行操作中获…

经纬度解析到省市区【开源】

现在业务中有需要解析经纬度到省市区。 按理说可以直接使用高德&#xff0c;百度之类的。 但是老板太抠。于是去找开源项目。找了一圈&#xff0c;数据都太老了&#xff0c;而且有时候编码还不匹配。 所以诞生了这个项目&#xff0c;提供完整的一套省市区编码和定位反解析。…

打开分页机制

分页机制的表 一般线性地址和物理地址大小不会一样&#xff0c;物理内存空间不够时候&#xff0c;涉及和外部磁盘的swap过程&#xff0c;但是这个系统不涉及 CR3放的是页表的起始地址 代码部分 PDE:4MB page 一级页表的页块大小为4MB 然后是这个二级页表 PTE:4KB page 关于什…

EasyPlayer.js播放器如何在iOS上实现低延时直播?

随着流媒体技术的迅速发展&#xff0c;H5流媒体播放器已成为现代网络视频播放的重要工具。其中&#xff0c;EasyPlayer.js播放器作为一款功能强大的H5播放器&#xff0c;凭借其全面的协议支持、多种解码方式以及跨平台兼容性&#xff0c;赢得了广泛的关注和应用。 那么要在iOS上…

多模态大语言模型 MLLM 部署微调实践

1 MLLM 1.1 什么是 MLLM 多模态大语言模型&#xff08;MultimodalLargeLanguageModel&#xff09;是指能够处理和融合多种不同类型数据&#xff08;如文本、图像、音频、视频等&#xff09;的大型人工智能模型。这些模型通常基于深度学习技术&#xff0c;能够理解和生成多种模…

uniapp uni-table最简单固定表头

需求&#xff1a;固定表头数据&#xff0c;在网上找了半天&#xff0c;啥都有&#xff0c;就是一直实现不了&#xff0c;最后更改代码实现 1.效果 2.主要代码讲解完整代码 表格的父级一定要设置高度&#xff0c;不然会错位&#xff0c;我看网上说设置position&#xff1a;fixed…

在C#中编程绘制和移动线段

这个示例允许用户绘制和移动线段。它允许您根据鼠标下方的内容执行三种不同的操作。 当鼠标位于某个线段上时&#xff0c;光标会变成手的形状。然后您可以单击并拖动来移动该线段。当鼠标位于线段的终点上时&#xff0c;光标会变成箭头。然后您可以单击并拖动以移动终点。当鼠…

Hyperbolic Representation Learning: Revisiting and Advancing 论文阅读

Hyperbolic Representation Learning: Revisiting and Advancing 论文地址和代码地址1 介绍2 背景知识2.1 黎曼几何与双曲空间(RiemannianGeometry and Hyperbolic Space)2.2 双曲浅层模型2.3 双曲神经网络&#xff08;HNNs&#xff09;2.4 双曲图卷积神经网络&#xff08;HGCN…

Ansible自动化运维(三)playbook剧本详解

Ansible自动化运维这部分我将会分为五个部分来为大家讲解 &#xff08;一&#xff09;介绍、无密钥登录、安装部署、设置主机清单 &#xff08;二&#xff09;Ansible 中的 ad-hoc 模式 模块详解&#xff08;15&#xff09;个 &#xff08;三&#xff09;Playbook 模式详解 …

【机器学习】手写数字识别的最优解:CNN+Softmax、Sigmoid与SVM的对比实战

一、基于CNNSoftmax函数进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分析 二、 基于CNNsigmoid函数进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分析 三、 基于CNNSVM进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分…

196-基于CPCI Express架构的6u 主控板

一、板卡概述 该板卡是基于 CPCI Express架构的3U主控板&#xff0c;CPU采用Intel Pentium M 2.0GHz CPU&#xff0c;2M L2 cache&#xff0c;533M前端总线&#xff0c;支持512MB / 1GB表贴DDRII 400/533 MHz内存。 二、功能和技术指标 Intel Pentium M 2.0GHz CPU&#xff0c…

机器学习01-发展历史

机器学习01-发展历史 文章目录 机器学习01-发展历史1-传统机器学习的发展进展1. 初始阶段&#xff1a;统计学习和模式识别2. 集成方法和核方法的兴起3. 特征工程和模型优化4. 大规模数据和分布式计算5. 自动化机器学习和特征选择总结 2-隐马尔科夫链为什么不能解决较长上下文问…

HTA8998 实时音频跟踪的高效内置升压2x10W免电感立体声ABID类音频功放

1、特征 输出功率(fIN1kHz,RL4Ω&#xff0c;BTL) VBAT 4V, 2x10.6W(VOUT9V,THDN10%) VBAT 4V, 2x8.6W (VOUT9V,THDN1%) 内置升压电路模式可选择:自适应实时音频跟踪 升压(可提升播放时间50%以上)、强制升压 最大升压值可选择&#xff0c;升压限流值可设置 ACF防破音功能 D类…

Modern Effective C++ 条款三十八:关注不同线程句柄的析构行为

之前内容的总结&#xff1a; item37中说明了可结合的std::thread对应于执行的系统线程。未延迟&#xff08;non-deferred&#xff09;任务的future&#xff08;参见item36&#xff09;与系统线程有相似的关系。 因此&#xff0c;可以将std::thread对象和future对象都视作系统…

【Spring】IoC和DI,控制反转,Bean对象的获取方式

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;什么是IoC 1&#xff1a;什么是容器 2&#xff1a;什么是IoC 二&#xff1a;IoC应用…

【网络协议栈】TCP/IP协议栈中重要协议和技术(DNS、ICMP、NAT、代理服务器、以及内网穿透)

每日激励&#xff1a;“请给自己一个鼓励说&#xff1a;Jack我很棒&#xff01;—Jack” 绪论​&#xff1a; 本章是TCP/IP网络协议层的完结篇&#xff0c;本章将主要去补充一些重要的协议和了解一些网络中常见的名词&#xff0c;具体如&#xff1a;DNS、ICMP、NAT、代理服务器…

离屏渲染概述

我们知道&#xff0c;图像的处理基本都是在GPU中进行&#xff0c;然后GPU将渲染的结果放入当前渲染屏幕的帧缓冲区中&#xff0c;视频控制器取出里面的内容&#xff0c;在屏幕上进行显示。那么有没有什么情况&#xff0c;会因为某些限制&#xff0c;GPU无法将全部的渲染结果直接…