肘方法和silhouette 系数定聚类个数

无监督学习中存在一个问题,就是我们并不知道问题的确切答案。由于没有数据集样本类标的确切数据,我们无法在无监督学习中使用评估监督学习模型性能的相关技术。

因此,为了对聚类效果进行定量分析,我们需要使用模型内部的固有度量来比较不同K-means聚类结果的性能。在完成K-means模型的拟合后,簇内误差平方和可以通过inertia属性来访问。

使用肘方法确定簇的最佳数量

先生成聚类样本数据集

from IPython.display import Image

from sklearn.datasets import make_blobs
X,y=make_blobs(n_samples=150,
              n_features=2,
              centers=3,
              cluster_std=0.5,
              shuffle=True,
              random_state=0)


import matplotlib.pyplot as plt
plt.scatter(X[:,0],X[:,1],c='r',marker='o',s=50)
plt.grid()
plt.show()

 显然,使用聚类算法K-means的结果一定是三类!!!

 

from sklearn.cluster import KMeans

distortions=[]

for i in range(1,11):
    km=KMeans(n_clusters=i,
             init='k-means++',
             n_init=10,
             max_iter=300,
             random_state=0)
    km.fit(X)
    distortions.append(km.inertia_)
    
plt.plot(range(1,11),distortions,marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('Distortion')

plt.show()

上面这串代码的逻辑就是设置聚类个数的值从1到10分别计算聚类结果后的簇内误差平方和,并折线图的方式展示结果:

 显示,如图所示,当k=3时图案呈现了肘型,这表明对于次数据集来说,k=3的确是一个很好的选择。

通过轮廓图定量分析聚类质量

另一种评估聚类质量的定量分析方法是轮廓分析(silhouette analysis)此方法也可用于K-means之外的其他聚类方法。轮廓分析可以使用一个图形工具来度量簇中样本聚集的密集程度。轮廓系数的值介于-1到1之间。

绘制k=3时K-means算法的轮廓系数图:

km=KMeans(n_clusters=3,
         init='k-means++',
         n_init=10,
         max_iter=300,
         tol=1e-04,
         random_state=0)

y_km=km.fit_predict(X)

import numpy as np
from matplotlib import cm
from sklearn.metrics import silhouette_samples

cluster_labels=np.unique(y_km)
n_clusters=cluster_labels.shape[0]
silhouette_vals=silhouette_samples(X,y_km,metric='euclidean')

y_ax_lower,y_ax_upper=0,0

yticks=[]

for i,c in enumerate(cluster_labels):
    c_silhouette_vals=silhouette_vals[y_km==c]
    c_silhouette_vals.sort()
    
    y_ax_upper+=len(c_silhouette_vals)
    color=cm.jet(i/n_clusters)
    
    plt.barh(range(y_ax_lower,y_ax_upper),
            c_silhouette_vals,
            height=1.0,
            edgecolor='none',
            color=color)
    yticks.append((y_ax_lower+y_ax_upper)/2)
    y_ax_lower+=len(c_silhouette_vals)
    
silhouette_avg=np.mean(silhouette_vals)

plt.axvline(silhouette_avg,color='red',linestyle='--')

plt.yticks(yticks,cluster_labels+1)
plt.ylabel('Cluster')
plt.xlabel('Silhouette coefficient')

plt.show()

结果展示

 

通过观察轮廓图,我们可以快速知晓不同簇的大小,而且能够判断簇中是否包含异常点.为了评判聚类效果的优劣,我们在图中增加了轮廓系数的平均值(虚线)。

上面的作图原理不必深究,会套用就行!

 

定聚个数是进行K-means聚类分析的重要步骤之一。以下是两种常用的方法来帮助确定合适的聚类个数: 1. 手法(Elbow Method) 手法是一种直观的方法,用于选择合适的聚类个数。该方法通过计算不同聚类个数下的簇内平方(WCSS)来评估聚类的性能。WCSS是每个簇内数据点与该簇的质心之间距离的平方。随着聚类个数的增加,WCSS会逐渐减小,但是当聚类个数增加到一定程度时,减少的速度会减缓。这个聚类个数对应的点形成了图形上的一个"部",因此称为手法。 以下是一个使用手法确定聚个数的R代码示例: ```R library(ggplot2) library(cluster) # 读取数据 data <- read.csv("data.csv") # 计算不同聚类个数下的簇内平方 wcss <- c() for (i in 1:10) { kmeans_fit <- kmeans(data, centers = i, nstart = 10) wcss[i] <- kmeans_fit$tot.withinss } # 绘制手图 ggplot(data.frame(x = 1:10, y = wcss), aes(x, y)) + geom_line() + geom_point() + labs(x = "Number of Clusters", y = "Within-Cluster Sum of Squares") + geom_vline(xintercept = 3, linetype = "dashed") # 根据手定聚个数为3 ``` 2. 轮廓系数Silhouette Method) 轮廓系数是一种用于评估聚类质量的方法。该方法通过计算每个数据点的轮廓系数来评估聚类的性能。轮廓系数是一个介于-11之间的值,表示数据点与其所属簇的相似度与与其他簇的相似度之间的差异程度。轮廓系数越接近1,表示数据点与其所属簇的相似度越高,与其他簇的相似度越低,聚类效果越好。 以下是一个使用轮廓系数定聚个数的R代码示例: ```R library(ggplot2) library(cluster) # 读取数据 data <- read.csv("data.csv") # 计算不同聚类个数下的轮廓系数 silhouette <- c() for (i in 2:10) { kmeans_fit <- kmeans(data, centers = i, nstart = 10) silhouette[i] <- silhouette(kmeans_fit$cluster, dist(data))$avg.width } # 绘制轮廓系数图 ggplot(data.frame(x = 2:10, y = silhouette[-1]), aes(x, y)) + geom_line() + geom_point() + labs(x = "Number of Clusters", y = "Silhouette Width") + geom_vline(xintercept = 3, linetype = "dashed") # 根据轮廓系数定聚个数为3 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SaN-V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值