轮廓系数(Average silhouette) | 最佳聚类数的判定

1.最佳分类个数

# 辅助确定最佳聚类数  4.7*2.6
factoextra::fviz_nbclust( t(DPAU_2), kmeans, method = "silhouette")

在这里插入图片描述
在2有下降拐点,但是样本较多时分成2类一般意义不大。
在7时也有下降拐点。

2.查看每个分类的轮廓系数

(1) pam k=5

library(cluster)
set.seed(101)
pamclu=cluster::pam(t(DPAU_2), k=5)

{
pdf( paste0(outputRoot, keyword, "_01_2.K_means.silhouette.pdf"), width=6, height=5)
df1=silhouette(pamclu)
plot(silhouette(pamclu), 
     col = (1+ head(df1, n=nrow(df1)) |> as.data.frame() |> pull("cluster")),
     main=NULL)
dev.off()
}

在这里插入图片描述
Fig1. Silhouette plot displaying the composition (n = number of samples) and stability (average width) of clustering.

(2) pam k=6

library(cluster)
set.seed(101)
pamclu=cluster::pam(t(DPAU_2), k=6)

{
pdf( paste0(outputRoot, keyword, "_01_2.K_means.6.silhouette.pdf"), width=6, height=5)
df1=silhouette(pamclu)
plot(silhouette(pamclu), 
     col = (1+ head(df1, n=nrow(df1)) |> as.data.frame() |> pull("cluster")),
     main=NULL)
dev.off()
}

在这里插入图片描述

(3) pam k=7

library(cluster)
set.seed(101)
pamclu=cluster::pam(t(DPAU_2), k=7)

{
pdf( paste0(outputRoot, keyword, "_01_2.K_means.7.silhouette.pdf"), width=6, height=5)
df1=silhouette(pamclu)
df1=head(df1, n=nrow(df1)) |> as.data.frame()
plot(silhouette(pamclu), 
     col = df1$cluster +1,
     #xlim=c(min(df1$sil_width)-0.2, max(df1$sil_width))+0.2,
     main=NULL)
dev.off()
}

在这里插入图片描述

(4) kmeans k=5

dat=DPAU_2
kclu=kmeans(t(dat), centers=5)

#kclu$clustering=kclu$cluster #add this list element: clustering
distance=dist( t(dat) )  #10min
kclu.sil=sortSilhouette( silhouette(kclu$cluster, dist = distance ) )
#rownames(kclu.sil)=colnames(dat)
head(kclu.sil)
#     cluster neighbor sil_width
#1226       1        2 0.1124117
#991        1        2 0.1113240
pdf( paste0(outputRoot, keyword, "_01_2.K_means.5.silhouette.pdf"), width=6, height=5)
df1=kclu.sil
df1=head(df1, n=nrow(df1)) |> as.data.frame()
plot(kclu.sil, 
     col = rev(df1$cluster+1),
     do.col.sort=F,
     main=NULL)

factoextra::fviz_silhouette(kclu.sil)
dev.off()

在这里插入图片描述
在这里插入图片描述

(5) hclust, k=4

dat=DPAU_2
distance=dist( t(dat) ) 
out.hclust=hclust(distance, method = "ward.D2")

# visual
pdf( paste0(outputRoot, keyword, "_01_2.hclust.4.silhouette.pdf"), width=6, height=5)
plot(out.hclust,
     #hang = -1,
     #hang=0.1,
     hang=0,
     ann=F, axes=F, 
     labels = F, #no labels
     cex = 0.7,
     col = "grey20")
rect.hclust( out.hclust, k=4, border = c("#FF6B6B", "#4ECDC4", "#556270", "deeppink") )
# sil plot
out.hclust.D2=cutree(out.hclust, k=4)
sil_hclust=sortSilhouette(silhouette(out.hclust.D2, distance))
rownames(sil_hclust) = rownames(as.matrix(distance))[attr(sil_hclust, 'iOrd')]
#
plot(sil_hclust, 
     col=out.hclust.D2[rownames( head(sil_hclust, n=nrow(sil_hclust)) )]+1,
     main=attr(sil_hclust, "call") |> deparse() )
dev.off()

在这里插入图片描述
在这里插入图片描述

3. 轮廓系数的解释

轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。最早由 Peter J. Rousseeuw 在 1986 提出。 它结合内聚度和分离度两种因素。可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行方式对聚类结果所产生的影响。

  • 内聚度可以理解为反映一个样本点与类内元素的紧密程度。
  • 分离度可以理解为反映一个样本点与类外元素的紧密程度。

对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值。

  • 当a(i)<b(i)时,即类内的距离小于类间距离,则聚类结果更紧凑。S的值会趋近于1。越趋近于1代表轮廓越明显。
  • 相反,当a(i)>b(i)时,类内的距离大于类间距离,说明聚类的结果很松散。S的值会趋近于-1,越趋近于-1则聚类的效果越差。
  • 轮廓系数S的取值范围为[-1, 1],轮廓系数越大聚类效果越好。

Ref:

  • https://baike.baidu.com/item/轮廓系数/17361607
  • https://pubmed.ncbi.nlm.nih.gov/32929364/
### 回答1: 在 Python 中使用 K-Means 算法对用户画像特征进行聚类,首先需要准备好用户画像特征的数据集。然后,可以使用 scikit-learn 中的 KMeans 类来实现 K-Means 算法,并使用训练数据来构建模型。 下面是一个简单的示例: ``` from sklearn.cluster import KMeans # 读入数据并转换为 NumPy 数组 X = ... # 创建 KMeans 模型 kmeans = KMeans(n_clusters=3) # 使用训练数据构建模型 kmeans.fit(X) # 预测每个样本所属的聚类 predictions = kmeans.predict(X) ``` 在这个例子中,我们将用户画像特征的数据集赋值给变量 `X`,并使用 `n_clusters` 参数指定聚类数量。然后,使用 `fit` 方法来构建 K-Means 模型,并使用 `predict` 方法来预测每个样本所属的聚类。 如果你想使用轮廓系数法来确定最佳聚类数量,可以使用 scikit-learn 中的 silhouette_score 函数。例如: ``` from sklearn.metrics import silhouette_score # 创建一系列不同聚类数量的 KMeans 模型 kmeans_models = [KMeans(n_clusters=k).fit(X) for k in range(2, 6)] # 计算每个模型的轮廓系数 silhouette_scores = [silhouette_score(X, model.predict(X)) for model in kmeans_models] ### 回答2: Python可以使用scikit-learn库中的KMeans算法对用户画像特征进行聚类,并使用轮廓系数法确定最佳聚类数量。 KMeans算法是一种常用的聚类算法,它根据欧氏距离将数据点分成K个不重叠的簇。首先,我们需要提取用户画像特征作为输入数据。这些特征可以包括用户年龄、性别、地理位置、兴趣爱好等。接下来,我们可以使用KMeans算法对这些特征进行聚类。 在Python中,可以使用sklearn.cluster模块中的KMeans类来实现聚类分析。可以指定KMeans类的参数n_clusters为一个范围,例如[2, 10],表示聚类的数量从2到10进行遍历。然后,我们可以针对每个聚类数量计算轮廓系数轮廓系数是一种度量聚类结果紧密度和分离度的方法。它的取值范围在[-1, 1]之间,较接近1表示聚类结果较好,较接近-1表示聚类结果较差。通过计算轮廓系数,我们可以选择具有最高值的聚类数量作为最佳聚类数量。 可以使用sklearn.metrics模块中的silhouette_score函数来计算轮廓系数。对于每个聚类数量,我们可以将特征数据输入到KMeans算法中,然后计算轮廓系数。最后,我们可以选择具有最高轮廓系数聚类数量作为最佳聚类数量。 在完成上述步骤之后,我们就可以得到最佳聚类数量,并且可以使用KMeans算法对用户画像特征进行聚类。这可以帮助我们更好地理解用户群体的特征和行为模式,从而为个性化推荐、广告定向等方面提供参考依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值