机器学习模型——K—Means算法

本文详细介绍了无监督学习中的聚类分析,包括K-Means、层次聚类(如BIRCH和HierarchicalClustering)、DBSCAN等算法的概念、步骤、优缺点以及在离群点检测和用户画像构建等场景的应用。特别关注了K值的选择方法,如枚举法、手肘法和改进算法。
摘要由CSDN通过智能技术生成

目录

无监督学习概念:

有监督学习与无监督学习:

无监督学习 - 聚类分析 :

聚类算法应用场景:

常用聚类算法介绍:

对不同的聚类算法应用选择原则:

基于原型聚类:

K-Means聚类算法概念及步骤:

 K-Means聚类 - K如何确定:

K-Means聚类的优缺点:

 K-Means的改进算法 

代码实现K值的选择:

枚举法:

 手肘法:

基于层次聚类:

概念:

自上向下(计算量非常大):

BIRCH算法:

代码实现:

自底向上(计算量非常大,不经常用):

Hierarchical Clustering算法原理:

Hierarchical Clustering算法优缺点:

基于密度聚类:

DBSCAN算法的基本概念:

DBSCAN算法将数据点分为三类:     

DBSCAN聚类算法优缺点:

代码实现:


无监督学习概念:

无监督学习:是指在未加标签的数据中,根据数据之间本身的属性特征和关联性对数据进行区分,相似相近或关联性强的数据放在一起,而不相似不相近、关联性不强的数据不放在一起。

无监督学习的本质是:利用无标签的数据学习数据的分布或数据与数据之间的关系。

无监督学习最常应用的场景是部分降维算法、聚类算法和关联算法。

有监督学习与无监督学习:

有监督学习中,如分类问题,要求事先必须明确知道各个类别的信息,其建立的前提是所有待分类项都有一个类别与之对应。但实际上分类问题可能获取到的数据记录对应的类别信息无法明确,尤其是处理海量数据时,如果通过预处理对数据进行打标,以满足分类算法的要求,代价非常大。

有监督学习中最常见的是分类问题,而无监督学习中最常见的是聚类问题,聚类问题不依赖预定义的类和类标号的训练实例。关注事物本身的特征分析。

   *比如电商对用户信息和购买行为数据进行聚类分析,目的是找到大量级的且有一定相似度的客   户     群,就可以针对该用户群共有的行为特征投放广告和其他营销活动。

无监督学习 - 聚类分析 :

聚类分析是分析研究对象(样品或变量)如何按照多个方面的特征进行综合分类的一种多元统计方法,它是根据物以类聚的思想将相似的样品(或变量)归为一类。

把对象分为不同的类别,类别是依据数据的特征确定的。

把相似的东西放在一起,类别内部的差异尽可能小, 类别之间的差异尽可能的大。

作用:

作为单独过程,用于对数据进行打标,即数据画像。

作为分类等其他学习任务的前驱过程,如聚类算法可以作为一些监督算法的前驱过程。

聚类算法应用场景:

离群点检测

离群点检测是数据挖掘中重要应用,任务就是发现与大部分观察对象显著不同的对象,大部分的数据挖掘方法会将这种差异信息视作噪声进行预处理,但是另外的一些应用中,离群点本身携带有重要的异常信息,是需要被关注和研究的。

离群点检测已经被广泛应用到电信、信用卡诈骗检测,贷款审批,电子商务,网络入侵和天气预报等领域,甚至可以利用离群点检测分析运动员的统计数据,以发现异常运动员。

用户画像构建方面:

根据客户数据,将相似性较高的客户聚为一类,打标签,进行客户类别细分。

业务推荐和精准营销方面:

通过构建用户画像进行业务推荐和精准营销。

常用聚类算法介绍:

基于原型聚类(partitioning methods)

 K-Means算法,K-Mediods 算法

基于层次聚类(hierarchical methods)、

Hierarchical Clustering算法、BIRCH算法

基于密度聚类(density-based methods)  

DBSCAN算法

对不同的聚类算法应用选择原则:

是否适用于大数据量,算法的效率是否满足大数据量高复杂性的要求。

是否能应付不同的数据类型,能否处理符号属性。

是否能发现不同类型的聚类。

是否能应付脏数据或异常数据。

是否对数据的输入顺序不敏感。

基于原型聚类:

K-Means聚类算法概念及步骤:

K-Means算法是一种常用的聚类分析方法,目的是将数据集划分为预定数量的簇,并确保簇内的数据点尽可能相似

以下是K-Means算法的核心概念和步骤:

  1. 预处理数据:包括标准化和异常点过滤等步骤,以便于处理。
  2. 确定K值:即需要形成的簇的数量,这通常根据实际需求预先给定(超参数)。
  3. 选取初始中心点:随机选择K个数据点作为初始簇中心(中心点的选取会直接影响到算法开始时的簇分配,并可能影响收敛速度和最终收敛的质量。)。
  4. 分配数据点:按照最小距离原则,将每个数据点分配到最近的簇中心所在的簇里。
  5. 更新簇中心:根据分配的结果,重新计算每个簇的中心点。
  6. 迭代优化:重复分配数据点和更新簇中心这两个步骤,直到簇中心不再发生变化或达到最大迭代次数。

 K-Means聚类 - K如何确定:

K-Means算法首先选择K个初始质心,其中K是用户指定的参数,即所期望的簇的个数。这样做的前提是已经知道数据集中包含多少个簇,但很多情况下,我们并不知道数据的分布情况。如何有效地确定K值,提供以下几种方法:

  1. 从实际问题出发,人工指定比较合理的K值,通过多次随机初始化聚类中心选取比较满意的结果。
  2. 均方根:假设我们有m个样本,该方法认为K=√m/2
  3. 枚举法:                                                                                                                                 用不同的K值进行聚类 分别计算类内距离均值和类间距离均值之比,选择最小的那个K值       对不同K值都产生2次聚类,选择两次聚类结果最相似的K值
  4. 手肘法(Elbow)、层次聚类法等

K-Means聚类的优缺点:

优点:

  1. 原理简单:K-Means算法的原理和实现都相对简单,易于理解和应用。
  2. 效率高:K-Means算法的计算复杂度接近线性,这意味着它可以高效地处理大型数据集。
  3. 收敛速度快:在迭代过程中,K-Means算法通常能够快速收敛到一个稳定的解。

缺点:

  1. 需要预先指定K值:在实际应用中,选择合适的K值可能需要尝试多种方法,这是一个挑战。
  2. 对初始质心敏感:算法的结果可能受到初始质心选择的影响,有时可能导致局部最优解而非全局最优解。
  3. 对噪声和离群点敏感:K-Means算法容易受到噪声和离群点的影响,这可能导致簇划分不准确。
  4. 对簇形状和大小敏感:K-Means算法假设簇是凸形的和各向同性的,这在实际中并不总是成立,因此可能不适用于形状复杂或大小差异较大的簇。
  5. 只能处理凸数据集:K-Means算法一般只用于凸数据集,对于非凸数据集,K-Means算法的处理效果很差

 K-Means的改进算法 

K-Means与K-Means++:

不同于K-Means算法第一次是随机选择K个聚类中心,K-Means++是假设已经选取了p个初始聚类中心(0<p<K),则在选取第p+1个聚类中心时:距离当前p个聚类中心越远的点会有更高的概率被选为第p+1个聚类中心。只有在选取第一个聚类中心(p=1)时是通过随机的方法。该改进方法符合一般的直觉:聚类中心互相之间距离得越远越好。这个改进直观简单,也非常有效。

其他改进算法还有:

 ISODATA:对于高纬度的数据样本,针对K值事先不一定能准确指定的情况,当属于某个类别的样本数过少时把这个类别去除,当属于某个类别的样本数过多、分散程度较大时把这个类别分为两个子类别。

 https://www.cnblogs.com/yixuan-xu/p/6272208.html   K-Means++

KMeans++也是解决解决KMeans的初值敏感的问题,它与二分K-Means不同的是:在选择两个聚类点的时候不是随机选择,而是先随机选择一个点,第二个选择距离该点最远的点,再进行划分。当然,为了避免异常点的存在,第二个点的选择会选择距离较远的几个点并进行加权选择最终的第二个点。

K-Means:随机的选取初始质心,但是这样簇的质量常常很差。处理选取初始质心问题的一种常用技术是:多次运行,每次使用一组不同的随机初始质心,然后选取具有最小SSE(误差的平方和)的簇集。

KMeans++:随机地选择第一个点,或取所有点的质心作为第一个点。然后,对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。此外,求离当前初始质心集最远的点开销也非常大。为了克服这个问题,通常该方法可以用于抽样和筛出离群点后的样本数据上。

代码实现K值的选择:

枚举法:

首先我们用枚举法,来选择K值,枚举法K值的选择是观察其轮毂系数(silhouette_score),随着K值增加,轮廓系数的提升幅度开始减小,这通常也意味着达到了较好的聚类效果

from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from sklearn.metrics import silhouette_score

iris = load_iris()

X = iris.data

# 枚举法
sil = []
for k in range(2,20):
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    sil.append(silhouette_score(X,kmeans.labels_))

import matplotlib.pyplot as plt

plt.plot(range(2,20),sil)
plt.scatter(range(2,20),sil,c='Red')
plt.show()

由此看出K值在2的时候最好,因此我们选择2来作为K值

 手肘法:

K值的选择主要是看拐点。

from sklearn.cluster import KMeans
from sklearn.datasets import load_iris

iris = load_iris()

X = iris.data

sse = []
for k in range(2,20):
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    sse.append(kmeans.inertia_)


import matplotlib.pyplot as plt
plt.plot(range(2,20),sse)
plt.scatter(range(2,20),sse,c='Red')
plt.show()

手肘法对于K值的选择应该是3或者是4,5 

基于层次聚类:

概念:

层次聚类法试图在不同层次对数据集进行划分,从而形成树形的聚类结构,数据集的划分可采用“自下向上”的聚合策略,也可以采用“自顶向下”的分拆策略。聚类的层次被表示成树形图。树根拥有所有样本的唯一聚类,叶子是仅有一个样本的聚类。

自上向下(计算量非常大):

BIRCH算法:

BIRCH算法即平衡迭代削减聚类法,其核心是用一个聚类特征3元组表示一个簇的有关信息,从而使一簇点的表示可用对应的聚类特征,而不必用具体的一组点来表示。它通过构造满足分支因子和簇直径限制的聚类特征树来求聚类。

BIRCH算法通过构建CF树来实现数据的压缩和聚类,这个过程可以看作是一种“自下而上”的聚合策略。具体来说,算法首先扫描数据库,建立一棵存放于内存的CF树,这个树结构可以被看作数据的多层压缩,试图保留数据的内在聚类结构。然后,算法采用某个选定的聚类算法,如K-means或者凝聚算法,对CF树的叶节点进行聚类,把稀疏的簇当作离群点删除,而把更稠密的簇合并为更大的簇。

3元组包含:数据点个数,数据点特征之和,数据点特征的平方和。

分支因子:规定了树的每个节点的样本个数

簇直径:体现一类点的距离范围

BIRCH算法通过聚类特征可以方便地进行中心、半径、直径及类内、类间距离的运算。

BIRCH算法中聚类特征树的构建过程是动态的,可以随时根据新的数据点对树进行重构,适合大规模数据集。

总结来说,BIRCH算法通过构建CF树并在此基础上进行聚类,实现了一种“自下而上”的聚合策略,这种方法在处理大规模数据集时非常有效,能够在不牺牲聚类质量的前提下,减少计算复杂性。

https://www.cnblogs.com/pinard/p/6179132.html 算法原理

代码实现:

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data

from sklearn.cluster import Birch
bir = Birch(n_clusters=3,threshold=1000,branching_factor=5)
bir.fit(X)

print(bir.labels_)

半径的选取如果太大,就会全部预测为一种类型。因此合理的半径是成功的标配。

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data

from sklearn.cluster import Birch
bir = Birch(n_clusters=3,threshold=1,branching_factor=5)
bir.fit(X)

print(bir.labels_)

自底向上(计算量非常大,不经常用):

Hierarchical Clustering算法原理:

主要思路:确保距离近的点落在同一个簇(cluster)之中,

流程如下:

将每个对象作为一个簇c_i={x_i},形成簇的集合 C={c_i};

迭代以下步骤直至所有对象都在一个族中; 找到一对距离最近的簇:min D(c_i,c_j);

将这对簇合并为一个新的簇;

从原集合C中移除这对簇;

最终产生层次树形的聚类结构: 树形图。

https://blog.csdn.net/zhangyonggang886/article/details/53510767 原理

Hierarchical Clustering算法优缺点:

优点:

可排除噪声点的干扰,但有可能噪声点分为一簇。

适合形状不规则,不要求聚类完全的情况。

不必确定K值,可根据聚类程度不同有不同的结果。

原理简单,易于理解。

缺点:

计算量很大,耗费的存储空间相对于其他几种方法要高。

合并操作不能撤销。、

合并操作必须有一个合并限制比例,否则可能发生过度合并导致所有分类中心聚集,造成聚类失败。

基于密度聚类:

密度聚类的思想不同于K-Means,它是通过聚类的簇是否紧密相连来判断样本点是否属于一个簇,代表性的算法就是DBSCAN,它基于一组邻域参数来判断某处样本是否是紧密。

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法,可以不设置K值)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN还适用于非凸样本集

https://blog.csdn.net/dsdaasaaa/article/details/94590159 算法原理

DBSCAN算法的基本概念:

存在数据集D={x_1,x_2,…,x_m},DBSCAN的相关密度概念描述如下:

ε−邻域:对于x_j∈D,其ε−邻域包含样本集D中与x_j的距离不大于ε的点构成一个子样本集,即N_ε(x_j)={x_j∈D|distance(x_i,x_j)≤ε},该子样本集的样本个数记为|N_ε(x_j)|。

核心对象:对于任一样本x_j∈D,如果其ε−邻域对应的N_ε(x_j)至少包含min⁡_samples个样本,即如果|N_ε(x_j)|≥min⁡_samples,则x_j是核心对象。

密度直达:如果x_i位于x_j的ε−邻域中,且x_j是核心对象,则称x_i由x_j密度直达。注意反之不一定成立,即不能说x_j由x_i密度直达,除非且x_i也是核心对象。

  1. 密度可达:对x_i和x_j,如果存在样本序列p_1, p_2,..., p_T,满足p_1=x_i,p_T=x_j,且p_t+1由p_t密度直达,则称x_j由x_i密度可达,密度可达满足传递性。此时p_1, p_2,..., p_T−1均为核心对象,因为只有核心对象才能使其他样本密度直达。另外,密度可达不满足对称性,由密度直达的不对称得出。
  2. 密度相连:对于x_i和x_j,如果存在核心对象样本x_k,使x_i和x_j均由x_k密度可达,则称x_i和x_j密度相连。注意密度相连关系是满足对称性的。

DBSCAN算法将数据点分为三类:     

核心点:在半径ε内含有超过min⁡_samples数目的点。

边界点:在半径ε内点的数量小于min⁡_samples,但是落在核心点的邻域内的点。

噪音点:既不是核心点也不是边界点的点。

DBSCAN聚类算法优缺点:

DBSCAN的优点:

可以解决数据分布特殊(非凸, 互相包络,长条形等)的情况。

对于噪声不敏感 ,速度较快,不需要指定簇的个数;可适用于较大的数据集。

在邻域参数给定的情况下结果是确定的,只要数据进入算法的顺序不变,与初始值无关。

缺点:

因为对整个数据集我们使用的是一组邻域参数 ,簇之间密度差距过大时效果不好。

数据集较大的时候很消耗内存。

对于高维数据距离的计算会比较麻烦,造成维数灾难。

代码实现:

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.1,min_samples=100)
dbscan.fit(X)

print(dbscan.labels_)

这种属于半径太小,最小样本点太大,导致所有数据均被预测为噪声点。

 

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=100,min_samples=5)
dbscan.fit(X)

print(dbscan.labels_)

这种属于半径太大,样本点太少导致的,所有数据均被预测为边界点

 

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data

from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=1,min_samples=10)
dbscan.fit(X)

print(dbscan.labels_)

在实际应用中,DBSCAN算法对半径和最小样本点的选取有着严格要求,合理的选取是必须的 

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值