1. 常用查询
1.1 Kmeans常用参数列表
常用参数 | 含义 |
---|---|
n_clusters | 要划分的簇数,可不填,默认8 |
init | 默认‘kmeans++’ |
n_init | 使用不同的质心随机初始化的种子来运行kmeans算法的次数,默认10 |
max_iter | 最大迭代次数么,默认300 |
tol | 两次迭代之间inertia的变化量,如果两次迭代之间inertia下降的值小于tol设定的值,迭代就会停止 |
precompute_distances | ‘auto’,True,False,默认’auto’,表示是否预先计算距离 |
random_state | 确定质心初始化的随机数生成,整数,默认None |
1.2 Kmeans属性列表
属性 | 含义 |
---|---|
cluster_centers | 收敛到的质心 |
labels | 每个样本点对应的标签 |
inertia | 簇内平方和 |
n_iter_ | 实际迭代的次数 |
1.3 Kmeans接口列表
接口 | 输入 | 功能/返回 |
---|---|---|
fit | 拟合模型,计算Kmeans的聚类结果 | |
fit_predict | 返回每个样本对应的簇的索引,相当于先fit,再predict | |
fit_transform | 返回新空间中的特征矩阵,相当于先fit,再transform | |
get_params | 获取该类的参数 | |
predict | 预测每个测试集X中的样本的所在簇,并返回每个样本所对应的簇的索引 | |
score | 返回聚类后的inertia,即簇内平方和的负数,越小越好,最佳值为0 | |
set_params | 为建好的类重设参数 | |
transform | 将X转换到簇距离空间中,在新空间中,每个维度是样本点到集群中心的距离 |
2. 使用方法(实例)
2.1 生成数据集
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
## 有标签y
x,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
plt.scatter(x[:,0],x[:,1],
marker='o', ## 点的形状
s=8 ##点的大小
)
plt.show()
2.2 导入kmeans算法
from sklearn.cluster import KMeans
n_clusters=4
cluster=KMeans(n_clusters=n_clusters,random_state=0).fit(x)
返回每个样本所对应的簇的标签 ↓
y_pred=cluster.fit_predict(x) ## 每个样本所对应的簇的标签
y_pred
返回质心坐标 ↓
centroid=cluster.cluster_centers_ ## 返回质心
centroid
返回聚类后的簇内平方和 ↓
inertia=cluster.inertia_ ## 返回SSE
inertia
可视化 ↓
color=['green','yellow','blue','red']
for i in range(n_clusters):
plt.scatter(x[y_pred==i,0],x[y_pred==i,1],
marker='o',
s=8,
c=color[i])
plt.scatter(centroid[:,0],centroid[:,1],
marker='x',
s=35,
c='black')
plt.show()
2.3 评价指标
2.3.1 有标签时
普通互信息 / 调整的互信息 / 标准化互信息
# 评价指标 有标签时
from sklearn.metrics import adjusted_mutual_info_score ##普通互信息
from sklearn.metrics import mutual_info_score ## 调整的互信息
from sklearn.metrics import normalized_mutual_info_score ## 标准化互信息
me=adjusted_mutual_info_score(y_pred,y) # 有标签时,以普通互信息作为评估指标
me
调整兰德系数 ARI
from sklearn.metrics import adjusted_rand_score #调整兰德系数
me=adjusted_rand_score(y_pred,y)
me
2.3.2 无标签时
轮廓系数
在sklearn中,使用模块metrics中的类silhouette_score来计算轮廓系数,它返回的是一个数据集中,所有样本的轮廓系数的均值。但我们还有同在metrics模块中的silhouette_sample,它的参数与轮廓系数一致,但返回的 是数据集中每个样本自己的轮廓系数。
# 评价指标 无标签
## 轮廓系数
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples
silhouette_score(x,y_pred) # 返回轮廓系数
silhouette_score(x,cluster.labels_) #与上面一样
#silhouette_samples(x,y_pred) # 返回每个样本自己的轮廓系数
2.4 通过轮廓系数来选择合适的K
暂时忽略
2.5 实例:Kmeans的矢量量化应用
矢量量化的降维是在同等样本量上压缩信息的大小,即不改变特征 的数目也不改变样本的数目,只改变在这些特征下的样本上的信息量.
对一张图片进行矢量量化
将一张图片的9万种颜色聚类成64类,使用64个簇的质心来代替全部的9万种颜色
2.5.1 导入需要的库
## kmeans矢量量化
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle
import pandas as pd
2.5.2 导入图片
china=load_sample_image('china.jpg')
china.shape
plt.figure(figsize=(15,15))
plt.imshow(china)
2.5.3 探索图像
newimage=china.reshape((427*640,3)) #一共有273280个像素
pd.DataFrame(newimage).drop_duplicates().shape ##去掉重复的颜色值,有96615种颜色
显示图像
plt.figure(figsize=(15,15))
plt.imshow(china)
2.5.4 对图像进行处理
n_clusters=64
china=np.array(china,dtype=np.float64)/china.max() ##归一化处理
w,h,d=original_shape=tuple(china.shape)
assert d==3 ## 要求d必须为3,否则就报错
2.5.5 形成特征矩阵
image_array=np.reshape(china,(w*h,d))
image_array
image_array.shape
2.5.6 建立Kmeans模型
image_array_sample=shuffle(image_array,random_state=0)[:1000] ##随机抽取1000个数据找出质心
kmeans=KMeans(n_clusters=n_clusters,random_state=0).fit(image_array_sample) ### 根据上一步的1000个数据拟合kmeans,找出质心
kmeans.cluster_centers_ ## 质心
labels=kmeans.predict(image_array) ## 按照已存在的质心对所有数据进行聚类
labels.shape
## 用质心替换所有的样本
image_kmeans=image_array.copy()
for i in range(w*h):
image_kmeans[i]=kmeans.cluster_centers_[labels[i]]
image_kmeans
2.5.7 显示矢量化后的图像
image_kmeans=image_kmeans.reshape(w,h,d)
image_kmeans.shape
plt.figure(figsize=(10,10))
plt.axis('off')
plt.imshow(image_kmeans)
参考:菜菜的sklearn课堂