机器学习之K均值的SSE和轮廓系数

前文回顾:
肘部法:SSE误差平方和
SSE(sum of the squared errors)是对簇松散度的衡量,作为目标函数其实是一个严格的坐标下降(Coordinate Decendet)过程。SSE不能保证找到全局最优解,只能确保局部最优解。也就是说,可能会造成多种 k 个簇的划分情况。但是可以重复执行几次kmeans算法,选取SSE最小的一次作为最终的聚类结果。
轮廓系数法(Silhouette Coefficient)
轮廓系数法结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。
指标:内部距离最小化,外部距离最大化。平均轮廓系数的取值范围为[-1,1],系数越大,聚类效果越好。
每次聚类后,每个样本都会得到一个轮廓系数,当它为1时,说明这个点与周围簇距离较远,结果非常好,当它为0,说明这个点可能处在两个簇的边界上,当值为负时,暗含该点可能被误分了。

Sklearn代码实现

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import datasets, metrics


def km_sse_cs():
    """
    KMeans算法效果评价
    1、簇内误方差(SSE, sum of the squared errors),手肘法,肘部法,其大小表明函数拟合的好坏。
    使用图形工具肘部法,根据簇的数量来可视化簇内误方差。下降率突然变缓时即认为是最佳的k值(拐点)。
    当KMeans算法训练完成后,可以通过使用内置inertia属性来获取簇内的误方差。
    2、轮廓系数法(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation)
    平均轮廓系数的取值范围为[-1,1],系数越大,聚类效果越好。当值为负时,暗含该点可能被误分了。
    :return:
    """
    sample = load_data()
    data = sample.data
    # 存放设置不同簇数时的SSE值
    sse_list = []
    # 轮廓系数
    silhouettes = []
    # 循环设置不同的聚类簇数
    for i in range(2, 15):
        model = KMeans(n_clusters=i)
        model.fit(data)
        # kmeans算法inertia属性获取簇内的SSE
        sse_list.append(model.inertia_)
        # 轮廓系数
        silhouette = metrics.silhouette_score(data, model.labels_, metric='euclidean')
        silhouettes.append(silhouette)

    # 绘制簇内误方差曲线
    plt.subplot(211)
    plt.title('KMeans 簇内误方差')
    plt.plot(range(2, 15), sse_list, marker='*')
    plt.xlabel('簇数量')
    plt.ylabel('簇内误方差(SSE)')
    # 绘制轮廓系数曲线
    plt.subplot(212)
    plt.title('KMeans 轮廓系数')
    plt.plot(range(2, 15), silhouettes, marker='o')
    plt.xlabel('簇数量')
    plt.ylabel('轮廓系数')

    plt.tight_layout()
    plt.show()


def load_data():
    """
    加载鸢尾花数据集
    """
    return datasets.load_iris()


if __name__ == '__main__':
    import matplotlib as mpl

    # 汉字字体,优先使用楷体,如果找不到楷体,则使用黑体
    mpl.rcParams['font.sans-serif'] = ['KaiTi', 'SimHei', 'FangSong']

    # KMeans算法
    km_sse_cs()

运行效果图,如下:
sse-cs
通过SSE图可明显看出拐点(肘部)的簇数量是3,与鸢尾花数据集的类别是吻合的。

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值