我曾在机器学习之聚类算法应用篇中介绍过,聚类算法常使用轮廓系数来评估聚类效果,不过有时候并不是轮廓系数越大越好,如下面两幅图所示,图中的红色虚线表示聚类系数分数:

显然将簇数据设置为2的时候得到的轮廓系数最高,达到了0.705分,但是这并不一定是最好的聚类结果,显然在这个测试集中,我们有4个簇。为了将各个簇的轮廓系数以可视化的形式展现出来,辅助决策聚类参数,【机器学习】菜菜的sklearn课堂06 - 聚类算法与KMeans 中提供了对应的代码,能够绘制上面的可视化图,带有详细注释的代码见最后。

另外我已经将两份聚类可视化的代码封装,方便调参以及调用。

cluster_algos.py

第一份代码是做各个聚类算法对比的cluster_algos.py:

# 不同聚类算法结果对比
from sklearn.datasets import make_circles
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans, DBSCAN, SpectralClustering, Birch, MeanShift, AgglomerativeClustering
from sklearn.metrics import silhouette_score, silhouette_samples
from sklearn.decomposition import PCA
import pandas as pd
import time
import functoolsdef time_cost(func):@functools.wraps(func)def wrapper(*args, **kwargs):t0 = time.time()func(*args, **kwargs)t1 = time.time()print(args[0],':%.2fs' % (t1 - t0))return func(*args, **kwargs), t1 - t0return wrapperdef load_data(file):assert file != ''df = pd.read_csv(file)x = df.valuespca = PCA(n_components=2)pca_result = pca.fit_transform(x)return x, pca_result@time_cost
def cluster_function(model_name, model, data):y_pred = model.fit_predict(data)return y_predif __name__ == '__main__':model_list = {"AgglomerativeClustering": AgglomerativeClustering(n_clusters = 4),"KMeans": KMeans(n_clusters = 4, random_state=10),"DBSCAN": DBSCAN(eps=0.1),"Birch": Birch(n_clusters=4),"SpectralClustering": SpectralClustering(n_clusters = 4, random_state=10),"MeanShift": MeanShift()}x, pca_result = load_data('./data.csv')i = 1fig = plt.figure(figsize=(15,10))for model in model_list:fig.add_subplot(2,3,i)result = cluster_function(model, model_list[model], x)plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=result[0])plt.title("{}({})".format(model, silhouette_score(x, result[0])))plt.text(.99, .01, ('%.2fs' % (result[1])).lstrip('0'), transform=plt.gca().transAxes, horizontalalignment='right')i += 1plt.show()

其生成结果如下图所示:

clusters_test

第二份代码用于测试给定聚类算法情况下簇的个数的选择对结果的影响

# 不同簇个数聚类结果对比
from sklearn.datasets import make_circles
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans, DBSCAN, SpectralClustering, Birch, MeanShift, AgglomerativeClustering
from sklearn.metrics import silhouette_score, silhouette_samples
from sklearn.decomposition import PCA
import pandas as pd
import time
import functools
import matplotlib.cm as cmdef cluster_test(model_name, model, X, clusters_list = [2,3,4,5,6,7]):for n_clusters in clusters_list:if hasattr(model, "n_clusters"):model.set_params(n_clusters = n_clusters)elif len(clusters_list) >= 2 and n_clusters == clusters_list[1]:print("{} do not have parameter 'n_clusters', return automatically.".format(model_name))returnfig, (ax1, ax2) = plt.subplots(1, 2)fig.set_size_inches(18, 7)ax1.set_xlim([-0.1, 1])ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])clusterer, t = cluster_function(model_name, model, X)cluster_labels = clusterer.labels_silhouette_avg = silhouette_score(X, cluster_labels)print("For n_clusters = ", n_clusters, " the average silhoutte_score is ", silhouette_avg)sample_silhouette_values = silhouette_samples(X, cluster_labels)y_lower = 10for i in range(n_clusters):ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]ith_cluster_silhouette_values.sort()size_cluster_i = ith_cluster_silhouette_values.shape[0]y_upper = y_lower + size_cluster_icolor = cm.nipy_spectral(float(i) / n_clusters)ax1.fill_betweenx(np.arange(y_lower, y_upper), ith_cluster_silhouette_values, facecolor = color, alpha = 0.7)ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))y_lower = y_upper + 10ax1.set_title("The silhouette plot for the various clusters")ax1.set_xlabel("The silhouette coefficient values")ax1.set_ylabel("Cluster label")ax1.axvline(x = silhouette_avg, color = 'red', linestyle = "--")ax1.set_yticks([])ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)ax2.scatter(pca_result[:,0], pca_result[:,1], marker = 'o', s = 8, c = colors)if hasattr(clusterer, 'cluster_centers_'):centers = clusterer.cluster_centers_ax2.scatter(centers[:, 0], centers[:, 1], marker = 'x', c = 'red', alpha = 1, s = 200)ax2.text(.99, .01, ('%.2fs' % (t)).lstrip('0'), transform=plt.gca().transAxes, size=12,horizontalalignment='right')ax2.set_title("The visualization of the clustered data")ax2.set_xlabel("Feature space for the 1st feature")ax2.set_ylabel("Feature space for the 2nd feature")plt.suptitle("Silhouette analysis for {} clustering on sample data with n_clusters = {} ({})".format(model_name, n_clusters, silhouette_avg), fontsize = 14, fontweight="bold")plt.show()def time_cost(func):@functools.wraps(func)def wrapper(*args, **kwargs):t0 = time.time()func(*args, **kwargs)t1 = time.time()return func(*args, **kwargs), t1 - t0return wrapper@time_cost
def cluster_function(model_name, model, data):model = model.fit(data)return modeldef load_data(file):assert file != ''df = pd.read_csv(file)x = df.valuespca = PCA(n_components=2)pca_result = pca.fit_transform(x)return x, pca_result# 加载数据
x, pca_result = load_data('data.csv')cluster_test("AgglomerativeClustering", AgglomerativeClustering(), x)

绘图代码详细解释

此原始代码来自【机器学习】菜菜的sklearn课堂06 - 聚类算法与KMeans

import numpy as np
import matplotlib.cm as cm
from sklearn.metrics import silhouette_score, silhouette_samples
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeansX, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state = 1)for n_clusters in [2,3,4,5,6,7]:n_clusters = n_clusters# 创建画布,画布上共有一行两列两个子图fig, (ax1, ax2) = plt.subplots(1, 2)# 画布尺寸fig.set_size_inches(18, 7)ax1.set_xlim([-0.1, 1])ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])# 聚类clusterer = KMeans(n_clusters = n_clusters, random_state = 10).fit(X)cluster_labels = clusterer.labels_# 使用轮廓系数分数silhouette_avg = silhouette_score(X, cluster_labels)print("For n_clusters = ", n_clusters, " the average silhoutte_score is ", silhouette_avg)# 调用silhouette_samples,返回每个样本点的轮廓系数,这就是我们的横坐标sample_silhouette_values = silhouette_samples(X, cluster_labels)# 设定y轴上的初始取值y_lower = 10# 对每一个簇进行循环for i in range(n_clusters):# 从每个样本的轮廓系数中抽取出第i个簇的轮廓系数,并对他进行排序ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]# 排序ith_cluster_silhouette_values.sort()# 查看这个簇中有多少个样本size_cluster_i = ith_cluster_silhouette_values.shape[0]# 这一个簇在y轴上从上往下画图的起点y_upper = y_lower + size_cluster_i# colormap库中的,使用小数来调用颜色的函数color = cm.nipy_spectral(float(i) / n_clusters)ax1.fill_betweenx(np.arange(y_lower, y_upper), ith_cluster_silhouette_values, facecolor = color, alpha = 0.7)# 为每个簇的轮廓系数写上簇的编号ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))# 为下一个簇计算新的y周上的初始值y_lower = y_upper + 10# 给图1加上标题ax1.set_title("The silhouette plot for the various clusters")ax1.set_xlabel("The silhouette coefficient values")ax1.set_ylabel("Cluster label")# 把整个数据集上的轮廓系数的均值以虚线的形式放入我们的图中ax1.axvline(x = silhouette_avg, color = 'red', linestyle = "--")# 让y轴不显示任何刻度ax1.set_yticks([])# 设置x轴刻度ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])# 开始对第二个图进行处理colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)ax2.scatter(X[:,0], X[:,1], marker = 'o', s = 8, c = colors)# 把生成的质心放到图像中去centers = clusterer.cluster_centers_ax2.scatter(centers[:, 0], centers[:, 1], marker = 'x', c = 'red', alpha = 1, s = 200)# 为图二设置标题ax2.set_title("The visualization of the clustered data")ax2.set_xlabel("Feature space for the 1st feature")ax2.set_ylabel("Feature space for the 2nd feature")# 为整个图设置标题plt.suptitle("Silhouette analysis for KMeans clustering on sample data with n_clusters = {}".format(n_clusters), fontsize = 14, fontweight="bold")plt.show()

(完)

机器学习之聚类算法——聚类效果评估可视化相关推荐

  1. 机器学习入门(九):非监督学习:5种聚类算法+2种评估模型

    机器学习入门专栏其他章节: 机器学习入门(一)线性回归 机器学习入门(二)KNN 机器学习入门(三)朴素贝叶斯 机器学习入门(四)决策树 机器学习入门(五)集成学习 机器学习入门(六)支持向量机 机器 ...

  2. 机器学习:聚类算法的模型评估指标:轮廓系数

    不同于分类模型和回归,聚类算法的模型评估不是一件简单的事. 在分类中,有直接结果(标签)的输出,并且分类的结果有正误之分,所以使用预测的准确度,混淆矩阵,ROC曲线等指标来进行评估.但无论如何评估,都 ...

  3. 密度聚类算法DBSCAN实战及可视化分析

    密度聚类算法DBSCAN实战及可视化分析 目录 密度聚类算法DBSCAN实战及可视化分析 DBSCAN实战及聚类效果可视化 构建分类算法获得预测推理能力 DBSCAN实战及聚类效果可视化 DBSCAN ...

  4. 人工智能-聚类算法、误差评估、算法优化、特征降维

    1.聚类算法简介 典型的无监督算法,主要用于将相似的样本自动归到一个类别中. 根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果.常用的相似度计算方法是欧式 ...

  5. 机器学习算法的效果评估和优化方法

    当我们运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以做什么? 1.获得更多的训练实例--通常是有效的,但代价较大,下面的方法也可能有效,可考虑先采用下面的几种方法. 2.尝试减 ...

  6. 基于KMeans聚类的协同过滤推荐算法推荐原理、过程、代码实现 Canopy聚类算法 KMeans+Canopy聚类算法 聚类算法程序实现 KMEans聚类算法代码java

    基于KMeans聚类的协同过滤推荐算法可运用于基于用户和基于项目的协同过滤推荐算法中,作为降低数据稀疏度和提高推荐准确率的方法之一,一个协同过滤推荐过程可实现多次KMeans聚类. 一.基于KMean ...

  7. [学习笔记] [机器学习] 8. 聚类算法(聚类算法:K-means、K-means++;聚类算法评估;特征降维:特征选择(Pearson相关系数、Spearman相关系数)、PCA主成分分析)

    视频链接 数据集下载地址:无需下载 1. 聚类算法简介 学习目标: 掌握聚类算法实现过程 知道 K-means 算法原理 知道聚类算法中的评估模型 说明 K-means 的优缺点 了解聚类中的算法优化 ...

  8. [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. 机器学习7—聚类算法之K-means算法

    K-均值算法(K-means) 前言 聚类算法模型 常见的聚类算法 一.K-means算法描述 二.示例说明K-means算法流程 三.K-means算法中Kmean()函数说明 四.K-means算 ...

最新文章

  1. 开源 java CMS - FreeCMS2.8 数据对象 guestbook
  2. python最快的循环方法_【转】【Python效率】五种Pandas循环方法效率对比
  3. Algs4-1.4.42问题规模
  4. LeetCode 759. 员工空闲时间(排序)
  5. 视频问答兴起,多跳问答热度衰退,92篇论文看智能问答的发展趋势
  6. 超级菜菜鸟全程架站攻略(Mysql+Apche+PHP+Phpmyadmin+Zend,含本机安装)
  7. Concepts in Games Development(游戏开发概述) 公开课笔记
  8. leetcode数组相关
  9. 什么时候使用resulttype_柳州站东广场到底什么时候可以使用?
  10. [汇编学习笔记][第十六章直接定址表]
  11. find 排除_排列五248期定位预测,大师排除两头两尾
  12. Python学习之路23-文本和字节序列
  13. SICP-Notes-Lecture 19 Macros
  14. 欧洲中世纪名剑兵器谱
  15. 如何正确创建电子邮件通讯(逐步)
  16. android之基于百度语音合讯飞语音识别的语音交互
  17. 安卓期末大作业——Android数独游戏
  18. 关闭ubuntu18.04软键盘及多指操作
  19. 字库芯片学习之汉字内码
  20. openstack-horizon

热门文章

  1. 开放式运动耳机好不好用,五款最好用的骨传导耳机推荐
  2. 申请了雅虎邮箱的全新域名@yahoo.cn ID
  3. cuda C++ cuFloatComplex/cufftComplex/复数 exp
  4. Lua 实现Get Set属性
  5. 双阶乘java,超级公式计算器-官方版合集下载-多特
  6. SUSE(Linux操作系统)
  7. python数学公式识别_python用re正则表达式实现数学公式计算
  8. 关于某normal大学数据库登录的一个尝试
  9. oracle中rebuild,ORACLE中index的rebuild(转)
  10. 肖 sir_就业课__011性能测试讲解