sklearn课堂之K-means算法的使用总结

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课堂

  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值