sklearn中聚类算法有两种表现形式,一种是类,需要实例化,然后训练并调动接口,另一种是函数,输入特征矩阵和超参数就可得到结果。
k-means 聚类算法的典型代表
将一组n个样本的特征矩阵X划分为K个无交集的簇,直观上来看簇是一组聚集的数据,在一个簇中的数据认为同一类。
簇中所有数据的均值被称为这个簇的质心。
簇的个数K是一个超参数,需要人为输入来确定,kmeans的核心人物就是根据我们设定好的K找出K个最优质心,并将离这些质心最近的数据分别分配到这些质心代表的簇中。
簇内差异:样本点到其所在簇的质心的距离
簇内平方和 整体平方和,越小表示聚类效果越好,kmeans求解过程为一个最优化问题
可以把这个看做是kmeans的损失函数,但并不严谨,更像模型评估指标
sklearn中只能使用欧氏距离 曼哈顿距离和余弦距离不能用
kmeans算法时间复杂度,最快的聚类算法
sklearn.cluster.KMeans
重要参数n_clusters 是参数K,模型要分为几个簇 唯一的必填参数
有随机性参数 random_state=0
属性labels_ 查看聚好的类别,每个样本所对应的类
kmeans不需要建立模型或者预测结果,fit已经完成聚类结果了,但也有predict 和 fit_predict 标识学习数据x并对类进行预测,但所得到的结果和不调用predict直接fit之后调用labels一模一样
数据量太大的时候,可以使用一部分数据来做fit 剩下数据predict
属性cluster_centers 查看质心
属性inertia_ 查看总距离的平方和,随着k越来越大 inertia可能到0,不能通过增大k来降低inertia来说名模型效果变好了
聚类的模型评估指标
聚类模型的结果不是某种标签输出,并且聚类的结果是不确定的,模型优劣由也无需求来确定,可以通过衡量簇内差异来衡量聚类的效果。
kmeans适合分一堆一堆的
数据是否一定不具有真实标签 如果真实标签已知,可用以下指标:模型评估指标 互信息分,V-measure 调整兰德系数
真实标签未知的时候:轮廓系数
评估簇内的稠密程度,和簇间的离散程度
能够同时衡量 样本与其自身所在的簇中的其他样本的相似度a,等于样本与同一簇中所有其他点之间的平均距离; 样本与其他簇中的样本的相似度b,等于样本与下一个最近的簇中的所有点之间的平均距离。
根据聚类的要求 簇内差异小簇外差异大:希望b永远大于a且大的越多越好
s = b-a/max(a,b) 范围为(-1,1) 越接近1越好
sklearn.metrics.silhouette_score 计算轮廓系数的均值
sklearn.metrics.silhouette_samples 计算每一个样本的轮廓系数 返回一个矩阵
轮廓系数也有缺陷,在凸型类上表现会虚高,比如基于密度的聚类,或者通过DBSCAN
其他评估指标,卡林斯基-哈拉巴斯指数简称CHI 也被称为方差比标准
戴维斯-布尔丁指数 、权变矩阵
sklearn.metrics.calinski_harabaz_score
优点比较快,计算速度很快
时间戳计算运行时间from time import time 时间戳可以通过datetime中的函数fromtimestamp转换成真正的时间格式
datetime.datetime.frotimestamp(t0).strftime("%y-%m-%d %H:%M:%S")
绘制轮廓系统分布图和聚类后的数据分布图来选择最佳的n_clusters
matplotlib.cm # colormap
可以选择分的好的类把数据踢出来,然后剩下的数据再进行聚类,把聚的好的再挑出来
nipy_spectral(输入任意小数来代表一个颜色)
计算完评估指标应该画图看看实际聚类的情况,分析每一类的效果,再判断后续如何处理
其他参数 init 能否真正收敛到最小值很大程度上取决于质心的初始化 init确定初始化方式
random_state来控制每次生成的初始质心都在相同的位置 对应一个质心随机初始化的随机数种子
init默认为kmeans++
n_init 整数默认10 使用不同的质心随机初始化的种子来运行kmeans算法的次数
n_iter_ 属性 迭代次数
max_iter 、tol参数 让迭代停下来
max_iter 默认300 单次运行kmeans的最大迭代次数
tol 浮点数 默认1e-4 两次迭代间inertia下降的量,如果两次迭代之间下降的值小于tol所设定的值,则迭代会停下
sklearn.cluster.k_means 直接返回多个参数
聚类算法可以用于降维 重要应用之一是非结构数据上的矢量量化
矢量量化的降维是在同等样本上压缩信息的大小
质心上的信息可以约等于这个类型上所有样本的信息,用质心来替换该类样本上的所有数据,从而降低数据量