Sklearn 成长之路(五)K-means聚类及其评价指标——轮廓系数

聚类结果评价指标——轮廓系数

某个点的轮廓系数定义为:

s = d i s M e a n o u t − d i s M e a n i n m a x ( d i s M e a n o u t , d i s M e a n i n ) s =\frac{disMean_{out} - disMean_{in}}{max(disMean_{out}, disMean_{in})} s=max(disMeanout,disMeanin)disMeanoutdisMeanin
其中 d i s M e a n i n t disMean_{int} disMeanint为该点与本类其他点的平均距离, d i s M e a n o u t disMean_{out} disMeanout为该点与非本类点的平均距离。该值取值范围为 [ − 1 , 1 ] [-1, 1] [1,1], 越接近1则说明分类越优秀。在sklearn中函数silhouette_score()计算所有点的平均轮廓系数,而silhouette_samples()返回每个点的轮廓系数。

预设不同的簇数分类结果

原始数据:
在这里插入图片描述
分类结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结论:预设4簇的时候其平均轮廓系数最高,所以分4簇是最优的,与数据集相匹配。

Show me the code

导包

# 生成数据模块
from sklearn.datasets import make_blobs
# k-means模块
from sklearn.cluster import KMeans
# 评估指标——轮廓系数,前者为所有点的平均轮廓系数,后者返回每个点的轮廓系数
from sklearn.metrics import silhouette_score, silhouette_samples

import numpy as np
import matplotlib.pyplot as plt

生成数据

# 生成数据
x_true, y_true = make_blobs(n_samples= 600
                            , n_features= 2, centers= 4, random_state= 1)

# 绘制出所生成的数据
plt.figure(figsize= (6, 6))
plt.scatter(x_true[:, 0], x_true[:, 1], c= y_true, s= 10)
plt.title("Origin data")
plt.show()

预设不同簇数并聚类

# 根据不同的n_centers进行聚类
n_clusters = [x for x in range(3, 6)]

for i in range(len(n_clusters)):
    # 实例化k-means分类器
    clf = KMeans(n_clusters= n_clusters[i])
    y_predict = clf.fit_predict(x_true)
    
    # 绘制分类结果
    plt.figure(figsize= (6, 6))
    plt.scatter(x_true[:, 0], x_true[:, 1], c= y_predict, s= 10)
    plt.title("n_clusters= {}".format(n_clusters[i]))
    
    ex = 0.5
    step = 0.01
    xx, yy = np.meshgrid(np.arange(x_true[:, 0].min() - ex, x_true[:, 0].max() + ex, step),
                         np.arange(x_true[:, 1].min() - ex, x_true[:, 1].max() + ex, step))
    
    zz = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    zz.shape = xx.shape
    
    plt.contourf(xx, yy, zz, alpha= 0.1)
    
    plt.show()
    
    # 打印平均轮廓系数
    s = silhouette_score(x_true, y_predict)
    print("When cluster= {}\nThe silhouette_score= {}".format(n_clusters[i], s))
    
    # 利用silhouette_samples计算轮廓系数为正的点的个数
    n_s_bigger_than_zero = (silhouette_samples(x_true, y_predict) > 0).sum()
    print("{}/{}\n".format(n_s_bigger_than_zero, x_true.shape[0]))
    
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值