1、导库
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm # colormap
import numpy as np
# 基于我们的轮廓系数来选择最佳的n_clusters
# 想要知道每个聚出来的类的轮廓系数是多少,还想要一个各个类之间的轮廓系数的对比
# 想知道聚类完毕之后图像的分布是什么模样
2、创建数据
# 创建数据,make_blobs的用法可参考之前的一篇博客。
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
3、将函数包装,选取最佳n_clusters
for n_clusters in [2,3,4,5,6,7]:
# 先设定我们要分成的蔟数
n_clusters = n_clusters
# 创建一个画布,画布上共有一行两列两个图
fig, (ax1, ax2) = plt.subplots(1, 2)
# 画布尺寸,两个子图宽度共18,高度为7
fig.set_size_inches(18, 7)
# 第一图是我们的轮廓系数图像,是由各个蔟的轮廓系数组成的横向条形图
# 横向条形图的横坐标是我们的轮廓系数取值,横坐标是我们的每个样本,因为轮廓系数是对每一个样本进行计算的
# 首先要来设定横坐标
# 轮廓系数的取值在【-1,1】,但我们至少希望轮廓系数是大于0的
# 太长的横坐标不利于我们的可视化,所以只设定x的取值范围在[-0.1,1]之间
ax1.set_xlim([-0.1, 1]) # 设置横坐标
# 接下来就是设定纵坐标,通常来说,纵坐标是从0开始,最大取值到X.shape[0]的取值
# 但我们希望,每个蔟都能排在一起,不同的蔟之间有一定的空隙
# 以便观察不同的条形图聚成的块,理解它对应了哪一个蔟
# 因此,我们在设