sklearn之kmeans

梦想与她 提交于 2020-02-25 21:49:54

Kmeans工作原理

在这里插入图片描述

sklearn.cluster.KMeans

1.参数n_clusters

n_clusters是KMeans中的k,表示着我们告诉模型我们要分几类。这是KMeans当中唯一一个必填的参数,默认为8类,当我们拿到一个数据集,如果可能的话,我们希望能够通过绘图先观察一下这个数据集的数据分布,以此来为我们聚类时输入的n_clusters做一个参考。

2.参数init & random_state & n_init:如何放置初始质心

1.init:
可输入"k-means++",“random"或者一个n维数组。这是初始化质心的方法,默认"k-means++”。输入"k-means++":一种为K均值聚类选择初始聚类中心的聪明的办法,以加速收敛。如果输入了n维数组,数组的形状应该是(n_clusters,n_features)并给出初始质心。
2.random_state:
控制每次质心随机初始化的随机数种子
3.n_init:
整数,默认10,使用不同的质心随机初始化的种子来运行k-means算法的次数。最终结果会是基于Inertia来计算的n_init次连续运行后的最佳输出

k-means++优化后的初始化质心位置方法,一般情况下优化过后找最优解迭代次数比随机的迭代次数少

3.参数max_iter & tol:让迭代提前停下来

1.max_iter:
整数,默认300,单次运行的k-means算法的最大迭代次数
2.tol:
浮点数,默认1e-4,两次迭代间Inertia下降的量,如果两次迭代之间Inertia下降的值小于tol所设定的值,迭代就会停下

4.簇内误差平方和

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.聚类算法的评价指标(轮廓系数)

1.聚类算法虽然不需要标签,但如果现实中我们有标签(情况很少),可以用互信息法等方法来评价。
2.在大多数情况下是对不知道真正答案的数据进行聚类。这样的聚类,是完全依赖于评价簇内的稠密程度(簇内差异小)和簇间的离散程度(簇外差异大)来评估聚类的效果。其中轮廓系数是最常用的聚类算法的评价指标。

1)样本与其自身所在的簇中的其他样本的相似度a,等于样本与同一簇中所有其他点之间的平均距离
2)样本与其他簇中的样本的相似度b,等于样本与下一个最近的簇中的所有点之间的平均距离

S = (b - a) / max(a,b) 

解轮廓系数范围是(-1,1),其中值越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似,当样本点与簇外的样本更相似的时候,轮廓系数就为负。当轮廓系数为0时,则代表两个簇中的样本相似度一致,两个簇本应该是一个簇。可以总结为轮廓系数越接近于1越好,负数则表示聚类效果非常差。

在sklearn中,使用模块metrics中的类silhouette_score来计算轮廓系数,它返回的是一个数据集中,所有样本的轮廓系数的均值。但还有同在metrics模块中的silhouette_sample,它的参数与轮廓系数一致,但返回的是数据集中每个样本自己的轮廓系数.

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 自己创建数据集 4类
X, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)

# kmeans
n_clusters = 3
cluster = KMeans(n_clusters=n_clusters, random_state=0).fit(X)

# 重要属性labels_ 查看聚好的类别和每个样本所对应的类
y_pred = cluster.labels_
print(y_pred)
# fit_predict与不调用predict直接fit之后调用lables_的结果一样
pre = cluster.fit_predict(X)

# 查看聚类后的质心
centroid = cluster.cluster_centers_
print(centroid)

# 簇内平方和
inertia = cluster.inertia_
print(inertia)

# 轮廓系数
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples

# 分3类时轮廓系数
print(silhouette_score(X,y_pred))   # 0.5882004012129721
# silhouette_samples取完均值之后结果与silhouette_score一样
silhouette_samples(X,y_pred).mean() # 0.5882004012129721

# 分4类时轮廓系数
cluster_ = KMeans(n_clusters=4, random_state=0).fit(X)
print(silhouette_score(X,cluster_.labels_))     # 0.6505186632729437

# 分5类时轮廓系数
cluster_ = KMeans(n_clusters=5, random_state=0).fit(X)
print(silhouette_score(X,cluster_.labels_))    # 0.5737098048695828

KMeans参数列表

在这里插入图片描述
在这里插入图片描述

KMeans属性列表

在这里插入图片描述

KMeans接口列表

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!