kmeans聚类分析结果怎么看_聚类分析学习笔记

本文介绍了聚类分析的基本概念及其商业应用,详细讲解了K均值聚类算法的原理、评价函数和sklearn.cluster.KMeans的参数。还对比了K均值与K中心点聚类的差异,探讨了如何确定合适的簇数量,包括肘部法则和轮廓系数法。最后提到了高斯混合模型作为基于密度的聚类方法,及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聚类分析就是根据数据对象的特征及其关系,将对象分簇。簇内的相似性越大,簇间的差别越大,聚类就越好。在商业上被用来发现不同的客户群,并且通过购买模式刻画不同客户群的特征。聚类分析是细分市场的有效工具,同时也是用于研究消费者研究行为,寻找新的潜在市场。

聚类分析流程

61076a8e-4f2f-eb11-8da9-e4434bdf6706.png

聚类分析可以分为:划分方法,层次方法,基于密度的算法,基于网络的算法,基于模型的算法。

划分方法的定义:距离作为数据集中不同数据间相似度的度量,将数据级划分为多个簇。K均值和k-中心点均是属于划分方法的聚类分析算法。

评价函数:评价聚类效果的评价函数主要考虑两个方面:每个簇中的对象应该是紧凑的;各个簇之间的对象的距离因该尽可能的远。实现这种考虑的一个之间办法就是观察类内差异w(c)和类间差异b(c)。类内差异衡量类内对象之间的紧凑性,类间差异衡量不同类之间的距离。

63076a8e-4f2f-eb11-8da9-e4434bdf6706.png

67076a8e-4f2f-eb11-8da9-e4434bdf6706.png

聚类C的聚类质量可以用W(c)和B(c)的一个单调组合来表示,譬如W(c)/B(c)。

K均值聚类

k均值是最古老、最广泛使用的聚类算法。其算法思想是:从包含n个数据的数据集中随机选则k个对象,每个对象代表初始的一个簇的平均值或者是质心,对于剩余的数据根据与各个簇的中心距离指派到最近的簇,然后根据指派到簇的数据重新计算质心,如此循环,直到成本函数不发生变化。k均值算法的成本函数E定义为:

6b076a8e-4f2f-eb11-8da9-e4434bdf6706.png

sklearn.cluster.KMeans 参数介绍

70076a8e-4f2f-eb11-8da9-e4434bdf6706.png

algorithm:有“auto”, “full” or “elkan”三种选择。”full”就是我们传统的K-Means算法, “elkan”是elkan K-Means算法。默认的”auto”则会根据数据值是否是稀疏的,来决定如何选择”full”和“elkan”。一般数据是稠密的,那么就是 “elkan”,否则就是”full”。一般来说建议直接用默认的”auto”

copy_x:布尔型,默认值=True

当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

init:有三个可选值:’k-means++’, ‘random’,或者传递一个ndarray向量。

此参数指定初始化方法,默认值为 ‘k-means++’。

(1)‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛,k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。

(2)‘random’ 随机从训练数据中选取初始质心。

(3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

max_iter:整形,缺省值=300,执行一次k-means算法所进行的最大迭代数。

n_clusters:整形,缺省值=8 【生成的聚类数,即产生的质心(centroids)数。】

n_init:整形,缺省值=10,用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

n_jobs:整形数。 指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。

(1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。

(2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。

precompute_distances:三个可选值,‘auto’,True 或者 False。

预计算距离,计算速度更快但占用更多内存。

(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.

(2)True:总是预先计算距离。

(3)False:永远不预先计算距离。

random_state:整形或 numpy.RandomState 类型,可选

用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。

tol:float形,默认值= 1e-4 与inertia结合来确定收敛条件

verbose : int, default 0,冗长模式

属性:

cluster_centers_:向量,[n_clusters, n_features] (聚类中心的坐标)

Labels_: 每个点的分类
inertia_:float形
每个点到其簇的质心的距离之和。

Methods

fit(X[,y]): 计算k-means聚类。

fit_predictt(X[,y]): 计算簇质心并给每个样本预测类别。

fit_transform(X[,y]): 计算簇并 transform X to cluster-distance space。

get_params([deep]): 取得估计器的参数。

predict(X):predict(X) 给每个样本估计最接近的簇。

score(X[,y]): 计算聚类误差

set_params(**params): 为这个估计器手动设定参数。

transform(X[,y]): 将X转换为群集距离空间。 在新空间中,每个维度都是到集群中心的距离。 请注意,即使X是稀疏的,转换返回的数组通常也是密集的。

K中心点聚类

由于均值聚类算法对离群点是敏感的,一个极大值可能会扭曲数据的分布,于是有了K中心聚类的方法:K中心点聚类不采用簇中对象的平均值做为簇中心,而是在每个簇中选择距离均值最近的点作为质心。这样每次迭代后的质心都是在簇中样本点选取的,提高了簇的聚类质量,是簇更加紧凑。使用绝对误差作为度量聚类质量的成本函数:

73076a8e-4f2f-eb11-8da9-e4434bdf6706.png

k均值聚类与k中心聚类的比较

k均值算法快捷、简单、可解释性强,相对于高斯混合模型而言收敛速度快,处理大数据具有较高的效率且具有伸缩性(对仅有几百的小数据和上万的大数据都是有效的);因而常用于高斯混合模型的初始值选择。算法的时间复杂度是O(nkt),n是数据量,t是迭代次数,k是簇的数目;适用于圆形、球状的簇,不适用于非凸形状的簇、不同密度或者大小差别很大的簇(由于使用的是欧式距离)如弯月牙形、圆环,这种使用基于密度是的聚类更合适,对极值数据敏感,少量的该类数据能够对簇中心产生较大影响。而k中心聚类更具鲁棒性,不易受极端数据影响,付出的是时间复杂度的代价,k中心的算法复杂度为O(k(n-k)**2)。两种方法都是需要事先指定簇的数据k。怎么确定k值呢?通常可是使用肘部法则(elbow method),也可以使用轮廓系数法。

肘部法则(elbow method): 可用于估计聚类数量;把不同K值的成本函数值画出来,找出K值增大过程中,畸变程度下降幅度最大的位置所对应的K值(即为肘部)

手肘法的核心指标是SSE(sum of the squared errors,误差平方和),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

import numpy as np
from pylab import mpl
import matplotlib.pyplot as plt
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))#生成随机正态分布数组
cluster2 = np.random.uniform(3.5, 4.5, (2, 10))
X = np.hstack((cluster1, cluster2)).T
plt.figure()
plt.axis([0, 5, 0, 5])
plt.grid(True)
plt.plot(X[:,0],X[:,1],'k.')
plt.show()

79076a8e-4f2f-eb11-8da9-e4434bdf6706.png
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
from matplotlib.font_manager import FontProperties
font=FontProperties(fname='C:WindowsFontssimhei.ttf')
K = range(1, 10)
meandistortions = []
for k in K:
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1)) / X.shape[0])
plt.plot(K, meandistortions, 'bx-')
plt.xlabel('k')
plt.ylabel('平均畸变程度',fontproperties=font)
plt.title('用肘部法则来确定最佳的K值',fontproperties=font)
plt.show()


'''
#用来存放设置不同簇数时的SSE值
distortions = []
for i in range(1,11):
    km = KMeans(n_clusters=i,init="k-means++",n_init=10,max_iter=300,tol=1e-4,random_state=0)
    km.fit(X)
    #获取K-means算法的SSE
    distortions.append(km.inertia_)#每个点到其簇的质心的距离之和
#绘制曲线
plt.plot(range(1,11),distortions,marker="o")
plt.xlabel("簇数量")
plt.ylabel("簇内误方差(SSE)")
plt.show()

    n_clusters:设置簇的个数
    init:random表示使用Kmeans算法,默认是k-means++   #K-Means++算法,让初始的中心点彼此的距离尽可能的远,相比K-Means算法,它能够产生更好的模型。
    n_init:设置初始样本中心的个数
    max_iter:设置最大迭代次数
    tol:设置算法的容错范围SSE(簇内误平方差)
'''

7b076a8e-4f2f-eb11-8da9-e4434bdf6706.png

这样我们可以让k=2去划分数据集。

轮廓系数法:该方法的核心指标是轮廓系数(Silhouette Coefficient),某个样本点Xi的轮廓系数定义如下:

7d076a8e-4f2f-eb11-8da9-e4434bdf6706.png

其中,a是Xi与同簇的其他样本的平均距离,称为凝聚度,b是Xi与最近簇中所有样本的平均距离,称为分离度。而最近簇的定义是

81076a8e-4f2f-eb11-8da9-e4434bdf6706.png

其中p是某个簇Ck中的样本。事实上,简单点讲,就是用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。

import time
from sklearn.metrics import silhouette_score,calinski_harabaz_score
clusters = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
silhouette_scores = []
#轮廓系数silhouette_scores
print('start time: ',time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
for k in clusters:
    y_pred = KMeans(n_clusters = k, verbose = 0, n_jobs = -1, random_state=1).fit_predict(X)
    score = silhouette_score(X, y_pred)#silhouette_score:所有样本的轮廓系数的平均值,silhouette_sample:所有样本的轮廓系数
    silhouette_scores.append(score)
print('finish time: ',time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
plt.plot(clusters, silhouette_scores, '*-')
plt.xlabel('k')
plt.ylabel('silhouette_score')
plt.show()

89076a8e-4f2f-eb11-8da9-e4434bdf6706.png

实际应用中,一般来说,平均轮廓系数越高,聚类的质量也相对较好。如下图,对于研究区域的网格单元,最优聚类数应该是2,这时平均轮廓系数的值最高。但是,聚类结果(k=2)的 SSE 值太大了。当 k=6 时,SEE 的值会低很多,但此时平均轮廓系数的值非常高,仅仅比 k=2 时的值低一点。因此,k=6 是最佳的选择。 建议使用使用肘部法则确定K值,利用轮廓系数评估聚类效果。

91076a8e-4f2f-eb11-8da9-e4434bdf6706.png

------------------------------------------------------------------------------

基于密度的算法:高斯混合聚类

高斯混合模型(Gaussian Mixture Model ) 是一种概率式的聚类方法,它假设所有的数据样本都是由某一个给定参数的 多元高斯分布 所生成的。通常简称GMM,是一种业界广泛使用的聚类算法。

高斯分布的概率密度函数公式如下:

94076a8e-4f2f-eb11-8da9-e4434bdf6706.png

GMM 的概率密度函数:

99076a8e-4f2f-eb11-8da9-e4434bdf6706.png

该公式和之前的公式非常相似,细节上有几点差异。首先分布概率是K个高斯分布的和,每个高斯分布有属于自己的μ 和σ 参数,以及对应的权重参数,权重值必须为正数,所有权重的和必须等于1,以确保公式给出数值是合理的概率密度值。

高斯混合模型在训练时使用了极大似然估计法,最大化以下对数似然函数:

a1076a8e-4f2f-eb11-8da9-e4434bdf6706.png

该优化式无法直接通过解析方式求得解,故可采用 期望-最大化(Expectation-Maximization, EM) 方法求解。

思路如下:

1.根据给定的K值,初始化K个多元高斯分布以及其权重;

2.根据贝叶斯定理,估计每个样本由每个成分生成的后验概率;(EM方法中的E步)

3.根据均值,协方差的定义以及2步求出的后验概率,更新均值向量、协方差矩阵和权重;(EM方法的M步) 重复2~3步,直到似然函数增加值已小于收敛阈值,或达到最大迭代次数

当参数估计过程完成后,对于每一个样本点,根据贝叶斯定理计算出其属于每一个簇的后验概率,并将样本划分到后验概率最大的簇上去。相对于KMeans等直接给出样本点的簇划分的聚类方法,GMM这种给出样本点属于每个簇的概率的聚类方法,被称为 软聚类(Soft Clustering / Soft Assignment)

GMM模型中的超参数convariance_type控制这每个簇的形状自由度。
它的默认设置是convariance_type=’diag’,意思是
簇在每个维度的尺寸都可以单独设置,但椭圆边界的主轴要与坐标轴平行。

covariance_type=’spherical’时模型通过约束簇的形状,让所有维度相等。
这样得到的聚类结果和k-means聚类的特征是相似的,虽然两者并不完全相同。

covariance_type=’full’时,该模型允许每个簇在任意方向上用椭圆
from sklearn.mixture import GaussianMixture
GMM=GaussianMixture
n_components = np.arange(1, 21)
models = [GMM(n, covariance_type='full', random_state=0).fit(Xmoon)
          for n in n_components]

plt.plot(n_components, [m.bic(Xmoon) for m in models], label='BIC')
plt.plot(n_components, [m.aic(Xmoon) for m in models], label='AIC')
plt.legend(loc='best')
plt.xlabel('n_components');
plt.show()
#作为一种生成模型,GMM提供了一种确定数据集最优成分数量的方法。
#由于生成模型本身就是数据集的概率分布,因此可以利用模型来评估数据的似然估计,
#并利用交叉检验防止过拟合。Scikit-Learn的GMM评估器内置了两种纠正过拟合的标准分析方法:
#赤池信息量准则(AIC)和贝叶斯信息准则(BIC)

AIC准则

AIC是衡量统计模型拟合优良性的一种标准,由日本统计学家赤池弘次在1974年提出,它建立在熵的概念
上,提供了权衡估计模型复杂度和拟合数据优良性的标准。

通常情况下,它是拟合精度和参数未知个数的加权函数,AIC定义为:

AIC=2k-2In(L)

当在两个模型之间存在着相当大的差异时,这个差异出现于上式第二项,而当第二项不出现显著性差异
时,第一项起作用,从而参数个数少的模型是好的模型。增加自由参数的数目提高了拟合的优良性,
AIC鼓励数据拟合的优良性但是尽量避免出现过度拟合(Overfitting)的情况。

让n为观察数,RSS为剩余平方和,那么AIC变为:

AIC=2k+nIn(RSS/n)

其中k是模型中未知参数个数,L是模型中极大似然函数值似然函数。从一组可供选择的模型中选择最佳
模型时,通常选择AIC最小的模型。

当两个模型之间存在较大差异时,差异主要体现在似然函数项,

当似然函数差异不显著时,上式第一项,即模型复杂度则起作用,从而参数个数少的模型是较好的选择。


BIC(Bayesian InformationCriterion)贝叶斯信息准则与AIC相似,用于模型选择,1978年由
Schwarz提出。训练模型时,增加参数数量,也就是增加模型复杂度,会增大似然函数,但是也会导致
过拟合现象,针对该问题,AIC和BIC均引入了与模型参数个数相关的惩罚项,BIC的惩罚项比AIC的大,
考虑了样本数量,样本数量过多时,可有效防止模型精度过高造成的模型复杂度过高。

BIC=kIn(n)-2In(L)

其中,k为模型参数个数,n为样本数量,L为似然函数。kln(n)惩罚项在维数过大且
训练样本数据相对较少的情况下,可以有效避免出现维度灾难现象。

a4076a8e-4f2f-eb11-8da9-e4434bdf6706.png

高斯混合模型的优缺点:

优点:

  1. 相比于K-means更具一般性,能形成各种不同大小和形状的簇。
  2. 仅使用少量的参数就能较好地描述数据的特性。

缺点:

  1. 高斯混合模型的计算量较大收敛慢。因此常先对样本集跑k-means,依据得到的各个簇来定高斯混合模型的初始值。其中质心即为均值向量,协方差矩阵为每个簇中样本的协方差矩阵,混合系数为每个簇中样本占总体样本的比例。
  2. 分模型数量难以预先选择,但可以通过划分验证集来比较。
  3. 对异常点敏感。
  4. 数据量少时效果不好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值