学习日记_20241110_聚类方法(K-Means)

news2024/12/24 9:01:47

前言

提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。

文章目录

  • 前言
  • 聚类算法
    • 经典应用场景
    • K-Means 聚类
      • 简单实例(函数库实现)
      • 数学表达
        • K-Means 算法步骤
        • 数学优化目标
        • 收敛性
        • 优点
        • 缺点
      • 手动实现
        • 代码分析


聚类算法

聚类算法在各种领域中有广泛的应用,主要用于发现数据中的自然分组和模式。以下是一些常见的应用场景以及每种算法的优缺点:

经典应用场景

  1. 市场细分:根据消费者的行为和特征,将他们分成不同的群体,以便进行有针对性的营销。

  2. 图像分割: 将图像划分为多个区域或对象,以便进行进一步的分析或处理。

  3. 社交网络分析:识别社交网络中的社区结构。

  4. 文档分类:自动将文档分组到不同的主题或类别中。

  5. 异常检测识别数据中的异常点或异常行为。

  6. 基因表达分析:在生物信息学中,根据基因表达模式对基因进行聚类。

K-Means 聚类

  1. K-Means 聚类
  • 优点
    • 算法简单,容易实现。
    • 计算速度快,适用于大规模数据集。
  • 缺点
    • 需要预先指定簇的数量 K K K
    • 对于初始中心点选择敏感。
    • 只能找到球状簇,无法处理非凸形状的簇。
    • 对噪声和异常值敏感。

简单实例(函数库实现)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 生成数据
X = np.random.rand(100, 2)
# K-Means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
labels = kmeans.labels_
# 可视化
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], color='red')
plt.title('K-Means Clustering')
plt.show()

X数据分布:
在这里插入图片描述
代码运行结果:
在这里插入图片描述

数学表达

K-Means 聚类是一种常用的无监督学习算法,目的是将数据分为 K K K 个簇,以最小化簇内数据点与簇中心的方差之和。下面是对
K-Means 聚类算法的详细介绍,包括其数学公式和步骤。

K-Means 算法步骤
  1. 初始化

    从数据集中随机选择 K K K 个点作为初始簇中心(质心),记作 { μ 1 , μ 2 , … , μ K } \{\mu_1, \mu_2, \ldots, \mu_K\} {μ1,μ2,,μK}

  2. 分配数据点

    对于每个数据点 x i \mathbf{x}_i xi,计算其与每个簇中心的距离,将其分配到距离最近的簇中。通常采用欧氏距离作为距离度量:

    assign  x i  to cluster  j = arg ⁡ min ⁡ k ∥ x i − μ k ∥ 2 \text{assign } \mathbf{x}_i \text{ to cluster } j = \arg\min_{k} \|\mathbf{x}_i - \mu_k\|^2 assign xi to cluster j=argkminxiμk2

  3. 更新簇中心

    对于每个簇 j j j,计算簇中所有数据点的均值作为新的簇中心:

    μ j = 1 N j ∑ x i ∈ C j x i \mu_j = \frac{1}{N_j} \sum_{\mathbf{x}_i \in C_j} \mathbf{x}_i μj=Nj1xiCjxi

    其中 C j C_j Cj 表示簇 j j j 中的所有数据点, N j N_j Nj 是簇 j j j 中的点的数量。

  4. 重复

    重复步骤 2 和步骤 3,直到簇中心不再发生变化或达到预设的迭代次数。

数学优化目标

K-Means 聚类的目标是最小化所有数据点到其所属簇中心的距离平方和。其优化目标函数为:

J = ∑ j = 1 K ∑ x i ∈ C j ∥ x i − μ j ∥ 2 J = \sum_{j=1}^{K} \sum_{\mathbf{x}_i \in C_j} \|\mathbf{x}_i - \mu_j\|^2 J=j=1KxiCjxiμj2

这里, J J J 是代价函数,表示簇内平方误差和。

收敛性

K-Means 算法通过交替优化分配和更新步骤最终收敛,因为每一步都使得代价函数 J J J单调递减。然而,算法可能收敛到局部最小值,因此初始化方式对最终结果有较大影响。

优点
  • 实现简单,计算速度快。
  • 在簇形状是凸的、簇的大小相似的情况下效果较好。
缺点
  • 选择 K K K 值比较困难,通常需要通过经验或使用评估指标(如肘部法则、轮廓系数)来选择。
  • 对初始值敏感,可能导致收敛到局部最优。
  • 适用于凸形簇,对于不同大小和密度的簇效果不好。
  • 对噪声和孤立点敏感。

K-Means 聚类是一种简单有效的聚类方法,广泛应用于各种实际问题,但在使用中需注意其局限性和对参数选择的要求。

手动实现

import numpy as np

def initialize_centroids(X, K):
    # 从数据集中随机选择K个样本作为初始质心
    indices = np.random.choice(X.shape[0], K, replace=False)
    centroids = X[indices]
    return centroids

def assign_clusters(X, centroids):
    # 计算每个样本到每个质心的距离,并将样本分配到最近的质心
    distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
    return np.argmin(distances, axis=0)

def update_centroids(X, labels, K):
    # 根据分配结果更新质心为每个簇中所有样本的均值
    centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])
    return centroids

def kmeans(X, K, max_iters=100, tol=1e-4):
    # 初始化质心
    centroids = initialize_centroids(X, K)
    for i in range(max_iters):
        # 分配样本到最近的质心
        labels = assign_clusters(X, centroids)
        # 计算新的质心
        new_centroids = update_centroids(X, labels, K)
        # 检查质心是否收敛
        if np.all(np.abs(new_centroids - centroids) < tol):
            break
        centroids = new_centroids
    return labels, centroids
# 示例用法
if __name__ == "__main__":
    # 生成一些测试数据
    X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], 
                  [8.0, 8.0], [1.0, 0.6], [9.0, 11.0],
                  [8.0, 2.0], [10.0, 2.0], [9.0, 3.0]])
    # 设定簇的数量
    K = 3
    # 运行K-Means算法
    labels, centroids = kmeans(X, K)

    print("Cluster labels:", labels)
    print("Centroids:", centroids)

代码分析

1. np.random.choice(X.shape[0], K, replace=False)
numpy.random.choice(a, size=None, replace=True, p=None)
np.random.choice 是 NumPy 库中的一个函数,用于从给定的一维数组中生成随机样本。它可以指定样本的数量、是否允许重复选择等参数。
在这里插入图片描述
2. np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))

  • centroids[:, np.newaxis]: 使用 np.newaxiscentroids 的形状从 (K, n_features) 变为 (K, 1, n_features),这样做是为了实现广播(broadcasting),以便在后续计算中能够对每个质心与每个样本进行逐元素运算。
  • X - centroids[:, np.newaxis]:这个操作会创建一个形状为 (K, n_samples, n_features) 的数组,表示每个质心与每个样本之间的差值。
  • .sum(axis=2):这个操作会对最后一个维度(特征维度)进行求和,结果是一个形状为 (K, n_samples) 的数组,表示每个样本与每个质心之间的特征平方和。
  1. np.argmin(distances, axis=0)
  • np.argmin 是一个NumPy函数,用于找到数组中最小值的索引。
  • axis=0 表示沿着第一个轴(即行)查找最小值。这意味着对每个样本(每列)比较所有质心的距离,找到最小值对应的质心索引。

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

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

相关文章

SMA-BP基于黏菌算法优化BP神经网络时间序列预测

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

ssm103宠物领养系统+vue(论文+源码)_kaic

毕业设计&#xff08;论文&#xff09; 宠物领养系统的设计与实现 学生姓名&#xff1a; 二级学院&#xff1a; 班级名称&#xff1a; 指导教师&#xff1a; 年 月 日 录 摘 …

Elasticsearch如果集群出现节点故障,我应该如何快速定位问题?

当 Elasticsearch (ES) 集群发生故障时&#xff0c;快速定位问题源头非常重要。Elasticsearch 是一个分布式系统&#xff0c;故障可能由多种原因引起&#xff0c;涉及到硬件、配置、网络、集群本身的健康状况等多个层面。以下是一些定位问题的步骤和工具&#xff1a; 检查集群…

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不同服务pod内部间访问 1、service 在K8S中&#xff0c;Service是一种抽象&#xff0c;定义了一组Pod的逻辑集合和访问这些Pod的策略。首先&#xff0c;我们需…

dbeaver 连接日常是数据库工具类似navicat

官网下载安装包 DBeaver Community | Free Universal Database Tool 登录mysql为例 字体调整 sql 美化&#xff0c;关键字大写 快捷键 执行 ctrlenter 单个语句执行 alt x 执行sql脚本 事务提交&#xff0c;默认自动&#xff0c;可以改成手动 创建数据库 新建表 添加主键 …

Chromium 中chrome.webRequest扩展接口定义c++

一、chrome.webRequest 注意 &#xff1a;从 Manifest V3 开始&#xff0c;"webRequestBlocking" 权限不再适用于大多数扩展程序。以 "declarativeNetRequest" 为例&#xff0c;它允许使用 declarativeNetRequest API。除了 "webRequestBlocking&quo…

【MySQL】数据库必备知识:全面整合表的约束与深度解析

前言&#xff1a;本节内容讲述表的约束的相关内容。 表的约束博主将会通过两篇文章进行讲解&#xff0c; 这是第一篇上半部分。 讲到了约束概念。 以及几种常见约束。下面友友们开始学习吧&#xff01; ps:友友们使用了mysql就可以放心观看喽&#xff01; 目录 表的约束概念 …

堆排序,学习笔记

目录 一、概念 二、堆排序的基本思路 三、堆排序的基本步骤 1. 构建初始堆&#xff1a; 2. 排序过程 四、示例 五、应用场景 1. 优先级队列相关场景 2. TopK 值问题 一、概念 堆排序是一种基于二叉堆数据结构的排序算法。二叉堆是一种完全二叉树&#xff0c;它分为两种…

分享 pdf 转 word 的免费平台

背景 找了很多 pdf 转 word 的平台都骗进去要会员&#xff0c;终于找到一个真正免费的&#xff0c;遂分享。 网址 PDF转Word转换器 - 100%免费市面上最优质的PDF转Word转换器 - 免费且易于使用。无附加水印 - 快速将PDF转成Word。https://smallpdf.com/cn/pdf-to-word

llama-cpp模型轻量化部署与量化

一、定义 定义配置环境遇到的问题&#xff0c;交互模式下模型一直输出&#xff0c;不会停止模型量化Qwen1.5-7B 案例demo 二、实现 定义 主要应用与cpu 上的部署框架。由c完成。配置环境 https://github.com/ggerganov/llama.cpp https://github.com/echonoshy/cgft-llm/blo…

2024最新版JavaScript逆向爬虫教程-------基础篇之Proxy与Reflect详解

目录 一、监听对象的操作二、Proxy基本使用2.1 创建空代理2.2 定义捕获器2.2.1 Proxy的set和get捕获器2.2.2 Proxy(handler)的13个捕获器 三、Reflect的作用3.1 Reflect的使用3.2 Reflect其余方法(9个)3.3 Proxy与Reflect中的receiver参数3.4 Reflect中的construct方法 ECMAScr…

Ceph层次架构分析

Ceph的层次结构可以从逻辑上自下向上分为以下几个层次&#xff1a; 一、基础存储系统RADOS层 功能&#xff1a;RADOS&#xff08;Reliable Autonomic Distributed Object Store&#xff09;是Ceph的底层存储系统&#xff0c;提供了分布式存储的核心功能。它是一个完整的对象存…

webpack指南

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;webpack篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来webpack篇专栏内容:webpack-指南 概念 中文&#xff1a; webpack | webpack中文文档 | webpack中文网 英文&…

网站架构知识之nginx第三天(day026 )

1.状态模块 使用方法&#xff1a;location /status/{ stub_$status; } 任意一个虚拟主机添加这个&#xff0c;就可以查看nginx状态。 对应指标及其说明

新的恶意软件活动通过游戏应用程序瞄准 Windows 用户

一种新的恶意软件 Winos4.0 被积极用于网络攻击活动。FortiGuard实验室发现&#xff0c;这种先进的恶意框架是从臭名昭著的 Gh0strat 演变而来的&#xff0c;配备了模块化组件&#xff0c;可在受感染的设备上进行一系列恶意活动。 这些攻击已在游戏相关应用程序中发现&#xf…

Redis - 集群(Cluster)

一、基本概念 上述的哨兵模式,提⾼了系统的可⽤性.但是真正⽤来存储数据的还是master和slave节点.所有的数 据都需要存储在单个master和slave节点中. 如果数据量很⼤,接近超出了master/slave所在机器的物理内存,就可能出现严重问题了. 如何获取更⼤的空间?加机器即可!所谓&q…

WebRTC项目一对一视频

开发步骤 1.客户端显示界面 2.打开摄像头并显示到页面 3.websocket连接 4.join、new-peer、resp-join信令实现 5.leave、peer-leave信令实现 6.offer、answer、candidate信令实现 7.综合调试和完善 1.客户端显示界面 步骤&#xff1a;创建html页面 主要是input、button、vide…

启动本地开发环境(自带热启动)yarn serve

文章目录 1. 安装 Yarn使用 npm 安装 Yarn使用 Chocolatey 安装 Yarn&#xff08;Windows 用户&#xff09;使用 Homebrew 安装 Yarn&#xff08;macOS 用户&#xff09; 2. 安装项目依赖3. 启动项目开发模式启动生产模式启动 4. 构建项目开发模式构建生产模式构建 5. 其他常用…

SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)

目录 六、Consul服务注册和发现 1.基本介绍 2.下载运行 3.服务注册与发现 &#xff08;1&#xff09;支付服务provider8001注册进consul &#xff08;2&#xff09;修改订单服务cloud-consumer-order80 4.CAP &#xff08;1&#xff09;CAP理论 &#xff08;2&#x…

SAP ABAP开发学习记录——报表选择界面初始值

程序中定义选择界面的部分只是创建输入框&#xff0c;在后续使用中需要自行添加搜索条件&#xff0c;而有关时间或者日期这种&#xff0c;希望自动创建一个默认值&#xff0c;有两种方法&#xff0c;一种是在选择界面初始化时增加语句另外一种是通过在选择界面创建变式实现。 …