【K 均值聚类】02/5:简介

news2024/11/25 4:46:24

一、说明

        k-mean算法是一种聚类算法,它的主要思想是基于数据点之间的距离进行聚类。K-means聚类是一种无监督的机器学习算法。让我们再解释一下这句话。聚类分析的目标是将数据划分为同类聚类。每个聚类中的点彼此之间比其他聚类中的点更相似。

        无监督机器学习是在没有任何标签的数据集上进行训练的。目标是发现数据中的模式或关系,而不是根据一组标记的示例进行预测。

集群

        K 均值算法以迭代方式将数据点分配给最近的聚类中心,并根据分配点的均值更新聚类中心。目标是最小化数据点与其最近的聚类中心之间的平方距离之和。

        K 是指定聚类数的超参数。

二、算法

        输入:K 和点 x1,x2,...,xn

        将质心放置在随机 c1,c2,...,ck 位置

        重复直到收敛

        -对于每个点 xi

  • 计算距离并找到最近的质心 cj,argmin D (xi,cj),即欧几里得。
  • 点 XI 标记为集群 CJ

        -对于每个簇 j = 1...K;

  • 质心 CJ 的新位置是其所有点 XI 的平均值。

        当集群的位置没有变化时结束它。

        复杂度:O (#iterations * #clusters * #instances * #dimensions)

        让我们可视化这些算法步骤,以便更好地理解。假设我们有如下所示的二维数据。我们还确定了 2 作为 K 个簇的数量。首先,让我们将 2 个质心放在随机位置。

随机质心。图片由作者提供。

        然后,我们计算每个点的欧几里得距离并分配标签。

分配标签。图片由作者提供。

计算每个聚类的新中心并将质心移动到新位置。

质心的新位置。图片由作者提供。

重复计算距离并分配标注。

New labels. Image by the author.

Carry the centroids.

携带质心。图片由作者提供。

我们无法再更改位置。这些是最后的集群。

最终状态。图片由作者提供。

三、算法积极的一面

  • 简单。易于理解和解释。
  • 多才多艺。K-Means 可用于广泛的聚类任务,包括图像分割、文本分类和市场细分。
  • 快。它通常提供快速解决方案(当然取决于数据集和问题定义)。

四、约束

  • 群集形状。它不适用于具有细长形状或不均匀形状的簇。
  • 初始条件。不同的初始条件可以产生不同的最终聚类
  • 异常。对异常值敏感。
  • 高维数据。对于更高维度的数据效率不高。

五、代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
np.random.seed(42)

# dataset
x1 = np.random.normal(0, 0.5, (50, 2))
x2 = np.random.normal(3, 0.5, (50, 2))
X = np.concatenate([x1, x2], axis=0)

# k-means
model = KMeans(n_clusters=2)
model.fit(X)
labels = model.predict(X)

# plot
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()

图片由作者提供。

如上所述,K-Means 不适用于不均匀的形状:

from sklearn.datasets import make_moons

# nonuniform shape
X, _ = make_moons(n_samples=200, noise=0.05, random_state=0)

model = KMeans(n_clusters=2)
model.fit(X)
labels = model.predict(X)

# plot
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()

Not a good result. Image by the author.

The parameters of the model of :KMeanssklearn

  • n_clusters是聚类数。这是最重要的参数。如果我们没有关于要使用的集群数量的先验信息,我们可以使用 elbow 方法(如下所述)。
  • init指定初始化质心的方法。默认方法是 ,它巧妙地选择初始质心以减少收敛所需的迭代量。另一个选项是 ,它随机初始化质心。 通常是首选。"k-means++""random""k-means++"
  • n_init指定使用不同质心种子运行算法的次数。最终结果将是惯性方面连续运行n_init的最佳输出。常见的选择是设置 .如果算法容易卡在局部最小值,则可以使用较高的值。n_init=10
  • max_iter是单次运行的最大迭代次数。300 是一个不错的选择。
  • tol是关于聚类内平方和变化的容差。如果聚类内平方和的变化小于此值,则算法将停止。常见的选择是设置 .tol=1e-04

重要属性:

  • cluster_centers_包含聚类中心。
  • labels_包含每个点的标签。
  • inertia_表示样本到其最近聚类中心的平方距离之和。

六、elbow 法

        如果我们没有关于如何选择聚类数量的先验信息,那么我们使用 elbow 方法。

        肘部方法背后的想法是在数据集上运行 K-Means 聚类,以获取不同的 k(聚类数)值,并测量点与其最近聚类中心之间的平方距离 (SSE) 之和。

        然后将 SSE 值与聚类数绘制,创建“弯头”形状。在 SSE 开始以较慢的速度减少时选择最佳聚类数。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# dataset with 5 clusters
X, _ = make_blobs(n_samples=500, centers=5, random_state=42)

生成的数据集。图片由作者提供。

# the Within-Cluster-Sum of Squared Error (WCSS) for different numbers of clusters
error = []
for i in range(1, 11):
    model = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    model.fit(X)
    error.append(model.inertia_)

# elbow plot
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
肘部情节。图片由作者提供。

        该图显示,WCSS 随着簇数量的增加而减小,并在 5 个簇时达到“肘部”。

# K-Means model with 5 clusters
model = KMeans(n_clusters=5, init='k-means++', max_iter=300, n_init=10, random_state=0)
result = model.fit_predict(X)

# Plot the clusters
plt.scatter(X[:,0], X[:,1], c=result)
plt.scatter(model.cluster_centers_[:, 0], model.cluster_centers_[:, 1], s=300, c='red')
plt.show()

        聚类。图片由作者提供。

        总之,K-Means聚类是一种广泛使用的无监督机器学习技术,可将相似的数据点分组到聚类中。奥坎·耶尼根

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

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

相关文章

k8s集群中集群方式安装nacos

1、前提条件 一个k8s集群,其中有三个master 节点,这三个节点的标签名称为etcd 三个master节点的ip 分别为:192.165.187.170 、192.165.187.171、192.165.187.172一个mysql 数据库, 数据库的ip 为:192.165.187.180 用户…

Java虚拟机整型数加载指令学习

JVM中 int 类型数值,根据 取值范围将 入栈的 字节码指令 就分为4类: 取值 -1~5 采用 iconst 指令; 取值 -128~127 采用 bipush 指令; 取值 -32768~32767 采用 sipush指令; 取值 -2147483648~2147483647 采用 ldc 指令。…

pyppeteer模块常用方法

目录 await page.方法 设置相关 setUserAgent(str) setCookie(cookie1, cookie2.......) 页面相关 goto(url) reload() goBack()/goForward() 执行js evaluate(js_str) 截图 screenshot(dict) 保存pdf pdf(dict) 获取内容 content() co…

Fragment的创建分析

之前的文章讨论了Fragment的销毁流程,初始状态为resume,然后经历pause -> stop -> destroyView -> destroy -> detach这么几个流程(本篇文章基于Support27.1.1来分析的)。清楚了Fragment的销毁,那也来看看…

《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3架构升级

架构升级 GPU 支持 早在 Milvus 1.x 版本,我们就曾经支持过 GPU,但在 2.x 版本中由于切换成了分布式架构,同时出于对于成本方面的考虑,暂时未加入 GPU 支持。在 Milvus 2.0 发布后的一年多时间里,Milvus 社区对 GPU 的呼声越来越高,再加上 NVIDIA 工程师的大力配合——为…

CTFHUB ICS(1)

1.异常的工程文件 把文件拖到kali里面去了 unzip 文件名解压文件 文件很多,我们先进到解压的文件夹里面 strings $(find . | xargs) | grep flag linux命令的作用是在当前目录及子目录下递归查找文件,提取文件中的字符串,然后用grep过滤 find . - 在当前目录及递…

cadence virtuoso bandgap温漂公式

先仿真温漂,然后将曲线send to calculate。 调用ymax,ymin,average函数。

PGInfo核心字段详解

PGInfo存在于PG的整个生命周期中,其在对象数据的写入、数据恢复、PG Peering过程中均发挥重要的作用。本章试图研究pg info在整个PG生命周期中的变化过程,从而对PG及PGInfo有一个更深入的理解。 class PG : DoutPrefixProvider { public:// pg statepg_…

Unable to remove Temporary User Data

错误截图 原因 项目的临时数据目录是存在了未授权的盘符,当删除它的时候,遇到了权限问题,没有权限没法删除。 解决方法 增加字段:userDataDir 解决

WSL使用技巧 / 虚拟机对比

WSL使用技巧 / 虚拟机对比 前言虚拟机比较VMware使用技巧WSL使用技巧官方文档工具安装WSL基本命令运行命令关闭卸载磁盘管理导入导出指定安装路径 前言 本文介绍了VMware和WSL的区别,并详细介绍了WSL的使用方法和技巧。 虚拟机比较 VMware 比较灵活,拥…

高压放大器该如何选择(高压放大器选型要求有哪些)

选择适合的高压放大器对于电子设备和实验中的特定应用非常重要。高压放大器通常用于放大高电压信号,如激光驱动、粒子加速器、电力系统和医学成像等领域。在选择高压放大器时,以下几个因素值得考虑。 首先,您需要确定所需的输出电压范围。不同…

Date.toLocaleString()不同系统语言之会返回不同的format(可能导致我查的出来数据别人查不出来)

最近发生了个Bug,访问部署在服务器上的服务,我选了时间之后查的出来数据,别人就不行,同样的条件,同样的时区。百思不得解。 直到看了 request里面的参数,发现怎么format不一致,都是访问的服务器部署的服务。…

Linux下的系统编程——进程的执行与回收(八)

前言: 前面我们对进程已经有了一个初步的了解与认识,现在让我们学习一下进程中一些函数的具体使用,比如exec可以执行一些指定的程序,wait / waitpid可以回收子进程,什么是孤儿进程,什么是僵尸进程&#xf…

性能测试实现天罗地网对各个中间件实现监控

名师出高徒,我亲自带你出征,直捣黄龙。高手都是顶峰相见!将军有剑 不斩苍蝇,将军赶路,不追小兔。赶紧上车 带你入行就是高手。

【ccf-csp题解】第1次csp认证-第三题-命令行选项-题解

题目描述 思路讲解 本题是一个简单的字符串模拟题,这种题目是csp认证第三题的常客 大致思路是用两个bool数组记录某一个选项(0--25下标对应小写字母a--z),第一个数组中无参选项为true,第二个数组中有参选项为true&a…

【算法系列篇】分治-归并

文章目录 前言什么是归并算法1. 排序数组1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 数组中逆序对2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 计算右侧小于当前元素的个数3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 翻转对4.1 题目要求4.2 做题思路4.3 Java代码实现 总…

金融信创,软件规划需关注自主安全及生态建设

软件信创化,就是信息技术软件应用创新发展的意思(简称为“信创”)。 相信在中国,企业对于“信创化”这个概念并不陌生。「国强则民强」,今年来中国经济的快速发展,受到了各大欧美强国的“卡脖子”操作的影…

CNN(七):ResNeXt-50算法的思考

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊|接辅导、项目定制 在进行ResNeXt-50实战练习时,我也跟其他学员一样有这个疑惑,如下图所示: 反复查看代码,仍然有…

探讨前后端分离开发的优势、实践以及如何实现更好的用户体验?

随着互联网技术的迅猛发展,前后端分离开发已经成为现代软件开发的一种重要趋势。这种开发模式将前端和后端的开发工作分开,通过清晰的接口协议进行通信,旨在优化开发流程、提升团队协作效率,并最终改善用户体验。本文将深入探讨前…

Elasticsearch——Docker单机部署安装

文章目录 1 简介2 Docker安装与配置2.1 安装Docker2.2 配置Docker镜像加速器2.3 调整Docker资源限制 3 准备Elasticsearch Docker镜像3.1 下载Elasticsearch镜像3.2 自定义镜像配置3.3执行Docker Compose 4 运行Elasticsearch容器4.1 创建Elasticsearch容器4.2 修改配置文件4.3…