划分聚类方法实现与应用

news2024/11/17 15:49:40

文章目录

  • 划分聚类介绍
  • K-Means 聚类方法
    • 用python实现聚类
      • 生成示例数据
      • 随机初始化中心点
      • 计算样本与中心点的距离
      • 更新聚类中心
      • K-Means 聚类算法实现
    • 用scikit-learn实现聚类
    • 如何确定k
      • 肘部法则
  • K-Means++ 聚类算法
    • 生成数组
    • K-Means 聚类
    • K-Means++ 算法流程
    • K-Means++ 算法实现
  • Mini-Batch K-Means 聚类算法

聚类属于无监督学习算法。下面讲解聚类中最常用的划分聚类方法,并对其中最具有代表性的 K-Means 算法进行介绍。

  • 划分聚类介绍
  • K-Means 聚类方法
  • 中心点移动过程可视化
  • K-Means++ 算法实现

划分聚类介绍

划分聚类,通过划分的方式将数据集划分为多个不重叠的子集(簇),每一个子集作为一个聚类(类别)。

在划分的过程中,首先由用户确定划分子集的个数 k k k,然后随机选定 k k k 个点作为每一个子集的中心点,接下来通过迭代的方式:计算数据集中每个点与各个中心点之间的距离,更新中心点的位置;最终将数据集划分为 k k k 个子集,即将数据划分为 k k k 类。

而评估划分的好坏标准就是:保证同一划分的样本之间的差异尽可能的小,且不同划分中的样本差异尽可能的大。

K-Means 聚类方法

在划分聚类中,K-Means 是最具有代表性的算法,下面用图片的方式演示 K-Means 的基本算法流程。希望大家能通过简单的图文演示,对 K-Means 方法的原理过程产生大致的印象。

对于未聚类数据集,首先随机初始化 K 个(代表拟聚类簇个数)中心点,如图红色五角星所示。

image
每一个样本按照距离自身最近的中心点进行聚类,等效于通过两中心点连线的中垂线划分区域。


依据上次聚类结果,移动中心点到个簇的质心位置,并将此质心作为新的中心点


反复迭代,直至中心点的变化满足收敛条件(变化很小或几乎不变化),最终得到聚类结果。

用python实现聚类

生成示例数据

首先通过 scikit-learn 模块的 make_blobs() 函数生成本次实验所需的示例数据。该方法可以按照我们的要求,用来创建类似于“blobs”(团簇)的分布,通常用于聚类分析的示例

data,label = sklearn.datasets.make_blobs(n_samples=100,n_features=2,centers=3,center_box=(-10.0,10.0),random_state=None)   

参数为:

  • n_samples:表示生成数据总个数,默认为 100 个。
  • n_features:表示每一个样本的特征个数,默认为 2 个。
  • centers:表示中心点的个数,默认为 3 个。
  • center_box:表示每一个中心的边界,默认为 -10.0到10.0。
  • random_state:表示生成数据的随机数种子。

返回值为:

  • data:表示数据信息。
  • label:表示数据类别。

根据上面函数,在 0.0 到 10.0 上生成 200 条数据,大致包含 3 个中心。这里的数据仅用于演示聚类效果,数据标签不是必须的,在生成数据时赋值给 _

from sklearn.datasets import make_blobs

# 构造示例数据
blobs, _ = make_blobs(n_samples=200, centers=3, random_state=18)
blobs[:10]  # 打印出前 10 条数据的信息
array([[ 8.28390539,  4.98011149],
       [ 7.05638504,  7.00948082],
       [ 7.43101466, -6.56941148],
       [ 8.20192526, -6.4442691 ],
       [ 3.15614247,  0.46193832],
       [ 7.7037692 ,  6.14317389],
       [ 5.62705611, -0.35067953],
       [ 7.53828533, -4.86595492],
       [ 8.649291  ,  3.98488194],
       [ 7.91651636,  4.54935348]])

绘制数据分布

import matplotlib.pyplot as plt
%matplotlib inline

plt.scatter(blobs[:, 0], blobs[:, 1], s=20)  # 数据展示

随机初始化中心点

当我们得到数据时,依照划分聚类方法的思想,首先需要随机选取 k k k 个点作为每一个子集的中心点。从图像中,通过肉眼很容易的发现该数据集有 3 个子集。接下来,用 NumPy 模块随机生成 3 个中心点,为了更方便展示,这里我们加入了随机数种子以便每一次运行结果相同。

import numpy as np


def random_k(k, data):
    """
    参数:
    k -- 中心点个数
    data -- 数据集

    返回:
    init_centers -- 初始化中心点
    """
    # 初始化中心点
    prng = np.random.RandomState(1)  # 定义随机种子,只要使用相同的种子值,无论何时运行代码,生成的随机数序列都将是相同的。这使得可以重现实验结果或调试代码。
    num_feature = np.shape(data)[1]
    # 初始化从标准正态分布返回的一组随机数,为了更加贴近数据集这里乘了一个 5
    init_centers = prng.randn(k, num_feature)*5
    return init_centers


init_centers = random_k(3, blobs)
init_centers
array([[  8.12172682,  -3.05878207],
       [ -2.64085876,  -5.36484311],
       [  4.32703815, -11.50769348]])

在随机生成好中心点之后,将其在图像中表示出来,这里同样使用红色五角星表示。

# 初始中心点展示
plt.scatter(blobs[:, 0], blobs[:, 1], s=20)
plt.scatter(init_centers[:, 0], init_centers[:, 1], s=100, marker='*', c="r")

计算样本与中心点的距离

为了找到最合适的中心点位置,需要计算每一个样本和中心点的距离,从而根据距离更新中心点位置。这里采用欧几里得距离(欧式距离)。

欧氏距离公式如下:
d = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 (1) d=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\tag{1} d=(x1x2)2+(y1y2)2 (1)
python代码如下:

def d_euc(x, y):
    """
    参数:
    x -- 数据 a
    y -- 数据 b

    返回:
    d -- 数据 a 和 b 的欧氏距离
    """
    # 计算欧氏距离
    d = np.sqrt(np.sum(np.square(x - y)))
    return d

更新聚类中心

通过优化一个目标函数,评估聚类算法的质量。

在聚类算法中,常常使用误差的平方和 SSE(Sum of squared errors)作为度量聚类效果的标准,当 SSE 越小表示聚类效果越好。其中 SSE 表示为:

S S E ( C ) = ∑ k = 1 K ∑ x i ∈ C k ∥ x i − c k ∥ 2 (2) SSE(C)=\sum_{k=1}^{K}\sum_{x_{i}\in C_{k}}\left \| x_{i}-c_{k} \right \|^{2} \tag{2} SSE(C)=k=1KxiCk

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

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

相关文章

【AI绘画】Midjourney前置指令/describe、/shorten详解

文章目录 💯前言💯Midjourney前置指令/describe使用方法1️⃣2️⃣3️⃣4️⃣(选择对应提示词)🔄(重新识别生成提示词)🎉Imagine all(一次性生成所有)注意 &a…

【项目文档】软件实施方案(软件文档Word原件)

一、 概述 二、 项目介绍 2.1 概览 三、 项目实施 3.1 项目实施概况 3.2 项目实施管理原则 3.3 项目组织结构 3.4 项目团队 四、 项目实施计划 4.1 项目实施工作流程 4.2 项目软件部分进度安排 4.3 网络拓扑图 4.4 服务器需求清单 五、 人员培训 5.1 培训内容 5…

如何快速创建美观实用的思维导图?五个技巧教你轻松上手

在信息爆炸的时代,如何高效地整理和记忆海量信息,成为许多人关注的焦点。思维导图作为一种创新的笔记记录方式,因其直观、结构化的特性,逐渐成为现代学习和工作的首选工具。许多学习高手和职场精英都纷纷青睐这一方法,…

【TiDB原理与实战详解】4、DM 迁移和TiCDC数据同步~学不会? 不存在的!

DM工具数据迁移 1、简介 DM全称TiDB Data Migration , 支持兼容mysql协议的数据库(MySQL、MariaDB、Aurora MySQL),将数据(异步)迁移到TiDB中。支持全量和增量数据传输。可以过滤数据,可以将分库分表的数据…

【JVM原理】类加载机制

文章目录 一、JVM组成二、类的生命周期2-1 加载 (Loading)2-2 连接 (Linking)2-3 初始化 (Initialization)2-4 使用 (Using)2-5 卸载 (Unloading) 三、类加载器3-1 类加载器的作用3-2 类加载器的种类3-3 类加载机制双亲委派机制(Parent Delegation Model&#xff09…

分享林曦老师的苏东坡入门阅读清单

大家暑假过得还愉快嘛假期前暄桐的课程刚好进行到六阶“见道明心的笔墨”书法部分《赤壁赋》的学习,也为暑假提供些新的乐趣,林曦老师十分贴心地送给大家一份苏东坡阅读入门清单,每本书有不同的侧重点。祝大家读书开心,有满满的收…

某张卡NR only下可以驻网 AUTO模式下在2G/3G工作

结论:需要终端设置为data centric,或ps only。 从日志看,5G下的注册收到REGISTRATION ACCEPT。但是没有携带ims support。 正常网络: ims_Vops_3GPP 1 (0x1) nwk_feature_supp_inc 1 (0x1)nwk_feature_supportedlength 2 (0x2)mpsi 0 (0…

JVM中篇:字节码与类的加载篇-03-类的加载过程(类的生命周期)详解

笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机) 文章目录 1. 概述大厂面试题 2. 过程一:Loading(加载)阶段2.1. 加载完成的操作2.2. 二进制流的获取方式2…

设置文本的颜色

AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"><applicationandroid:allowBackup"true"android:icon"mipmap/ic_launcher…

如何使用查询路由构建更先进的 RAG

前言 目前大部分RAG的实践方案都是通过检索模型从外部数据库中获取与输入相关的文档或信息&#xff1b;然后&#xff0c;将这些信息与输入结合&#xff0c;输入到生成模型中进行文本生成。这种方案往往会有一个问题就是所有的数据都存储在一起&#xff0c;但这往往是没法在生产…

PCB寄生电容的影响,计算方法和消除措施

什么是PCB寄生电容&#xff1f; 寄生电容是存在于由绝缘体隔开的两个导电结构之间的虚拟电容&#xff0c;是PCB布局中的一种效应&#xff0c;其传播的信号表现为电容&#xff0c;但并不是真正意义上的电容。 寄生电容有什么影响&#xff1f; 在高速或高频电路板中&#xff0c…

Java云端联动触手可及高端台球助教教练多端系统小程序源码

&#x1f3b1;云端联动&#xff0c;触手可及&#xff01;高端台球助教教练多端系统&#xff0c;你的私人球技加速器&#x1f680; &#x1f308; 开篇&#xff1a;遇见台球新纪元 在这个科技日新月异的时代&#xff0c;台球这项优雅的运动也迎来了它的智能升级&#xff01;&am…

【机器学习】支持向量机(SVM)的基本概念、如何选择向量机(SVM)的参数以及在python中使用向量机的实例

引言 支持向量机&#xff08;SVM&#xff09;是一种在机器学习中广泛应用的二分类模型。它的核心思想是寻找一个最优的超平面&#xff0c;将不同类别的样本分隔开来。这个过程涉及到最大化间隔&#xff0c;即找到那些最接近分隔超平面的样本点&#xff0c;这些点被称为支持向量…

3秒AI写真出图,Stable Diffusion2024升级版+使用教程来了!(无需安装,解压即用

前言 要说今年摄影圈最大的新秀 那妥妥的就Stable Diffusion 比如下面的写真照片 你敢信这是SD绘画生成的&#xff1f; 本次教程将使用AI绘画工具 Stable Diffusion 进行讲解&#xff0c;如还未安装SD的小伙伴可以扫描免费获取哦~ 就在刚刚它又全面升级了 新版无需安装&a…

插入移动硬盘后【提示需要格式化】,如何修复?

遇到格式化问题&#xff0c;又想要找回数据&#xff0c;怎么办&#xff1f; 我们只需要一个数据恢复软件就能解决所有数据丢失问题 1、转转大师数据恢复 点击直达链接>>https://www.huifuzhinan.com 恢复数据类型超全面的一个软件&#xff0c;包括但不限于以下几种&…

Python开发者必备利器之Gooey使用详解

概要 在Python开发中,命令行程序是一种常见的方式来与用户交互,但有时候用户更喜欢使用图形界面来操作程序。 为了实现这一转变,我们可以使用非标准模块Gooey,它可以帮助我们将命令行程序快速转换为具有图形用户界面(GUI)的应用程序。 本文将介绍Gooey的基本概念、使用…

矩阵分析 学习笔记2 线性子空间 线性映射

子空间是啥&#xff1a; 平凡子空间&#xff1a;{0}&#xff08;只有一个0元素&#xff09;和V&#xff08;原本的子空间&#xff09; 向量组生成的子空间&#xff1a; 比如说&#xff0c;我们的三维空间就是由三个标准基组成的向量组“张”成的空间&#xff0c;而标准基组成的…

基于Pytorch框架的深度学习DeepLabv3+网络头发语义分割系统源码

第一步&#xff1a;准备数据 头发分割数据&#xff0c;总共有1050张图片&#xff0c;里面的像素值为0和1&#xff0c;所以看起来全部是黑的&#xff0c;不影响使用 第二步&#xff1a;搭建模型 DeepLabV3的网络结构如下图所示&#xff0c;主要为Encoder-Decoder结构。其中&am…

深度学习基础--模型拟合

模型拟合 损失与网络参数有关&#xff0c;本章着重于探讨如何确定能使损失最小化的参数值。这个过程称为网络参数的学习&#xff0c;或更通俗地说&#xff0c;是模型的训练或拟合。该过程首先是选取一组初始参数值&#xff0c;随后重复执行两个步骤&#xff1a; (i) 计算损失…

张驰咨询:新界泵业六西格玛设计DFSS项目出成果

近日&#xff0c;新界泵业六西格玛设计项目通过专家评审&#xff0c;新界泵业石总等领导、六西格玛设计项目组成员、张驰咨询首席顾问张驰、首席六西格设计顾问赵老师共同出席项目评审会。 &#xff08;顾问老师致辞&#xff09; 本期项目涉及多款新产品开发&#xff0c;本期…