聚类算法在sklearn中有两种表现形式,一种是类(和学过的分类算法及数据预处理方法都一样),需要实例化,训练并使用接口和属性来调用结果。另一种是函数,只需要输入特征矩阵和超参数,即可返回聚类的结果和各种指标
需要注意的是,该模块中实现的算法可以采用不同类型的矩阵作为输入,所有方法都接受形状[n_samples,n_features]标准特征矩阵,这些可以从sklearn.feature_extraction模块中的类中获得
对于亲和力传播,光谱聚类和DBSCAN,还可以输入形状[n_samples,n_samples]的相似性矩阵,我们可以使用sklearn.metrics.pairwise模块中的函数来获取相似性矩阵
Kmeans有损失函数吗?
Kmeans不求解什么参数,它的模型本质也没有在拟合数据,而是在对数据进行一种探索,所以Kmeans不存在损失函数,Inertia更像是Kmeans的模型评估指标,而非损失函数
对比来看,在决策树中,我们有衡量分类效果的指标准确度accuracy,准确度所对应的损失叫做泛化误差,但我们不能通过最小化泛化误差来求解某个模型中需要的信息,我们只是希望模型的效果上表现出来的泛化误差很小。因此,决策树,KNN等算法,是绝对没有损失函数的
在sklearn中,我们无法选择使用的距离,只能使用欧氏距离
和KNN一样,KMeans算法是一个计算成本很大的算法
在实践中,相比起其他聚类算法,Kmeans已经很快了,但它一般找到Inertia的局部最小值
是Kmeans中的k,表示我们告诉模型要分几类,默认为8类,但通常我们的聚类结果会是一个小于8的结果
通常在开始聚类之前,我们并不知道n_cluster究竟是多少,因此我们要对它进行探索
①当真实标签已知的时候
互信息分:取值范围在(0,1)之中,越接近1,聚类效果越好,在随机均匀聚类下产生0分
V-measure:取值范围在(0,1)之中,越接近1,聚类效果越好,由于分为同质性和完整性两种度量,可以更仔细地研究,模型到底哪个任务做得不够好。对样本分布没有假设,在任何分布上都可以有不错的表现,在随机均匀聚类下不会产生0分
调整兰德系数:取值在(-1,1)之间,负值象征着簇内的点差异巨大,甚至相互独立,正类的兰德系数比较优秀,越接近1越好。对样本分布没有假设,在任何分布上都可以有不错的表现,尤其在具有“折叠”形状的数据上表现优秀,在随机均匀聚类下产生0分
②当真实标签未知的时候
轮廓系数:取值在(-1,1),取值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似,当样本点与簇外的样本更相似的时候,轮廓系数就为负,当轮廓系数为0时,则代表两个簇中的样本相似度一致,两个簇本应该是一个簇。总结:轮廓系数越接近1越好,负数表示聚类效果非常差
在sklearn中,我们使用模块metrics中的类silhouette_score来计算轮廓系数,它返回的是一个数据集中,所有样本的轮廓系数的均值。还有同在metrics模块中的silhouette_sample,它的参数和轮廓系数一致,但返回的是数据集中每个样本自己的轮廓系数
轮廓系数的缺点:在凸形的类上会表现虚高,比如基于密度进行的聚类,或通过DBSCAN获得的聚类结果,如果使用轮廓系数来衡量,则会表现出比真实聚类效果更高的分数
Calinski-Harabaz Index:越高越好,计算速度快,在凸形数据上也会表现虚高
init:可输入“k-means++”,“random”或者一个n维数组,如果输入了n维数组,数组的形状应该是(n_clusters,n_features)并给出初始质心
random_state:控制每次质心随机初始化的随机数种子
n_init:整数,默认10,使用不同的质心随机初始化的种子来运行k-means算法的次数。最终结果会是基于Inertia来计算的n_init次连续运行后的最佳输出
max_iter:整数,默认300,单次运行的k-means算法的最大迭代次数
tol:浮点数,默认1e-4,两次迭代间Inertia下降的量,如果两次迭代之间Inertia下降的值小于tol所设定的值,迭代就会停下
用法和类非常相似,不过函数是输入一系列值,而直接返回结果
一次性地,函数k_means会依次返回质心,每个样本对应的簇的标签,inertia以及最佳迭代次数