前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从零开始的K均值聚类

从零开始的K均值聚类

作者头像
磐创AI
发布于 2024-03-22 04:34:21
发布于 2024-03-22 04:34:21
16900
代码可运行
举报
运行总次数:0
代码可运行
动机

机器学习的主要思想是创建一个可以根据先前数据提供合理决策而无需显式编程的广义模型。机器学习问题可以是监督或无监督的。本文关注的是一种无监督机器学习算法,称为“K均值”聚类。

当谈到无监督机器学习时,我通常在进行机器学习课程时向我的学生提供一个示例。

假设你被给予一些玩具,如鸭子、蛇、牛、鸽子、山羊、母鸡、船、鳄鱼等。不幸的是,你不知道这些玩具的名称。如果有人要求你将这些动物分成不同的群组,你会怎么做?

如果你进行合理思考,基于它们的外观可能的群组将是群组1:鸭子、母鸡、鸽子;群组2:山羊、牛、船;群组3:鳄鱼、蛇。尽管确切的名称是未知的,但你可能会将这些动物分组。因此,基于相似特征的聚类被称为无监督机器学习算法。

对于基于相似性的数据分组,无监督机器学习非常适用。

无监督学习概述

无监督学习,也被称为无监督机器学习,使用机器学习算法来分析和聚类未标记的数据集。这些算法可以发现隐藏的模式或数据分组,无需人类干预[1]。

假设你是一名硕士研究生,有一个论文导师。你的导师会指导你完成论文,因为他知道如何进行研究和最终目标。监督机器学习算法以相同的方式工作。每个输入都有一个目标值,算法试图从标记的数据中优化其参数以预测一个新实例。无监督学习方法与监督学习正好相反。这些方法处理未标记的数据。无监督学习的主要目的是找出潜在的隐藏模式和见解[2]。通常,这些算法用于解决聚类问题。

无监督机器学习算法有两种类型,如下所示 —

作者提到的文章只关注聚类算法(K均值)。聚类意味着将具有相似特征的数据点分组。有时,无监督学习算法的作用非常重要。

一些优点已经被提出[2] —

  • 无监督学习有助于从数据中找到有价值的见解。
  • 无监督学习与人类非常相似。我们通过自己的经验学会思考,这使得它更接近真正的人工智能
  • 无监督学习适用于未标记和未分类的数据,这使得无监督学习更为重要。
  • 在现实世界中,我们并不总是有具有相应输出的输入数据,因此需要无监督学习来解决这种情况。

K均值的坐标距离计算

  • 欧几里得距离

欧几里得距离是计算两个坐标点之间距离的最常用方法。它计算了一对对象的坐标之间的差的平方的平方根[4]。它是两个数据点之间的直线距离。

欧几里得距离可以用以下方程来衡量。这个公式用x和y表示两个点。K是维度的数量(在数据科学中,每个数据集的特征被视为一个维度)。

  • 曼哈顿距离

曼哈顿距离计算一对对象的坐标之间的绝对差异[4]。

曼哈顿距离是坐标的绝对距离的总和。可以描述如下。

这里,x和y是两个坐标点,“k”是维度/特征的数量。

  • 切比雪夫距离

切比雪夫距离也称为最大值距离,它计算了一对对象的坐标之间的差的绝对值的大小[4]。它是最大坐标值。

x和y代表两个坐标点。它们的切比雪夫距离可以通过在坐标之间找到最大距离来计算。k表示特征的数量。

假设我们有两个点,x(1, 3) 和 y(5,10)。x坐标值是 |1–5| = 4,y坐标值是 |3–10| = 7。因此,max (4, 7) 等于 7。这意味着切比雪夫距离为7。

  • 闵可夫斯基距离

闵可夫斯基距离是一种统一的距离公式。使用这个距离公式,我们可以通过改变一个参数来获得上面的所有距离。

距离可以用以下公式计算。两点之间的距离,x和y,k是特征的数量。P是一个唯一的参数,它可以转换方程以计算不同的距离。

请注意,当p=2时,距离变为欧几里得距离。当p=1时,它变成了曼哈顿距离。切比雪夫距离是闵可夫斯基距离的一种变体,其中p=∞(取极限)[4]。

[为了描述这些距离,研究论文[4]和文章[5]对我帮助很大。]

研究结果表明,欧几里得距离是计算K均值聚类算法中数据点之间距离的最佳方法。

K均值聚类算法概述

K均值聚类是一种流行的无监督聚类机器学习算法之一。让我们解释一下它是如何工作的。

步骤1:在最开始,我们需要选择K的值。K表示你想要的聚类数。

步骤2:随机选择每个聚类的质心。

假设对于上面的数据点,我们想创建3个聚类。所以,K=3,而方形着色的数据点是3个随机选择的质心。

步骤3:计算数据点到质心的距离,并根据最小距离将数据点分配到聚类。

从上图中,我们可以清楚地看到每个质心分配了一些数据点,根据不同的颜色表示最小距离。

步骤4:计算每个聚类的均值,并将新的质心重新居中到均值位置。

图像描述了将质心居中到根据均值计算的新位置。

步骤5:重复步骤3和步骤4,直到质心收敛。

重复步骤3和步骤4后,我们得到了上面的聚类。对于下一次迭代,我们得到了以下的聚类。

下一次迭代怎么样?让我们看看。

最后两个聚类和质心是相同的。我们可以说质心收敛,达到了我们的最终目标。

K均值的最佳聚类数
对于K均值聚类算法来说,选择最佳聚类数是一个重要问题。如果你不知道最佳聚类数,你应该应用“肘部法”来找出它。为了保持文章的精确和适度,我将简要解释这种方法。

应用“肘部法”后,我们会得到上面图像中显示的一条折线图。从图中,我们需要找出肘部点以及相应的聚类数。它将被视为最佳的聚类数。对于上图,最佳的聚类数是4。肘部法的详细解释可以在这里找到。

为什么选择K均值?

K均值是最流行的聚类算法。它是一种简单的聚类算法,在大型数据集上表现良好。相对而言,它比其他聚类算法更快。它始终保证收敛到最终的聚类,并且很容易适应新的数据点[3]。

K均值的挑战

在前面的部分中,我们看到K均值聚类算法中初始聚类质心是随机分配的,导致了随机迭代和执行时间。因此,在算法中选择初始质心点是一个关键问题。你可以阅读下面的文章,它介绍了一种系统选择初始质心的技术。

https://towardsdatascience.com/efficient-k-means-clustering-algorithm-with-optimum-iteration-and-execution-time-9358a794406c

该算法对于复杂分布的数据效果不佳。

逐步操作实现

本节将展示从零开始实现K均值聚类算法的逐步操作。对于任何机器学习模型,我们首先需要加载数据集。为了演示目的,我使用了mall_customer数据集。这是一个流行的数据集。

[注意:我使用的是mall_customer数据集,这是一个在“CC0:公有领域”许可下的公开数据集。]

  • 导入必要的库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns
  • 加载数据集和一些预处理
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df=pd.read_csv('/work/Mall_Customers.csv')
df.head()

数据集的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.info()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Gender                  200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

客户ID和性别不是那么重要,所以我已经丢弃了这些列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df_new=df[['Age', 'Annual Income (k$)','Spending Score (1-100)']]

将数据框转换成NumPy数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
values_of_data=df_new.values

提取列和行数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
no_of_row=values_of_data.shape[0] 
no_of_column=values_of_data.shape[1] 
  • 选择聚类数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
K=3 # number of clusters
  • 随机选择质心

定义特征大小的空数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
C=np.array([]).reshape(no_of_column,0) 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
C.shape
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(3, 0)

随机选择3个质心用于3个聚类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import random as rd
for i in range(K):
    random=rd.randint(0,no_of_row-1)
    C=np.c_[C,values_of_data[random]]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(C)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[33. 27. 21.]
 [42. 46. 30.]
 [60. 51. 73.]]
  • 下面的代码实现了K均值聚类概述部分中提到的步骤3、步骤4和步骤5。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dif=1

while(dif>0):
    C1=C.copy() #Cloning the centroids

    #creating empty array for holding the distances from the centroids 
    E=np.array([]).reshape(no_of_row,0)

    for k in range(K):
        #distance calculation from centroids using euclidean formula. 
        temp=(df_new - np.array(C[:,k])).pow(2).sum(1).pow(0.5)
        E=np.c_[E,temp]

    #assigning cluster elements based on minimum distance
    cluster_index=np.argmin(E,axis=1)+1

    #Generating clusters 
    cluster={}
    for clus in range(K):
        cluster[clus+1]=np.array([]).reshape(3,0)
    for i in range(no_of_row):
        cluster[cluster_index[i]]=np.c_[cluster[cluster_index[i]],values_of_data[i]]

    for clus in range(K):
        cluster[clus+1]=cluster[clus+1].T

    #mean calculation and recentering the centroids 
    for clus in range(K):
        C[:,clus]=np.mean(cluster[clus+1],axis=0)

    ''' Comparing centroids and checking whether the centroids are changing or not. 
    If it doesn't change, the program will terminate.'''

    if (C1==C).all():
        break

我在上面的代码中添加了一些命令,以便更容易理解功能。

  • 可视化聚类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Import libraries
from mpl_toolkits import mplot3d
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure(figsize = (10, 7))
ax = plt.axes(projection ="3d")

clr=['#F3174F', '#258474', '#FF220C']

# Creating plot
for i in range(K):
    ax.scatter3D(cluster[i+1][:,0],cluster[i+1][:,1], cluster[i+1][:,2],s=120, color =clr[i])



plt.title("Cluster 3D scatter plot")


# show plot
plt.show()

在3D空间中,每个聚类用不同的颜色表示。

结论

K均值聚类算法简单易用。在实施算法之前,我们需要谨慎考虑算法的用例和底层工作原理。对于非常复杂的分布数据,该算法效果不佳。

参考资料

  1. What is Unsupervised Learning? | IBM
  2. https://www.javatpoint.com/unsupervised-machine-learning
  3. k-Means Advantages and Disadvantages | Machine Learning | Google Developers
  4. Singh, A., Yadav, A., & Rana, A. (2013). K-means with three different distance metrics. International Journal of Computer Applications, 67(10).
  5. https://towardsdatascience.com/9-distance-measures-in-data-science-918109d069fa
  6. Zubair, M., Iqbal, M.A., Shil, A. et al. An Improved K-means Clustering Algorithm Towards an Efficient Data-Driven Modeling. Ann. Data. Sci. (2022). https://doi.org/10.1007/s40745-022-00428-2
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【机器学习】——K均值聚类:揭开数据背后的隐藏结构
在现代数据分析中,我们往往会遇到大量没有标签的数据。如何从这些数据中挖掘出有意义的结构和模式呢?这时,聚类分析就显得尤为重要。
用户11286421
2025/01/17
1910
K-means算法及python实现
        K-means(Thek-meansalgorithm)是机器学习十大经典算法之一,同时也是最为经典的无监督聚类(Unsupervised Clustering)算法。接触聚类算法,首先需要了解k-means算法的实现原理和步骤。本文将对k-means算法的基本原理和实现实例进行分析。
Flaneur
2020/03/25
5K0
一文读懂K均值(K-Means)聚类算法
大数据文摘授权转载自数据派THU作者:王佳鑫 审校:陈之炎 概述 众所周知,机器学习算法可分为监督学习(Supervised learning)和无监督学习(Unsupervised learning)。 监督学习常用于分类和预测。是让计算机去学习已经创建好的分类模型,使分类(预测)结果更好的接近所给目标值,从而对未来数据进行更好的分类和预测。因此,数据集中的所有变量被分为特征和目标,对应模型的输入和输出;数据集被分为训练集和测试集,分别用于训练模型和模型测试与评估。常见的监督学习算法有Regression
大数据文摘
2023/04/10
1.4K0
一文读懂K均值(K-Means)聚类算法
【机器学习】无监督学习麾下 K-means 聚类如何智能划分,解锁隐藏结构,为市场细分、图像分割、基因聚类精准导航
无监督学习是机器学习中的一类重要任务,聚类算法是其中的一种经典方法。与监督学习相比,无监督学习没有明确的标签,模型仅通过输入数据来发现数据的潜在结构和模式。聚类算法的核心目标是将数据集中的对象根据其特征进行划分,使得同一组中的对象具有高度的相似性,而不同组之间的对象差异较大。
逆向-落叶
2025/01/12
3780
【机器学习】无监督学习麾下 K-means 聚类如何智能划分,解锁隐藏结构,为市场细分、图像分割、基因聚类精准导航
原创 | 一文读懂K均值(K-Means)聚类算法
众所周知,机器学习算法可分为监督学习(Supervised learning)和无监督学习(Unsupervised learning)。
数据派THU
2022/12/16
10.6K0
原创 | 一文读懂K均值(K-Means)聚类算法
图解K-Means算法
K-Means算法在无监督学习,尤其是聚类算法中是最为基础和重要的一个算法。它实现起来非常简单。聚类效果也很不错的,因此应用非常广泛。
皮大大
2020/12/17
6.2K0
图解K-Means算法
【机器学习】算法原理详细推导与实现(六):k-means算法
之前几个章节都是介绍有监督学习,这个章节介绍无监督学习,这是一个被称为k-means的聚类算法,也叫做k均值聚类算法。
机器学习和大数据挖掘
2020/02/25
1.3K0
【机器学习】算法原理详细推导与实现(六):k-means算法
【机器学习-无监督学习】聚类
  本文开始我们讲解无监督学习算法。在之前的文章中,我们给模型的任务通常是找到样本
Francek Chen
2025/01/22
2000
【机器学习-无监督学习】聚类
算法入门(九)—— 无监督学习介绍与K-Means实战(内附Kaggle实战源码与数据集)
监督学习到这里就算是结束了,接下来我们一起来看你一下无监督学习,无监督学习是机器学习中的一个重要分支,但它看起来有点“神秘”——你会发现,数据集里并没有告诉你哪个是对的答案,也没有提供标签告诉你什么是正解。那么,问题来了:我们到底在做什么呢?别急,今天就带你一起揭开这个“神秘面纱”。
万事可爱^
2025/01/23
1600
算法入门(九)—— 无监督学习介绍与K-Means实战(内附Kaggle实战源码与数据集)
吴恩达笔记8-KMeans
本周的主要知识点是无监督学习中的两个重点:聚类和降维。本文中首先介绍的是聚类中的K均值算法,包含:
皮大大
2021/03/02
8130
机器学习笔记之聚类算法K-Means
聚类算法是典型的无监督学习,其训练的样本中值包含样本的特征,不包含样本的标签信息。在聚类算法中。利用样本的特征,将具有相似属性的样本划分到统一类别中,它有点像全自动分类。
Jetpropelledsnake21
2021/04/01
8750
机器学习笔记之聚类算法K-Means
【Python】机器学习之聚类算法
这些聚类算法在不同场景和数据特性下有各自的优势和局限性,选择合适的算法取决于问题的性质和对结果的需求。聚类在图像分割、客户细分、异常检测等领域都有广泛的应用。
SarPro
2024/02/20
3050
【Python】机器学习之聚类算法
spssk均值聚类报告_K均值聚类
机器学习中的k均值聚类属于无监督学习,所谓k指的是簇类的个数,也即均值向量的个数。算法初始状态下,要根据我们设定的k随机生成k个中心向量,随机生成中心向量的方法既可以随机从样本中抽取k个样本作为中心向量,也可以将中心向量固定在样本的维度范围之内,避免中心向量过偏远离大多数样本点。然后每个样本点需要与k个中心向量分别计算欧氏距离,取欧氏距离最小的中心向量作为该样本点的簇类中心,当第一轮迭代完成之后,中心向量需要更新,更新的方法是每个中心向量取前一次迭代所得到各自簇类样本点的均值,故称之为均值向量。迭代终止的条件是,所有样本点的簇类中心都不在发生变化。 在spss中导入的二维数据如下所示:
全栈程序员站长
2022/11/17
9380
spssk均值聚类报告_K均值聚类
无监督学习:从理论到实践的全面指南
无监督学习(Unsupervised Learning)是一类机器学习任务,其中算法在没有标签的情况下,从未标记的数据中学习模式和结构。与有监督学习不同,无监督学习不依赖于预定义的输出,而是从数据本身提取信息,用于发现数据的内在规律和特征。
TechLead
2024/06/21
1.1K0
无监督学习:从理论到实践的全面指南
[吴恩达机器学习笔记]13聚类K-means
K-均值算法也可以很便利地用于将数据分为许多不同组,即使在没有非常明显区分的组群的情况下也可以。下图所示的数据集包含身高和体重两项特征构成的,利用 K-均值算法将数据分为三类,用于帮助确定将要生产的 T-恤衫的三种尺寸。
演化计算与人工智能
2020/08/14
8930
[吴恩达机器学习笔记]13聚类K-means
K-Means(K均值)、GMM(高斯混合模型),通俗易懂,先收藏了!
什么是聚类算法?聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。
mantch
2019/07/30
6.6K0
K-Means(K均值)、GMM(高斯混合模型),通俗易懂,先收藏了!
从零开始学机器学习——了解聚类
文章链接:https://cloud.tencent.com/developer/article/2465816
努力的小雨
2024/11/16
1540
Python数据分析笔记:聚类算法之K均值
我们之前接触的所有机器学习算法都有一个共同特点,那就是分类器会接受2个向量:一个是训练样本的特征向量X,一个是样本实际所属的类型向量Y。由于训练数据必须指定其真实分类结果,因此这种机器学习统称为有监督学习。 然而有时候,我们只有训练样本的特征,而对其类型一无所知。这种情况,我们只能让算法尝试在训练数据中寻找其内部的结构,试图将其类别挖掘出来。这种方式叫做无监督学习。由于这种方式通常是将样本中相似的样本聚集在一起,所以又叫聚类算法。 下面我们介绍一个最常用的聚类算法:K均值聚类算法(K-Means)。 1、K
机器学习AI算法工程
2018/03/13
1.1K0
Python数据分析笔记:聚类算法之K均值
机器学习笔记之K-means聚类
其定义为对未知标记的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据尽可能接近,类别间的数据相似度比较大。用于衡量距离的方法主要有曼哈顿距离、欧氏距离、切比雪夫距离,其中欧氏距离较为常用。
数据小磨坊
2018/07/25
8200
机器学习笔记之K-means聚类
K-means
对于”监督学习”(supervised learning),其训练样本是带有标记信息的,并且监督学习的目的是:对带有标记的数据集进行模型学习,从而便于对新的样本进行分类。而在“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。对于无监督学习,应用最广的便是”聚类”(clustering)。
AngelNH
2020/04/15
7430
K-means
推荐阅读
相关推荐
【机器学习】——K均值聚类:揭开数据背后的隐藏结构
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验