专题六 聚类算法KMeans

一、概述

1、无监督学习:训练时只需要一个特征矩阵x,不需要标签y,例如PCA

2、聚类(无监督分类)VS 分类
1)在已经知晓的类别上,给未知的样本标上标签(分类);在完全不知道标签的情况下,探索分布上的分类(聚类)
2)分类结果确定,聚类结果不确定

3、sklearn中的聚类算法(类和函数两种表现形式)输入数据可以是标准特征矩阵,也可以是相似性矩阵(行和列都是n_samples),可以使用sklearn.metric.pairwise模块中函数获取相似性矩阵

4、簇中所有数据坐标均值为这个簇的质心坐标,簇k是一个超参数,kmeans追求的是能让簇内平方和inertia最小的质心(最优化问题,逻辑回归也是最优化问题)

5、KMeans算法时间复杂度为O(knT),k为簇数,n为样本数,T为迭代次数,但这种算法很慢,但是最快的聚类算法,最擅长一堆一堆分开的数据。

二、sklearn.cluster.KMeans

1、重要参数

1)n_clusters:分几个簇,可以通过画图确定分几个

2)init&random_state&n_init(初始质心相关)质心选择的好,模型收敛更快,迭代次数更少

  • init:默认"k-means++",决定初始化方式,通常不改
  • random_state:控制每次初始质心的位置相同,不设置则会在每个随机数种子下运行多次,选择结果最好的随机数种子
  • n_init:默认为10,每个随机数种子运行次数,希望更精确则增大

3)max_iter&tol:让迭代提前停下来,数据量太大可以使用

  • max_iter:默认300,单次运行kmeans算法的最大迭代次数
  • tol:默认1e-4,两个迭代之间inertia下降的量,若小于tol设定的值,迭代就会停下

2、重要属性

1)labels_:查看聚好的类别,每个样本对应的类
2)cluster_centers_:查看质心
3)inertia_:查看总距离平方和。分的簇越多,inertia越低,可以降低至0。k值一定的情况下,inertia越低,聚类效果越好。
4)n_iter_:迭代次数

3、接口
1)fit_predict(x):fit后使用,将x分到已经聚好的类中

  • 取聚好类别的两种方法
`cluster=KMeans(n_clusters=3,random_state=0).fit(x)
cluster.labels_
cluster=KMeans(n_clusters=3,random_state=0).fit(x)
cluster.fit_predict(x)
  • 为什么需要predict(x)?
    数据量太大时,可以先切出一点数据训练,找质心,其它数据用这个接口预测,减少计算量,结果不一样但可以接近。
cluster_smallsub=KMeans(n_clusters=3,random_state=0).fit(x[:200])
y_pred_=cluster_smallsub.predict(x[200:])
  • 聚类算法不需要调用接口transform(),.fit(x)后求出质心,聚类已经完成,

2)score()返回簇内平方和inertia的负数,取绝对值后越小越好

三、聚类算法模型的评估指标

思路:由于KMeans目标是簇内差异小,簇外差异大,因此可以通过衡量簇内差异来衡量聚类效果

1、标签y已知(最好用分类)

互信息分、V-measure、调整兰德系数,三者都是越高越好,前两个取值[0,1],最后一个取值[-1,1]

2、标签y未知:

1)轮廓系数

  • 评价簇内稠密程度、簇间离散程度。样本与所在簇内其他样本相似度为a,其他簇内样本相似度为b,用平均距离计算。a越小,b越大,越好。
  • 轮廓系数是对每一个样本进行计算,公式为s=(b-a)/max(a,b),范围:(-1,1)。轮廓系数处于(0,1):聚类好,越接近1越好;处于(-1,0):聚类不好
  • 使用sklearn.metrics中的silhouette_score计算,返回所有轮廓系数的均值,silhouette_samples返回每个样本的轮廓系数
from sklearn.metrics import silhouette_score
silhouette_score(x,y_pred)

2)卡林斯基-哈拉巴斯指数CHI

from sklearn.metrics import calinski_harabasz_score

越高越好,比轮廓系数快,数据量大时使用

3)戴维斯-布尔丁指数

4)权变矩阵

四、其它笔记

1、make_blobs是用来制造簇的类

from sklearn.datasets import make_blobs
x,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
#500个数,2个特征,4个簇心,random_state确定数据集稳定

2、fig,ax1=plt.subplots(num)
#生成num个子图,fig为画布,ax1为对象

3、如何用循环 在散点图上 区分不同类散点?

color=["red","gray","blue","pink"]
fig,ax=plt.subplots(1)

for i in range(n_clusters):
    ax.scatter(x[y_pred==i][0],x[y_pred==i][1]
              #x[y_pred==i][0]特征1,x[y_pred==i][1]特征2
               ,marker='o'#标记
               ,s=8 #点的大小
               ,c=color[i]
              )

4、如何画出质心?

#画出质心
ax.scatter(centroid[:,0],centroid[:,1]
          ,marker="x"
          ,s=15
          ,c="black")

plt.show()

5、如何评估分类模型?预测准确度、混淆矩阵、ROC曲线
如何评估回归模型?SSE均方误差、损失函数

6、有一些算法天生没有损失函数(衡量拟合效果)

7、矩阵的迹:n*n矩阵,主对角线元素的总和。数据离散程度越高,协方差矩阵的迹越大

8、计算一个cell运行时间的两种方法:
1)%%timeit(慢)
2)运用时间戳(是一串数字,代表时间)

from time import time
time0=time()#记录此时时间
calinski_harabasz_score(x,y_pred)
time()-time0

9、如何将时间戳转换成真正的时间格式?

import datetime
datetime.datetime.fromtimestamp(t0).strftime("%Y-%m-%d %H:%M:%S")
#strftime:str from time

10、函数cluster.k_means实现聚类是一次性返回所有结果,依次返回质心、每个样本对应簇的标签、inertia和最佳迭代次数,其他用法和类类似

五、案例:KMeans矢量量化颐和园图像

1、矢量量化本质是一种降维应用 特征选择降维:选取贡献大的特征; PCA降维:聚合信息; 矢量量化降维:同等样本量上(不改变样本和特征数目)压缩信息大小

2、如何探索图片数据?图片类型,shape,每个像素的结构,有多少不同颜色(像素),图片长什么样

3、如何实现图片可视化?plt.imshow(china),imshow中导入的数据必须是三维的

4、为什么要进行归一化?plt.imshow在浮点数上表现更加优秀

5、不管如何挑选,图像数据的第三个特征一定要不变,如何保证这个值不变?assert==3

6、如何在样本中随机抽取1000个数据?shuffle(image_array,random_state=0)[:1000]

7、为什么矢量量化要用质心替换所有的样本?同一簇的点是相似的,质心和这一簇中其他点所承载的信息是约等于的

8、如何恢复图片的结构?image_kmeans.reshape(w,h,d)

9、如何计算两个序列的距离? pairwise_distances_argmin(x1,x2,axis)

#x1,x2分别是两个序列,axis=1纵向,计算x2中每个样本到x1中每个样本点的距离,返回最近的x1的索引,得到每个样本点对应的随机质心的位置

10、其它知识点:

plt.axis(“off”)#不要显示坐标轴

元组形式:(a,b,c…),一般存储无需修改的数值

pd.drop_duplicates()去除重复行

Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

np.reshape函数改变数据结构:reshape(a,newshape),a是要改变结构的对象,newshape是元组表示的新结构,两种书写行书:a.reshape(2,2,2),np.reshape(a,(2,2,2))

np.random.random((2,4))#生成两行四列随机浮点数,浮点数范围(0,1)

你可能感兴趣的:(聚类,算法,kmeans)