首页 > 编程语言 >[无监督学习] 14.详细图解k-means 算法

[无监督学习] 14.详细图解k-means 算法

时间:2024-06-09 14:31:20浏览次数:14  
标签:14 重心 means 算法 WCSS 聚类 图解 数据

k-means 算法
把相似的数据汇总为簇的方法叫作聚类。
k-means 算法是一种聚类算法,该算法非常简单,所以被广泛应用于数据分析。


概述
k-means 算法是一种有代表性的聚类算法。由于该算法简单易懂,又可以用于比较大的数据集,所以在市场分析和计算机视觉等领域得到了广泛的应用。
我们来看一下 k-means 算法是如何进行聚类的。例如,将 k-means 算法应用于人工数据集,并把各个数据点分为 3 个簇,如图 3-17 所示。图 3-17b 中的×表示的点是各个簇的重心,是 k-means 算法中簇的代表点。

▲图 3-17 对二维数据 (a) 应用 k-means 算法的结果 (b)


通过计算数据点与各重心的距离,找出离得最近的簇的重心,可以确定数据点所属的簇。求簇的重心是 k-means 算法中重要的计算。


算法说明
k-means 算法的典型计算步骤如下(图 3-18)。

  1. 从数据点中随机选择数量与簇的数量相同的数据点,作为这些簇的重心。
  2. 计算数据点与各重心之间的距离,并将最近的重心所在的簇作为该数据点所属的簇。
  3. 计算每个簇的数据点的平均值,并将其作为新的重心。
  4. 重复步骤 2 和步骤 3,继续计算,直到所有数据点不改变所属的簇,或者达到最大计算步数。


▲图 3-18 [插图] 算法的计算步骤


步骤 1 中的簇的数量是一个超参数,需要在训练时设置。对于有些数据集,我们可能很难决定要设置的簇的数量,在这种情况下,可以使用“详细说明”部分介绍的 Elbow 方法(肘方法)等技巧。
另外,有时选择的重心不好可能会导致步骤 2 和步骤 3 的训练无法顺利进行。比如在随机选择的重心之间太近等的情况下,就会出现这种问题。利用  等方法,选择位置尽可能远离的数据点作为重心的初始值,就可以解决这个问题。
示例代码
下面是对鸢尾花数据集应用 k-means 算法的代码,簇的数量设置为 3。
▼示例代码

from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
data = load_iris()
n_clusters = 3 # 将簇的数量设置为3
model = KMeans(n_clusters=n_clusters)
model.fit(data.data)
print(model.labels_) # 各数据点所属的簇
print(model.cluster_centers_) # 通过fit()计算的得到的重心

结果:

[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 2 2 0 2 2 2 2
 2 2 0 0 2 2 2 2 0 2 0 2 0 2 2 0 0 2 2 2 2 2 0 2 2 2 2 0 2 2 2 0 2 2 2 0 2
 2 0]

[[5.9016129  2.7483871  4.39354839 1.43387097]
 [5.006      3.428      1.462      0.246     ]
 [6.85       3.07368421 5.74210526 2.07105263]]

详细说明
聚类结果的评估方法
“算法说明”部分介绍了重心的更新方法。
下面介绍 k-means 算法的评估方法,即如何判断聚类结果是好是坏。图 3-19 所示为对同一个数据集多次应用 k-means 算法的结果。

▲图 3-19 对同一个数据集应用 k-means 算法的结果


图 3-19a 给人的印象是数据集划分得比较好,每个簇的区域清楚地分开了。不过从图形给人的印象来判断分析结果是一种定性的判断。另外,对于高维空间的数据,有可能难以进行可视化判断。因此,我们需要某种用于评估聚类结果是好是坏的定量的标准。
聚类结果的好坏可以通过计算簇内平方和(Within-Cluster Sum of Squares,WCSS)来定量评估(这个 WCSS 随着簇的数量的增加而变小,所以可以用于相同数量的簇的情况下的比较)。
WCSS 指的是对所有簇计算其所属的数据点与簇的重心之间距离的平方和,并将它们相加得到的值。这个值越小,说明聚类结果越好。
簇的重心与簇所属的数据点之间的距离越小,即数据点越在靠近簇的重心的地方集聚,WCSS 越小。
图 3-19a 的 WCSS 为 50.1,图 3-19b 的 WCSS 为 124.5,因此可以得出左图的聚类结果更好的结论。


使用 Elbow 方法确定簇的数量
在使用 k-means 算法时,首先要确定的就是簇的数量这个超参数,但有时我们并不知道应该将簇的值设置为多少合适。确定合理的簇的数量的一个方法是 Elbow 方法。我们已经知道,随着簇的数量增加,WCSS 会变小,但有时 WCSS 的变小幅度会从簇的数量为某个值时开始放缓。
在图 3-20 中,在簇的数量增加到 3 的过程中,WCSS 明显变小,但当簇的数量逐渐增加为 4、5……时,可以看到 WCSS 变小的幅度变缓了。Elbow 方法将图形中看起来像手臂弯曲时的肘部的点作为簇的数量。在这个例子中,我们将簇的数量设置为 3 似乎很合适。

▲图 3-20 基于 Elbow 方法确定簇的数量


当没有很明确的理由来确定簇的数量或对数据知之甚少时,Elbow 方法很有用。不过在实际的分析中,常常不会出现图中那样明显的“肘部”,所以 Elbow 方法的结果只不过是一种参考而已。

———————————————————————————————————————————

文章来源:书籍《图解机器学习算法》

作者:秋庭伸也 杉山阿圣 寺田学

出版社:人民邮电出版社

ISBN:9787115563569

本篇文章仅用于学习和研究目的,不会用于任何商业用途。引用书籍《图解机器学习算法》的内容旨在分享知识和启发思考,尊重原著作者秋庭伸也 杉山阿圣 寺田学的知识产权。如有侵权或者版权纠纷,请及时联系作者。
———————————————————————————————————————————

标签:14,重心,means,算法,WCSS,聚类,图解,数据
From: https://blog.csdn.net/jhghuhbb/article/details/139411333

相关文章

  • k-means聚类模型的原理和应用
            k-means聚类算法是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,然后随机选取K个对象作为初始的聚类中心;计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心;聚类中心以及分配给它们的对象就代表一个聚类;每分配一个样本,聚类......
  • k-means聚类模型的优缺点
    一、k-means聚类模型的优点        1.简单高效:k-means算法思想简单直观,易于实现。它通过迭代计算样本点与聚类中心之间的距离,并不断调整聚类中心的位置,直至满足终止条件。由于其计算过程相对直接,所以具有较高的执行效率。        2.空间划分明确:k-means算......
  • 代码随想录第4天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 0
    题目:24.两两交换链表中的节点思路:设置虚拟头结点,双指针+临时指针,(感觉也能递归,未尝试)时间复杂度:O(n)空间复杂度:O(1)坑:1.又忘了else{}和return2.试图访问空指针,多个条件的顺序问题及"&&""||"问题,cur->next要写在cur->next->next前面/***Definitionforsingly-linked......
  • 代码随想录算法训练营第四天 Leetcode 24 两两交换链表节点 Leetcode19 删除链表倒数
    链表问题首先要记住设置虚拟头节点Leetcode24两两交换链表节点题目链接思路:就是简单模拟两两交换 要注意链表节点的处理一定要获取到合适的位置比如:这一题中两个交换节点的前一个节点注意链表保存临时节点/***Definitionforsingly-linkedlist.*publicclas......
  • QQ音乐遭遇系统错误:msvcp140.dll丢失的全方位解决指南
    在享受QQ音乐带来的丰富曲库与个性化推荐时,偶尔会遇到让人头疼的技术难题,其中之一便是“msvcp140.dll丢失”的系统错误。这个看似复杂的错误信息实际上指向了一个相对简单的解决路径。本文将为您详细介绍这一问题的起因、影响以及一套行之有效的解决策略,帮助您迅速重回音乐的世......
  • 23201405-pta的总结blog-二
    前言本次作业blog主要对于答题判题程序4、家具强电电路模拟1-2进行分析说明和总结。这三次题目集的题目量和难度不必多说,题不在多,而在精。题目主要是为了提高能力,区分层次而出,难度不小。知识点主要有,抽象类、输入输出的处理,正则表达等。更重要的是分析题目,设计程序并实现的能......
  • Q14 LeetCode59 螺旋矩阵
    1.二维数组声明  int[][]ans=newint[n][n];2. left<=right&&top<=bottom 跳出循环条件 1classSolution{2publicint[][]generateMatrix(intn){3int[][]ans=newint[n][n];4intnum=1;5inttop=0,bottom=n-1,left......
  • 144. 二叉树的前序遍历
    /***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode*Right*TreeNode*}*/funcpreorderTraversal(root*TreeNode)[]int{returnpre2(root)//vals:=[]int{}//pre1(root,&val......
  • 【计算机毕业设计】ssm714实验室预约管理系统+vue
    身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径。为了满足人们随时随地只要有网络就可以看书的要求,实验室预约管理被开发......
  • 141. 环形链表
    /***Definitionforsingly-linkedlist.*typeListNodestruct{*Valint*Next*ListNode*}*/funchasCycle(head*ListNode)bool{listMap:=map[*ListNode]struct{}{}forhead!=nil{if_,ok:=listMap[head];ok{......