机器学习/sklearn 笔记:K-means,kmeans++

news2025/1/12 10:44:10

1  K-means介绍

1.0 方法介绍

  • KMeans算法通过尝试将样本分成n个方差相等的组来聚类,该算法要求指定群集的数量。它适用于大量样本,并已在许多不同领域的广泛应用领域中使用。
  • KMeans算法将一组样本分成不相交的簇,每个簇由簇中样本的平均值描述。这些平均值通常称为簇的“质心”;
    • 注意,质心通常不是样本点,尽管它们存在于相同的空间中。

  • KMeans算法旨在选择最小化惯性或称为群内平方和标准的质心:

1.1 惯性的缺点

  • 惯性可以被认为是衡量簇内部一致性的一种度量。它有各种缺点:
    • 惯性假设簇是凸形的和各向同性的,但这不总是情况。
      • 对于拉长的簇或形状不规则的流形反应不佳
    • 惯性不是一个规范化的度量:
      • 我们只知道较低的值更好,零是最优的。但是在非常高维的空间中,欧几里得距离往往会变得膨胀(这是所谓的“维数诅咒”的一个实例)。
      • ——>在k均值聚类之前运行一个降维算法,如主成分分析(PCA),可以缓解这个问题并加快计算速度。
  • 以下是几个K-means效果不加的例子:
      • clusters的数量不是最优
      • 各向异性的cluster分布
      • 方差不同
      • 各个簇数量不同

1.2 Kmeans算法的步骤

  • K均值算法通常被称为劳埃德算法(Lloyd's algorithm)。简单来说,该算法有三个步骤
    • 第一步选择初始质心,最基本的方法是从数据集中选择样本
    • 初始化之后,K均值算法由两个步骤的循环组成
      • 第一个步骤是将每个样本分配给最近的质心
      • 第二步是通过取分配给每个前一个质心的所有样本的平均值来创建新的质心
      • 计算旧质心和新质心之间的差异,并重复这最后两个步骤,直到这个值小于一个阈值(直到质心不再有显著移动为止)
  • K均值算法等同于期望最大化算法,带有一个小的、全相等的、对角线协方差矩阵

  • 给定足够的时间,K均值总会收敛,但这可能是到一个局部最小值
    • 这在很大程度上取决于质心的初始化
    • 因此,计算通常会进行多次,质心的初始化也各不相同
    • 一个帮助解决这个问题的方法是k-means++初始化方案(init='k-means++')
      • 这样初始化质心通常会相互远离,导致比随机初始化更好的结果

2 sklearn.cluster.KMeans

sklearn.cluster.KMeans(
    n_clusters=8, 
    *, 
    init='k-means++', 
    n_init='warn', 
    max_iter=300, 
    tol=0.0001, 
    verbose=0, 
    random_state=None, 
    copy_x=True, 
    algorithm='lloyd')

2.1 主要参数

n_clusters簇的数量
init
  • {‘k-means++’, ‘random’}或形状为(n_clusters, n_features)的数组,默认为'k-means++' 初始化方法
    • ‘k-means++’:使用基于点对总惯性贡献的经验概率分布的采样来选择初始簇质心。这种技术加快了收敛速度
      • 这里实现的算法是“贪婪k-means++”。它与普通的k-means++的不同之处在于,每个采样步骤进行多次尝试,并从中选择最佳质心
    • ‘random’:从数据中随机选择n_clusters个观测(行)作为初始质心
    • 数组:形状应为(n_clusters, n_features),并给出初始中心
n_init
  • 'auto'或int,默认值为10
  • k-means算法运行的次数,每次都使用不同的质心种子
  • 最终结果是n_init连续运行中惯性最佳的输出。
  • 当n_init='auto'时,运行次数取决于init的值:
    • 如果使用init='random',则为10
    • 如果使用init='k-means++'或init是类数组的,则为1
max_iter
  • int,默认值为300
  • k-means算法单次运行的最大迭代次数
tol两次连续迭代的簇中心的Frobenius范数差异来声明收敛的相对容忍度

2.2 举例

from sklearn.cluster import KMeans
import numpy as np

X = np.array([[1, 2], [1, 4], [1, 0],
              [10, 2], [10, 4], [10, 0]])

kmeans=KMeans(n_clusters=2,n_init='auto').fit(X)

2.2.1 属性

cluster_centers_

簇中心的坐标

labels_ndarray

每个点的标签

inertia_

样本到最近簇中心的平方距离之和,如果提供了样本权重,则按样本权重加权

n_iter_

运行的迭代次数

2.2.2 fit


fit(X, sample_weight=None)

 sample_weight 是X中每个观测的权重。如果为None,则所有观测都被赋予相等的权重

3 sklearn.cluster.kmeans_plusplus

类似于使用k_means++来进行

sklearn.cluster.kmeans_plusplus(X, n_clusters, *, sample_weight=None, x_squared_norms=None, random_state=None, n_local_trials=None)
X

用来选择初始种子的数据

(也就是KMeans里面fit的内容)

n_cluster要初始化的质心数量
sample_weightX中每个观测的权重

3.1 返回值:

centers:形状为(n_clusters, n_features) ,k-means的初始中心。

indices:形状为(n_clusters,) 在数据数组X中选择的中心的索引位置。对于给定的索引和中心,X[index] = center

3.2 举例

from sklearn.cluster import kmeans_plusplus
import numpy as np

X = np.array([[1, 2], [1, 4], [1, 0],
              [10, 2], [10, 4], [10, 0]])

kmeans_plusplus(X,n_clusters=2)
'''
(array([[10,  0],
        [ 1,  4]]),
 array([5, 1]))
'''

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

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

相关文章

图神经网络与图注意力网络

随着计算机行业和互联网时代的不断发展与进步,图神经网络已经成为人工智能和大数据的重要研究领域。图神经网络是对相邻节点间信息的传播和聚合的重要技术,可以有效地将深度学习的理念应用于非欧几里德空间的数据上。本期推送围绕图神经网络与图注意力网…

老生常谈之 JavaScript 中 0.1 + 0.2 != 0.3 的原因

先来一个模棱两可的说法:因为精度丢失、存储溢出的问题 先复习一下二进制的转换方法: 整数:除以基数,取余,自底向上小数:乘以基数,取整,自顶向下 接着,复习一下双精度…

QTableWidget——编辑单元格

文章目录 前言熟悉QTableWiget,通过实现单元格的合并、拆分、通过编辑界面实现表格内容及属性的配置、实现表格的粘贴复制功能熟悉QTableWiget的属性 一、[单元格的合并、拆分](https://blog.csdn.net/qq_15672897/article/details/134476530?spm1001.2014.3001.55…

ios qt开发要点

目前关于ios qt的开发资料比较少,这里整理了几个比较重要的开发要点,基于MacOS14 Xcode15 Qt15.5 cmake iphone真机。 cmake报错,报错信息如下 CMake Error at /Users/user/Qt/5.15.5/ios/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:91 (m…

C++初阶 | [四] 类和对象(下)

摘要:初始化列表,explicit关键字,匿名对象,static成员,友元,内部类,编译器优化 类是对某一类实体(对象)来进行描述的,描述该对象具有哪些属性、哪些方法,描述完成后就形成…

shell脚本之循环语句(for、while、untli)

循环语句: 一定要有跳出循环条件 循环条件: 1.已知循环的次数(新来十个人,就要新建十个账号 2.未知循环的次数,但是要有跳出循环条件(对象生气,要道歉到原谅为止) for&#xff…

SpringBoot_websocket实战

SpringBoot_websocket实战 前言1.websocket入门1.1 websocket最小化配置1.1.1 后端配置1.1.2 前端配置 1.2 websocket使用sockjs1.2.1 后端配置1.2.2 前端配置 1.3 websocket使用stomp协议1.3.1 后端配置1.3.2 前端配置 2.websocket进阶2.1 websocket与stomp有什么区别2.2 webs…

【ThingJS】类型转换以及注册

前言 目前国家提倡加快数字化发展,建设数字中国,并于今年2月份中共中央、国务院印发的《数字中国建设整体布局规划》中明确,数字中国建设按照“2522”的整体框架进行布局。其中提到“构建以数字孪生流域为核心的智慧水利体系”,可…

HarmonyOS(三)—— 应用程序入口—UIAbility

前言 学习过android的同学都是知道Activity,Activity是Android组件中最基本也是最为常见用的四大组件之一,用户可以用来交互为了完成某项任务。 Activity中所有操作都与用户密切相关,是一个负责与用户交互的组件,可以通过setCon…

Mac自带的看图如何连续查看多张图片

一、问题 mac看访达里的图片时,双击打开一张图片,然后按上下左右键都没法切换到另外的图片。而且也没找到像window一样单击缩略图可以看到预览图。其实是自己不懂得怎么使用,哈哈哈😂 二、方法 2.1、图标方式 可以看到缩略图&a…

原理Redis-QuickList

QuickList **问题1:**ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办? 为了缓解这个问题,我们必须限制ZipList的长度和entry大小。 **问题2:**但是…

【NLP】GPT 模型如何工作

介绍 2021 年,我使用 GPT 模型编写了最初的几行代码,那时我意识到文本生成已经达到了拐点。我要求 GPT-3 总结一份很长的文档,并尝试了几次提示。我可以看到结果比以前的模型先进得多,这让我对这项技术感到兴奋,并渴望…

[数据结构]-AVL树

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、AVL树基…

陪玩圈子系统APP小程序H5,详细介绍,源码交付,支持二开!

陪玩圈子系统,页面展示,源码交付,支持二开! 陪玩后端下载地址:电竞开黑陪玩系统小程序,APP,H5: 本系统是集齐开黑,陪玩,陪聊于一体的专业APP,小程序&#xff…

Github Copilot AI编码完成工具

目录 一、GitHub Copilot 1、简介 2、工作原理 3、功能 二、GitHub Copilot X 1、什么是 GitHub Copilot X 2、GitHub Copilot X 的功能 三、支持、使用 1、支持 2、使用 四、实际研究、验证(代码方向) 1、代码生成 2、代码提示 3、生成测试用例 4、代码解释 5…

排序算法--归并排序

实现逻辑 ① 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素 ② 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素 ③ 重复步骤②,直到所有元素排序完毕 void pri…

Rust并发编程:理解线程与并发

大家好!我是lincyang。 今天我们来深入探讨Rust中的并发编程,特别是线程的使用和并发的基本概念。 Rust中的线程 Rust使用线程来实现并发。线程是操作系统可以同时运行的最小指令集。在Rust中,创建线程非常简单,但与此同时&…

SHAP - 机器学习模型可解释性工具

github地址:shap/docs/index.rst at master shap/shap (github.com) SHAP使用文档:欢迎使用 SHAP 文档 — SHAP 最新文档 SHAP介绍 SHAP(SHapley Additive exPlanations)是一种用于解释预测结果的方法,它基于Shapley…

ADB命令介绍

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

系列七、ThreadLocal为什么会导致内存泄漏

一、ThreadLocal为什么会导致内存泄露 1.1、ThreadLocalMap的基本结构 ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map的功能,其内部的Entry也是独立实现的。源码如下: 1.2、ThreadLocal引用示意图…