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

news/2024/5/20 6:03:07 标签: 机器学习, 人工智能, 聚类

一、说明

        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.niftyadmin.cn/n/5004636.html

相关文章

C语言入门 Day_14 for循环

前言 我们定义了一个数组以后,要使用(读取或者修改)数组元素的话,可以一个一个的读取,就前两课学的那样,代码类似这个结构。 int number_list[5]{1,2,3,4,5}; printf("%d\n",number_list[0]); …

我发现了,提升销售业绩的秘密武器!

客户管理 众所周知,要提高销售业绩,必须精准地分类顾客。要进行精准的客户分类就要对客户进行全面的了解,客户信息越精准,越有利于客户分类。这时,crm客户管理系统派上了用场,它不仅帮助销售人员全面理解顾…

软件工程的概念及其重要性

软件工程是指将工程原理和方法应用于软件开发过程的学科,涉及软件的设计、开发、测试、维护和管理等各个阶段。它旨在提高软件开发的效率和质量,并确保软件满足用户的需求和预期。 软件工程的重要性体现在以下几个方面: 提高开发效率&#x…

软件架构之前后端分离架构服务器端高并发演进之路

软件架构之前后端分离架构&服务器端高并发演进之路 前后端分离架构从业务角度从质量属性从性能角度 服务器端关于不同并发量的演进之路1. 单体架构2. 第一次演进:应用服务器和数据库服务器分开部署3. 第二次演进:引入本地缓存和分部署缓存4. 第三次演…

基于32位单片机的感应灯解决方案

感应灯是一种常见照明灯,提起感应灯,相信大家并不陌生, 它在一些公共场所、卫生间或者走廊等场所,使用的较为广泛,同时它使用起来也较为方便省电。“人来灯亮,人走灯灭”的特性,使他们在部分场景…

快讯|2023 年第四季度 Tubi 收益增长 47%

在每月一期的 Tubi 快讯中,你将全面及时地获取 Tubi 最新发展动态,欢迎 **星标关注**【比图科技】微信公众号,一起成长变强! 2023 年第四季度 Tubi 收益增长 47% 福克斯集团于 2023 年八月初公布了 2023 年第四季度财报&#xff…

Spring MVC 之MVC 体系结构、什么是SpringMVC

Spring MVC简介 MVC 体系结构三层架构MVC设计模式 Spring MVC 是什么?扩展知识Spring模块Data Access/Integration(数据访问/集成)Web(网络层)AOP(面向切面)Messaging(消息传送&…

智能时代的蜕变:人工智能发展历程

原创 | 文 BFT机器人 前沿 2022年底,一款名为ChatGPT的人工智能聊天应用引起了巨大轰动,迅速火遍互联网。与传统的聊天机器人不同,ChatGPT更像是一位能够理解人类的虚拟智能助手,它具备智能推断和学习的能力,能够与用…