聚类
1. 聚类的概念
▶ \blacktriangleright ▶ 聚类是针对给定的样本,依据它们特征的相似度或距离,将其归并到若干个“类”或“簇”的数据分析问题。 一个类是样本的一个子集。直观上,相似的样本聚集在相同的类,不相似的样本分散在不同的类。这里,样本之间的相似度或距离起着重要作用。
▶ \blacktriangleright ▶ 聚类的目的是通过得到的类或簇来发现数据的特点或对数据进行处理,聚类属于无监督学习,因为只是根据样本的相似度或距离将其进行归类,而类或簇事先并不知道。
【聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster)】
1.1 层次聚类
层次聚类假设类别之间存在层次结构,将样本聚到层次化的类中。层次聚类有聚合(agglomerative)和分裂(divisive)方法两种,层次聚类属于硬聚类。
▶ \blacktriangleright ▶ 聚合法(自下而上,bottom-up)开始将每个样本各自分到一个类;之后将相距最近的两类合并,建立一个新的类,重复此操作直到满足停止条件;得到层次化的类别。
▶ \blacktriangleright ▶ 分裂法(自上而下,top-down)开始将所有样本分到一个类;之后将已有类中相距最远的样本分到两个新的类,重复此操作直到满足停止条件;得到层次化的类别。
1.2 k 均值聚类
k k k 均值聚类是基于中心的聚类方法,通过迭代,将样本分到 k k k 个类中,使得每个样本与其所属类的中心或均值最近;得到 k k k 个“平坦的”、非层次化的类别,构成对空间的划分。
2. 聚类中的基本概念
2.1 相似度或距离
聚类的对象是观测数据,或样本集合。假设有
n
n
n 个样本,每个样本由
m
m
m 个属性的特征向量组成。样本集合可以用矩阵
X
X
X 表示
X
=
[
x
i
j
]
m
×
n
=
[
x
11
x
12
⋯
x
1
n
x
21
x
22
⋯
x
2
n
⋮
⋮
⋮
x
m
1
x
m
2
⋯
x
m
n
]
X=[x_{ij}]_{m\times n}=\left [ \begin{matrix} x_{11} & x_{12} & \cdots & x_{1n}\\ x_{21} & x_{22} & \cdots & x_{2n}\\ \vdots & \vdots & & \vdots\\ x_{m1} & x_{m2} & \cdots & x_{mn}\\ \end{matrix} \right ]
X=[xij]m×n=⎣⎢⎢⎢⎡x11x21⋮xm1x12x22⋮xm2⋯⋯⋯x1nx2n⋮xmn⎦⎥⎥⎥⎤
矩阵的第
j
j
j 列表示第
j
j
j 个样本,
j
=
1
,
2
,
⋯
 
,
n
j=1,2,\cdots,n
j=1,2,⋯,n;第
i
i
i 行表示第
i
i
i 个属性,
i
=
1
,
2
,
⋯
 
,
m
i=1,2,\cdots,m
i=1,2,⋯,m;矩阵元素
x
i
j
x_{ij}
xij 表示第
j
j
j 个样本的第
i
i
i 个属性值,
i
=
1
,
2
,
⋯
 
,
m
;
j
=
1
,
2
,
⋯
 
,
n
i=1,2,\cdots,m;j=1,2,\cdots,n
i=1,2,⋯,m;j=1,2,⋯,n.
聚类的核心概念是相似度(similarity)或距离(distance),有多种相似度或距离的定义。因为相似度直接影响聚类的结果,所以其选择是聚类的根本问题。
在聚类中,可以将样本集合看作是向量空间中点的集合,以该空间的距离表示样本之间的相似度。常用的距离有闵可夫斯基距离,特别是欧氏距离。
2.1.1 闵可夫斯基距离
闵可夫斯基距离越大相似度越小,距离越小相似度越大。给定样本集合
X
X
X,
x
i
,
x
j
∈
X
,
X
∈
R
m
,
x
i
=
(
x
1
i
,
x
2
i
,
⋯
 
,
x
m
i
)
T
,
x
j
=
(
x
1
j
,
x
2
j
,
⋯
 
,
x
m
j
)
T
x_{i},x_{j}\in X,X\in \mathbb{R}^{m},x_{i}=(x_{1i},x_{2i},\cdots,x_{mi})^{T},x_{j}=(x_{1j},x_{2j},\cdots,x_{mj})^{T}
xi,xj∈X,X∈Rm,xi=(x1i,x2i,⋯,xmi)T,xj=(x1j,x2j,⋯,xmj)T,样本
x
i
x_{i}
xi 和样本
x
j
x_{j}
xj 的闵可夫斯基距离为:
d
i
j
=
(
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
p
)
1
p
d_{ij}=(\sum\limits_{k=1}^{m}|x_{ki}-x_{kj}|^{p})^{\frac{1}{p}}
dij=(k=1∑m∣xki−xkj∣p)p1
有
p
≥
1
p\geq1
p≥1。当
p
=
2
p=2
p=2 时称为欧氏距离(Euclidean distance),即:
d
i
j
=
(
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
2
)
1
2
d_{ij}=(\sum\limits_{k=1}^{m}|x_{ki}-x_{kj}|^{2})^{\frac{1}{2}}
dij=(k=1∑m∣xki−xkj∣2)21
当
p
=
1
p=1
p=1 时称为曼哈顿距离(Manhattan distance),即
d
i
j
=
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
d_{ij}=\sum\limits_{k=1}^{m}|x_{ki}-x_{kj}|
dij=k=1∑m∣xki−xkj∣
当
p
=
∞
p=\infty
p=∞ 时称为切比雪夫距离(Chebyshev distance),取各个坐标数值差的绝对值的最大值,即
d
i
j
=
max
k
∣
x
k
i
−
x
k
j
∣
d_{ij}=\max_{k}|x_{ki}-x_{kj}|
dij=kmax∣xki−xkj∣
2.1.2 马哈拉诺比斯距离
马哈拉诺比斯距离(Mahalanobis dustance),简称马氏距离,也是另一种常用的相似度,考虑各个分量(特征)之间的相关性并与各个分量的尺度无关。马哈拉诺比斯距离越大相似度越小,距离越小相似度越大。
给定一个样本集合
X
X
X,
X
=
(
x
i
j
)
m
×
n
X=(x_{ij})_{m\times n}
X=(xij)m×n,其协方差矩阵记作
S
S
S,样本
x
i
x_{i}
xi 与样本
x
j
x_{j}
xj 之间的马哈拉诺比斯距离为:
d
i
j
=
[
(
x
i
−
x
j
)
T
S
−
1
(
x
i
−
x
j
)
]
1
2
d_{ij}=[(x_{i}-x_{j})^{T}S^{-1}(x_{i}-x_{j})]^{\frac{1}{2}}
dij=[(xi−xj)TS−1(xi−xj)]21
其中,
x
i
=
(
x
1
i
,
x
2
i
,
⋯
 
,
x
m
i
)
T
,
x
j
=
(
x
1
j
,
x
2
j
,
⋯
 
,
x
m
j
)
T
x_{i}=(x_{1i},x_{2i},\cdots,x_{mi})^{T},x_{j}=(x_{1j},x_{2j},\cdots,x_{mj})^{T}
xi=(x1i,x2i,⋯,xmi)T,xj=(x1j,x2j,⋯,xmj)T
当
S
S
S 为单位矩阵时,即样本数据的各个分量互相独立且各个分量的方差为
1
1
1 时,马氏距离即是欧氏距离。
2.1.3 相关系数
样本之间的相似度也可以用相关系数(correlation coeefficient)来表示。相关系数的绝对值越接近于1,表示样本越相似:越接近于0,表示样本越不相似。
样本
x
i
x_{i}
xi 与样本
x
j
x_{j}
xj 之间的相关系数定义为:
r
i
j
=
∑
k
=
1
m
(
x
k
i
−
x
‾
i
)
(
x
k
j
−
x
‾
j
)
[
∑
k
=
1
m
(
x
k
i
−
x
‾
i
)
2
∑
k
=
1
m
(
x
k
j
−
x
‾
j
)
2
]
1
2
r_{ij}=\frac{\sum\limits_{k=1}^{m}(x_{ki}-\overline{x}_{i})(x_{kj}-\overline{x}_{j})}{[\sum\limits_{k=1}^{m}(x_{ki}-\overline{x}_{i})^{2}\sum\limits_{k=1}^{m}(x_{kj}-\overline{x}_{j})^{2}]^{\frac{1}{2}}}
rij=[k=1∑m(xki−xi)2k=1∑m(xkj−xj)2]21k=1∑m(xki−xi)(xkj−xj)
x
‾
i
=
1
m
∑
k
=
1
m
x
k
i
,
x
‾
j
=
1
m
∑
k
=
1
m
x
k
j
\overline{x}_{i}=\frac{1}{m}\sum\limits_{k=1}^{m}x_{ki},\overline{x}_{j}=\frac{1}{m}\sum\limits_{k=1}^{m}x_{kj}
xi=m1k=1∑mxki,xj=m1k=1∑mxkj
2.1.4 夹角余弦
样本之间的相似度也可以夹角余弦(cosine)来表示。相关系数的绝对值越接近于1,表示样本越相似:越接近于0,表示样本越不相似。
样本
x
i
x_{i}
xi 与样本
x
j
x_{j}
xj 之间的夹角余弦定义为:
s
i
j
=
∑
k
=
1
m
x
k
i
x
k
j
[
∑
k
=
1
m
x
k
i
2
∑
k
=
1
m
x
k
j
2
]
1
2
s_{ij}=\frac{\sum\limits_{k=1}^{m}x_{ki}x_{kj}}{[\sum\limits_{k=1}^{m}x_{ki}^{2}\sum\limits_{k=1}^{m}x_{kj}^{2}]^{\frac{1}{2}}}
sij=[k=1∑mxki2k=1∑mxkj2]21k=1∑mxkixkj
由上述几种不同的距离定义可以看出,不同相似度度量得到的结果并不一致。用距离度量相似度时,距离越小样本越相似;用相关系数时,相关系数越大样本越相似。
从图上可以看出,从距离的角度看, A A A 和 B B B 比 A A A 和 C C C 更相似;但从相关系数的角度看, A A A 和 C C C 比 A A A 和 B B B 更相似。足以看出,聚类时合适的距离或者相似度的选择非常重要。
2.2 类或簇
通过聚类得到的类或簇,本质是样本的子集。
▶
\blacktriangleright
▶ 如果一个聚类方法假定一个样本只能属于一个类,或类的交集为空集,那么该方法称为硬聚类(hard clustering)方法;
▶
\blacktriangleright
▶ 否则,如果一个样本可以属于多个类,或类的交集不为空集,那么该方法称为软聚类(soft clustering)方法。
用 G G G 表示类或簇(cluster),用 x i , x j x_{i},x_{j} xi,xj 表示类中的样本,用 n G n_{G} nG 表示 G G G 中样本的个数,用 d i j d_{ij} dij 表示样本 x i x_{i} xi 与样本 x j x_{j} xj 之间的距离。类或簇有多种定义。
★
\bigstar
★ 定义 1 设
T
T
T 为给定的正数,若集合
G
G
G 中任意两个样本
x
i
,
x
j
x_{i},x_{j}
xi,xj,有
d
i
j
≤
T
d_{ij}\leq T
dij≤T
则称
G
G
G 为一个类或簇
★
\bigstar
★ 定义 2 设
T
T
T 为给定的正数,若对集合
G
G
G 中任意两个样本
x
i
x_{i}
xi,一定存在
G
G
G 中的另一个样本
x
j
x_{j}
xj,使得
d
i
j
≤
T
d_{ij}\leq T
dij≤T
则称
G
G
G 为一个类或簇
★
\bigstar
★ 定义 3 设
T
T
T 为给定的正数,若对集合
G
G
G 中任意两个样本
x
i
x_{i}
xi
G
G
G 中的另一个样本
x
j
x_{j}
xj,满足
1
n
G
−
1
∑
x
j
∈
G
d
i
j
≤
T
\frac{1}{n_{G}-1}\sum\limits_{x_{j}\in G}d_{ij}\leq T
nG−11xj∈G∑dij≤T
其中
n
G
n_{G}
nG 为
G
G
G 中样本的个数,则称
G
G
G 为一个类或簇
★
\bigstar
★ 定义 4 设
T
T
T 和
T
T
T 为给定的两个正数,若集合
G
G
G 中任意两个样本
x
i
,
x
j
x_{i},x_{j}
xi,xj 的距离
d
i
j
d_{ij}
dij 满足
1
n
G
(
n
G
−
1
)
∑
x
i
∈
G
∑
x
j
∈
G
d
i
j
≤
T
d
i
j
≤
T
\frac{1}{n_{G}(n_{G}-1)}\sum\limits_{x_{i}\in G}\sum\limits_{x_{j}\in G}d_{ij}\leq T\\d_{ij}\leq T
nG(nG−1)1xi∈G∑xj∈G∑dij≤Tdij≤T
则称
G
G
G 为一个类或簇
类的特征可以通过不同角度来刻画,常用的特征有下面三种:
1)类的均值
x
‾
G
\overline{x}_{G}
xG ,又称为类的中心
x
‾
G
=
1
n
G
∑
i
=
1
n
G
x
i
\overline{x}_{G}=\frac{1}{n_{G}}\sum\limits_{i=1}^{n_{G}}x_{i}
xG=nG1i=1∑nGxi
式中
n
G
n_{G}
nG 是类
G
G
G 的样本个数
2)类的直径(diameter)
D
G
D_{G}
DG
类的直径
D
G
D_{G}
DG 是类中任意两个样本之间的最大距离,即
D
G
=
max
x
i
,
x
j
∈
G
d
i
j
D_{G}=\max_{x_{i},x_{j}\in G}d_{ij}
DG=xi,xj∈Gmaxdij
3)类的样本散布矩阵(scatter matrix)
A
G
A_{G}
AG 与样本协方差矩阵(covariance matrix)
S
G
S_{G}
SG,
类的样本散布矩阵
A
G
A_{G}
AG 为
A
G
=
∑
i
=
1
n
G
(
x
i
−
x
‾
G
)
(
x
i
−
x
‾
G
)
T
A_{G}=\sum\limits_{i=1}^{n_{G}}(x_{i}-\overline{x}_{G})(x_{i}-\overline{x}_{G})^{T}
AG=i=1∑nG(xi−xG)(xi−xG)T
样本协方差矩阵
S
G
S_{G}
SG 为
S
G
=
1
m
−
1
A
G
=
1
m
∑
i
=
1
n
G
(
x
i
−
x
‾
G
)
(
x
i
−
x
‾
G
)
T
S_{G}=\frac{1}{m-1}A_{G}\\=\frac{1}{m}\sum\limits_{i=1}^{n_{G}}(x_{i}-\overline{x}_{G})(x_{i}-\overline{x}_{G})^{T}
SG=m−11AG=m1i=1∑nG(xi−xG)(xi−xG)T
其中
m
m
m 为样本的维数(样本属性的个数)
2.3 类与类之间的距离
类
G
p
G_{p}
Gp 与类
G
q
G_{q}
Gq 之间的距离
D
(
p
,
q
)
D(p,q)
D(p,q),也称为连接(linkage)。
设类
G
p
G_{p}
Gp 包含
n
p
n_{p}
np 个样本,
G
q
G_{q}
Gq 包含
n
q
n_{q}
nq 个样本,分别用
x
‾
p
\overline{x}_{p}
xp 和
x
‾
q
\overline{x}_{q}
xq 表示
G
p
G_{p}
Gp 和
G
q
G_{q}
Gq 的均值,即类的中心。
1)最短距离或单连接(single linkage)
定义类
G
p
G_{p}
Gp 的样本与类
G
q
G_{q}
Gq 的样本之间的最短距离为两类之间的距离:
D
p
q
=
m
i
n
{
d
i
j
∣
x
i
∈
G
p
,
x
j
∈
G
q
}
D_{pq}=min\{d_{ij}|x_{i}\in G_{p},x_{j}\in G_{q}\}
Dpq=min{dij∣xi∈Gp,xj∈Gq}
2)最长距离或完全连接(complete linkage)
定义类
G
p
G_{p}
Gp 的样本与类
G
q
G_{q}
Gq 的样本之间的最长距离为两类之间的距离:
D
p
q
=
m
a
x
{
d
i
j
∣
x
i
∈
G
p
,
x
j
∈
G
q
}
D_{pq}=max\{d_{ij}|x_{i}\in G_{p},x_{j}\in G_{q}\}
Dpq=max{dij∣xi∈Gp,xj∈Gq}
3)中心距离
定义类
G
p
G_{p}
Gp 与类
G
q
G_{q}
Gq 的中心
x
‾
p
\overline{x}_{p}
xp 与
x
‾
q
\overline{x}_{q}
xq 之间的距离为两类之间的距离:
D
p
q
=
d
x
‾
p
x
‾
q
D_{pq}=d_{\overline{x}_{p}\overline{x}_{q}}
Dpq=dxpxq
4)平均距离
定义类
G
p
G_{p}
Gp 与类
G
q
G_{q}
Gq 的任意两个样本之间距离的平均值为两类之间的距离:
D
p
q
=
1
n
p
n
q
∑
x
i
∈
G
p
∑
x
j
∈
G
q
d
i
j
D_{pq}=\frac{1}{n_{p}n_{q}}\sum\limits_{x_{i}\in G_{p}}\sum\limits_{x_{j}\in G_{q}}d_{ij}
Dpq=npnq1xi∈Gp∑xj∈Gq∑dij
3. 聚合聚类
聚合聚类的具体过程如下:对于给定的样本集合,开始将每个样本分到一个类;然后按照一定规则,例如类间距离最小,将最满足规则条件的两个类进行合并;如此反复进行,每次减少一个类,直到满足停止条件,如所有样本聚成一类。
聚合聚类需要预先确定下面三个要素:
- 距离或相似度
- 合并规则
- 停止条件
根据这些要素的不同组合,就可以构成不同的聚类方法。
距离或相似度可以是闵可夫斯基距离。马哈拉诺比斯距离、相关系数、夹角余弦、、
合并规则一般是类间距离最小,类间距离可以是最短距离、最长距离、中心距离、平均距离。
停止条件可以是类的个数达到阈值(极端情况类的个数是1)、类的直径超过阈值。
聚合聚类程序
若采用欧氏距离为样本之间的距离;类间距离最小作为合并规则,其中最短距离为类间距离;类的个数是1,即所有样本聚为一类,为停止条件。则
输入:n 个样本组成的样本集合即样本之间的距离
输出:对样本集合的一个层次化聚类
(1)计算 n 个样本两两之间的欧氏距离 d_{ij},记作矩阵D=[d_{ij}]_{m*n}
(2)构造 n 个类,每个类只包含一个样本
(3)合并类间距离最小的两个类,其中最短距离为类间距离,构建一个新类
(4)计算新类与当前各类的距离。若类的个数为 1 ,终止计算,否则返回(3)
聚合层次聚类算法的复杂度是 O ( n 3 m ) O(n^{3}m) O(n3m),其中 m m m 是样本的维数, n n n 是样本个数
4. k 均值聚类
k k k 均值聚类是基于样本集合划分的聚类算法。 k k k 均值聚类将样本集合划分为 k k k 个子集,构成 k k k 个类,将 n n n 个样本分到 k k k 个类中,每个样本到其所属类别的中心的距离最小。每个样本只能属于一个类,所以 k k k 均值聚类是硬聚类。
4.1 模型
4.2 策略
4.3 算法
>>>from sklearn.cluster import KMeans
>>>from sklearn.metrics import silhouette_samples, silhouette_score
>>>import numpy as np
>>>X = np.array([[1, 2], [1, 4], [1, 0],
[4, 2], [4, 4], [4, 0]])
>>>kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
# 训练模型,默认为'k-means ++':以智能方式为k均值聚类选择初始聚类中心,以加速收敛。
>>>print(kmeans.labels_)
[0 0 0 1 1 1] # 每个点的标签
>>>print(kmeans.cluster_centers_)
[[1. 2.]
[4. 2.]] # 集群中心的坐标
>>>print(kmeans.inertia_)
16.0 # 样本到其最近聚类中心的平方距离之和。
>>>print(kmeans.predict([[0, 0], [4, 4]]))
[0 1] # 预测X中每个样本所属的最近集群。
>>>print(kmeans.transform([[0, 0], [4, 4]]))
[[2.23606798 4.47213595]
[3.60555128 2. ]] # 将X转换为簇距离空间。
"""
功能:K均值聚类
说明:提前设置函数模型为2类
"""
"""
导入项目所需的包
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import KMeans
# 使用交叉验证的方法,把数据集分为训练集合测试集
from sklearn.model_selection import train_test_split
# 加载数据集
def load_data():
iris = datasets.diabetes()
"""展示数据集的形状
diabetes.data.shape, diabetes.target.shape
"""
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.10, random_state=0)
return X_train, X_test, y_train, y_test
# 使用KMeans考察线性分类KMeans的预测能力
def test_KMeans(X_train,X_test,y_train,y_test):
# 选择模型,把数据交给模型训练
y_pred = KMeans(n_clusters=2, random_state=0).fit_predict(X_train)
"""绘图"""
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(X_train[:, 2], X_train[:, 3], c=y_pred)
ax.set_xlabel("data")
ax.set_ylabel("target")
ax.set_title("K-means")
ax.legend(framealpha=0.5)
plt.show()
return
if __name__=="__main__":
X_train,X_test,y_train,y_test=load_data() # 生成用于分类的数据集
test_KMeans(X_train,X_test,y_train,y_test) # 调用 test_KMeans
4.4 算法特性
4.4.1 总体特点
4.4.1 收敛性
4.4.1 初始类的选择
4.4.1 类别数 k 的选择
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
X, y = make_blobs(n_samples=500,
n_features=2,
centers=4,
cluster_std=1,
center_box=(-10.0, 10.0),
shuffle=True,
random_state=1) # 导入数据集
range_n_clusters = [2, 3, 4, 5, 6]
for n_clusters in range_n_clusters:
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_size_inches(18, 7)
ax1.set_xlim([-0.1, 1])
# 给轮廓之间留出 (n_clusters+1)*10 的空间
ax1.set_ylim([0, len(X) + (n_clusters + 1) * 10])
# K_means聚类
clusterer = KMeans(n_clusters=n_clusters, random_state=10)
cluster_labels = clusterer.fit_predict(X)
# 计算平均轮廓系数
silhouette_avg = silhouette_score(X, cluster_labels)
print("For n_clusters =", n_clusters,
"The average silhouette_score is :", silhouette_avg)
# 计算每个样本的轮廓系数
sample_silhouette_values = silhouette_samples(X, cluster_labels)
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()
print(ith_cluster_silhouette_values)
size_cluster_i = ith_cluster_silhouette_values.shape[0]
y_upper = y_lower + size_cluster_i
# cm.nipy_spectral是颜色映射的杂项色
color= cm.nipy_spectral(float(i) / n_clusters)
# 在x轴之间进行颜色填充颜色填充,第一个参数是y值,第二三个参数是x值,在这两个值之间进行颜色填充
ax1.fill_betweenx(np.arange(y_lower, y_upper),
0, ith_cluster_silhouette_values,
facecolor=color, edgecolor=color, alpha=0.7)
# text可以在任意位置添加文字
ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))
y_lower = y_upper + 10
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="--")
ax1.set_yticks([]) # Clear the yaxis labels / ticks
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='.', s=30, lw=0, alpha=0.7,
c=colors, edgecolor='k')
# 画出聚类中心点
centers = clusterer.cluster_centers_
ax2.scatter(centers[:, 0], centers[:, 1], marker='o',
c="white", alpha=1, s=200, edgecolor='k')
# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
for i, c in enumerate(centers):
ax2.scatter(c[0], c[1], marker='$%d$' % i, alpha=1,
s=50, edgecolor='k')
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 = %d" % n_clusters),
fontsize=14, fontweight='bold')
plt.show()