iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >全面解析Kmeans聚类算法(Python)
  • 655
分享到

全面解析Kmeans聚类算法(Python)

python聚类算法聚类无监督学习机器学习算法 2023-09-06 07:09:54 655人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

Clustering (聚类) 是常见的unsupervised learning (无监督学习)方法,简单地说就是把相似的数据样本分到一组(簇),聚类的过程. 我们并不清楚某一类是什么(通常无标签信

Clustering (聚类) 是常见的unsupervised learning (无监督学习)方法,简单地说就是把相似的数据样本分到一组(簇),聚类的过程.

我们并不清楚某一类是什么(通常无标签信息),需要实现的目标只是把相似的样本聚到一起,即只是利用样本数据本身的分布规律。

在本文中,我将详细介绍聚类算法喜欢本文记得收藏、关注、点赞。

【注】完整版代码、数据、技术交流文末提供。

聚类算法可以大致分为传统聚类算法及深度聚类算法

  • 传统聚类算法主要是根据原特征+基于划分/密度/层次等方法。
    图片

  • 深度聚类方法主要是根据表征学习后的特征+传统聚类算法。图片

kmeans聚类原理

kmeans聚类可以说是聚类算法中最为常见的,它是基于划分方法聚类的,原理是先初始化k个簇类中心,基于计算样本与中心点的距离归纳各簇类下的所属样本,迭代实现样本与其归属的簇类中心的距离为最小的目标(如下目标函数)。图片

优化算法步骤为:

随机选择 k 个样本作为初始簇类中心(k为超参,代表簇类的个数。可以凭先验知识、验证法确定取值);

针对数据集中每个样本 计算它到 k 个簇类中心的距离,并将其归属到距离最小的簇类中心所对应的类中;

针对每个簇类,重新计算它的簇类中心位置;

重复迭代上面 2 、3 两步操作,直到达到某个中止条件(如迭代次数,簇类中心位置不变等)。

图片

.... #kmeans算法是初始化随机k个中心点random.seed(1)center = [[self.data[i][r] for i in range(1, len((self.data)))]                        for r in random.sample(range(len(self.data)), k)]#最大迭代次数itersfor i in range(self.iters):    class_dict = self.count_distance() #计算距离,比较个样本到各个中心的的出最小值,并划分到相应的类    self.locate_center(class_dict) # 重新计算中心点    #print(self.data_dict)    print("----------------迭代%d次----------------"%i)    print(self.center_dict)  #聚类结果{k:{{center:[]},{distance:{item:0.0},{classify:[]}}}}    if sorted(self.center) == sorted(self.new_center):        break    else:        self.center = self.new_center

可见,Kmeans 聚类的迭代算法实际上是 EM 算法,EM 算法解决的是在概率模型中含有无法观测的隐含变量情况下的参数估计问题。

在 Kmeans 中的隐变量是每个类别所属类别。Kmeans 算法迭代步骤中的 每次确认中心点以后重新进行标记 对应 EM 算法中的 E 步 求当前参数条件下的 Expectation 。而 根据标记重新求中心点 对应 EM 算法中的 M 步 求似然函数最大化时(损失函数最小时)对应的参数 。EM 算法的缺点是容易陷入局部极小值,这也是 Kmeans 有时会得到局部最优解的原因。

选择距离度量

kmeans 算法是基于距离相似度计算的,以确定各样本所属的最近中心点,常用距离度量有曼哈顿距离和欧式距离

  • 曼哈顿距离 公式:

图片

  • 欧几里得距离 公式:

图片曼哈顿、欧几里得距离的计算方法很简单,就是计算两样本(x,y)的各个特征i间的总距离。如下图(二维特征的情况)蓝线的距离即是曼哈顿距离(想象你在曼哈顿要从一个十字路口开车到另外一个十字路口实际驾驶距离就是这个“曼哈顿距离”,也称为城市街区距离),红线为欧几里得距离:

图片

四、k 值的确定

kmeans划分k个簇,不同k的情况,算法的效果可能差异就很大。K值的确定常用:先验法、手肘法等方法。

  • 先验法

先验比较简单,就是凭借着业务知识确定k的取值。比如对于iris花数据集,我们大概知道有三种类别,可以按照k=3做聚类验证。从下图可看出,对比聚类预测与实际的iris种类是比较一致的。图片图片

  • 手肘法

可以知道k值越大,划分的簇群越多,对应的各个点到簇中心的距离的平方的和(类内距离,WSS)越低,我们通过确定WSS随着K的增加而减少的曲线拐点,作为K的取值。图片

手肘法的缺点在于需要人为判断不够自动化,还有些其他方法如:

  • 使用 Gap statistic 方法,确定k值。

  • 验证不同K值的平均轮廓系数,越趋近1聚类效果越好。

  • 验证不同K值的类内距离/类间距离,值越小越好。

  • ISODATA算法:它是在k-均值算法的基础上,增加对聚类结果的“合并”和“分裂”两个操作,确定最终的聚类结果。从而不用人为指定k值。

五、Kmeans的缺陷

5.1 初始化中心点的问题

kmeans是采用随机初始化中心点,而不同初始化的中心点对于算法结果的影响比较大。所以,针对这点更新出了Kmeans++算法,其初始化的思路是:各个簇类中心应该互相离得越远越好。基于各点到已有中心点的距离分量,依次随机选取到k个元素作为中心点。离已确定的簇中心点的距离越远,越有可能(可能性正比与距离的平方)被选择作为另一个簇的中心点。如下代码。

# Kmeans ++ 算法基于距离概率选择k个中心点            # 1.随机选择一个点            center = []            center.append(random.choice(range(len(self.data[0]))))            # 2.根据距离的概率选择其他中心点            for i in range(self.k - 1):                weights = [self.distance_closest(self.data[0][x], center)                          for x in range(len(self.data[0])) if x not in center]                dp = [x for x in range(len(self.data[0])) if x not in center]                total = sum(weights)                #基于距离设定权重                weights = [weight/total for weight in weights]                num = random.random()                x = -1                i = 0                while i < num :                    x += 1                    i += weights[x]                center.append(dp[x])            center = [self.data_dict[self.data[0][center[k]]] for k in range(len(center))]

5.2 核Kmeans

基于欧式距离的 Kmeans 假设了了各个数据簇的数据具有一样的的先验概率并呈现球形分布,但这种分布在实际生活中并不常见。面对非凸的数据分布形状时我们可以引入核函数来优化,这时算法又称为核 Kmeans 算法,是核聚类方法的一种。核聚类方法的主要思想是通过一个非线性映射,将输入空间中的数据点映射到高位的特征空间中,并在新的特征空间中进行聚类。非线性映射增加了数据点线性可分的概率,从而在经典的聚类算法失效的情况下,通过引入核函数可以达到更为准确的聚类结果。

5.3 特征类型

kmeans是面向数值型的特征,对于类别特征需要进行onehot或其他编码方法。此外还有 K-Modes 、K-Prototypes 算法可以用于混合类型数据的聚类,对于数值特征簇类中心我们取得是各特征均值,而类别型特征中心取得是众数,计算距离采用海明距离,一致为0否则为1。

5.4 特征的权重

聚类是基于特征间距离计算,计算距离时,需要关注到特征量纲差异问题,量纲越大意味这个特征权重越大。假设各样本有年龄、工资两个特征变量,如计算欧氏距离的时候,(年龄1-年龄2)² 的值要远小于(工资1-工资2)² ,这意味着在不使用特征缩放的情况下,距离会被工资变量(大的数值)主导。因此,我们需要使用特征缩放来将全部的数值统一到一个量级上来解决此问题。通常的解决方法可以对数据进行“标准化”或“归一化”,对所有数值特征统一到标准的范围如0~1。图片

归一化后的特征是统一权重,有时我们需要针对不同特征赋予更大的权重。假设我们希望feature1的权重为1,feature2的权重为2,则进行0~1归一化之后,在进行类似欧几里得距离(未开根号)计算的时候,图片我们将feature2的值乘根号2就可以了,这样feature2对应的上式的计算结果会增大2倍,从而简单快速的实现权重的赋权。如果使用的是曼哈顿距离,特征直接乘以2 权重也就是2 。

如果类别特征进行embedding之后的特征加权,比如embedding为256维,则我们对embedding的结果进行0~1归一化之后,每个embedding维度都乘以 根号1/256,从而将这个类别全部的距离计算贡献规约为1,避免embedding size太大使得kmeans的聚类结果非常依赖于embedding这个本质上是单一类别维度的特征。

5.5 特征的选择

kmeans本质上只是根据样本特征间的距离(样本分布)确定所属的簇类。而不同特征的情况,就会明显影响聚类的结果。当使用没有代表性的特征时,结果可能就和预期大相径庭!比如,想对银行客户质量进行聚类分级:交易次数、存款额度就是重要的特征,而如客户性别、年龄情况可能就是噪音,使用了性别、年龄特征得到的是性别、年龄相仿的客户!

对于无监督聚类的特征选择:

  • 一方面可以结合业务含义,选择贴近业务场景的特征。

  • 另一方面,可以结合缺失率、相似度、PCA等常用的特征选择(降维)方法可以去除噪音、减少计算量以及避免维度爆炸。再者,如果任务有标签信息,结合特征对标签的特征重要性也是种方法(如xgboost的特征重要性,特征的IV值。)

  • 最后,也可以通过神经网络的特征表示(也就深度聚类的思想。后面在做专题介绍),如可以使用Word2vec,将高维的词向量空间以低维的分布式向量表示。

推荐文章

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

在这里插入图片描述

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

长按关注

来源地址:https://blog.csdn.net/weixin_38037405/article/details/124315032

--结束END--

本文标题: 全面解析Kmeans聚类算法(Python)

本文链接: https://www.lsjlt.com/news/396612.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 全面解析Kmeans聚类算法(Python)
    Clustering (聚类) 是常见的unsupervised learning (无监督学习)方法,简单地说就是把相似的数据样本分到一组(簇),聚类的过程. 我们并不清楚某一类是什么(通常无标签信...
    99+
    2023-09-06
    python 聚类算法 聚类 无监督学习 机器学习算法
  • Python——Kmeans聚类算法、轮廓系数(算法理论、代码)
    目录 1 Kmeans模型理论 1.1 K-均值算法(K-means)算法概述 1.2 距离度量 1.3 K-means算法流程 1.4 K值的选择 1.5 K-means的优点 1.6 K-means的缺点 1.7 聚类的评价指标 2 ...
    99+
    2023-09-10
    python 聚类 kmeans 机器学习 数据分析
  • 如何利用python的KMeans和PCA包实现聚类算法
    如何利用python的KMeans和PCA包实现聚类算法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。题目: 通过给出的驾驶员行为数据(trip.csv),对驾...
    99+
    2023-06-02
  • Python 数据化运营之KMeans聚类分析总结
    目录Python 数据化运营1、内容介绍2、一般应用场景3、聚类的常见方法4、Keans聚类实现 5、聚类的评估指标6、聚类效果可视化7、数据预测Python 数据化运营 1、内容介...
    99+
    2024-04-02
  • R语言实现KMeans聚类算法实例教程
    目录什么是k-means聚类算法R 实现kmeans聚类算法加载包加载示例数据寻找最佳聚类数量使用最优k执行kmeans聚类kmeans 算法的优缺点总结本文和你一起学习无监督机器学...
    99+
    2024-04-02
  • 分析总结Python数据化运营KMeans聚类
    内容介绍 以 Python 使用 Keans 进行聚类分析的简单举例应用介绍聚类分析。 聚类分析 或 聚类 是对一组对象进行分组的任务,使得同一组(称为聚类)中的对象(在某种意义上)...
    99+
    2024-04-02
  • 机器学习:基于Kmeans聚类算法对银行客户进行分类
    机器学习:基于Kmeans聚类算法对银行客户进行分类 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如...
    99+
    2023-08-31
    机器学习 聚类 kmeans python 原力计划
  • Python实现聚类K-means算法详解
    目录手动实现sklearn库中的KMeansK-means(K均值)算法是最简单的一种聚类算法,它期望最小化平方误差 注:为避免运行时间过长,通常设置一个最大运行轮数或最小调整幅度...
    99+
    2024-04-02
  • Python实现聚类K-means算法
    本文内容、数据参考周志华《机器学习》,代码部分为个人实现,如有错误还请指出。 K-means(K均值)算法是最简单的一种聚类算法,它期望最小化平方误差 E ...
    99+
    2023-09-20
    聚类 算法 python
  • python聚类算法怎么选择
    本篇内容介绍了“python聚类算法怎么选择”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明如果数据集是高维度的,选择谱聚类是子空间的一种...
    99+
    2023-06-20
  • 基于TF-IDF+KMeans聚类算法构建中文文本分类模型(附案例实战)
      🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬...
    99+
    2023-09-02
    python 聚类 数据挖掘 k-means tf-idf
  • python聚类算法指的是什么
    这篇文章主要介绍了python聚类算法指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。说明聚类常用于数据探索或挖掘前期,在没有先验经验的背景下进行探索性分析,也适用于...
    99+
    2023-06-20
  • Python如何实现聚类K-means算法
    今天小编给大家分享一下Python如何实现聚类K-means算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。K-means...
    99+
    2023-07-02
  • Python使用Numpy实现Kmeans算法的步骤详解
    目录Kmeans聚类算法介绍:1.聚类概念:2.Kmeans算法:定义:大概步骤:Kmeans距离测定方式:3.如何确定最佳的k值(类别数):手肘法:python实现Kmeans算法...
    99+
    2024-04-02
  • 利用python实现聚类分析K-means算法的详细过程
    K-means算法介绍   K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近...
    99+
    2024-04-02
  • 利用Python如何实现K-means聚类算法
    目录前言算法原理 目标函数 算法流程  Python实现 总结 前言 K-Means 是一种非常简单的聚类算法(聚类算法都属于无监督学习)。给定固定数量的聚类和输入数据集,...
    99+
    2024-04-02
  • 【机器学习】DBSCAN聚类算法(含Python实现)
    文章目录 一、算法介绍二、例子三、Python实现3.1 例13.2 算法参数详解3.3 鸢尾花数据集 一、算法介绍 DBSCAN(Density-Based Spatial Clus...
    99+
    2023-10-01
    聚类 机器学习 python BBSCAN
  • 十种聚类算法的完整 Python 操作示例
    聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群。有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法。相反,最好探索一系列聚类算法以及每种算法的不同配置。在本教程中,你将发...
    99+
    2023-05-14
    算法 Python
  • 人工智能——K-Means聚类算法及Python实现
    目录1 概述1.1 无监督学习1.2 聚类1.3 K-Mean均值算法2 K-Mean均值算法 2.1 引入2.2 针对大样本集的改进算法:Mini Batch K-Mea...
    99+
    2024-04-02
  • vue diff算法全解析
    目录前言 Vue 更新视图 patch sameVnode patchVnodeupdateChildren 前言 我们知道 Vue 使用的是虚拟 DOM 去减少对真实 DOM 的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作