K-means算法

K-means是比较一种流行的聚类算法,它以非监督的方式将数据分为k个聚类。具体步骤如下,

  1. 随机地选择k个数据点作为初始分类的中心(+标记)
  1. 计算所有数据点与k个分类中心的“距离”(e.g.欧式距离),将它们标记为最近的那个分类,如上图

  2. 对每种分类数据群,重新计算他们的中心(mean point),这个中心的计算和距离一样有很多定义方法

  1. 重复2-3的操作,直到分类不再改变(或是不再有大的改变)

K-means算法虽然效率是比较高的,但是实际中对k的选择以及“距离”的选择比较困难,我们通常不知道数据应该有几个分类或是选择什么度量,另外初始值和异常值对算法也有很大影响。

使用sklearn实现

sklearn.cluster.KMeans(n_clusters=8,
	init='k-means++', 
	n_init=10, 
	max_iter=300, 
	tol=0.0001, 
	precompute_distances='auto', 
	verbose=0, 
	random_state=None, 
	copy_x=True, 
	n_jobs=1, 
	algorithm='auto'
	)

参数的意义:

推荐去看文档哈,这里

n_clusters: 簇的个数
init: 初始簇中心的获取方法
n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10次质心,实现算法,然后返回最好的结果。
max_iter: 最大迭代次数
tol: 容忍度,即kmeans运行准则收敛的条件
precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的
verbose: 冗长模式
random_state: 随机生成簇中心的状态条件。
copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
n_jobs: 并行设置
algorithm: kmeans的实现算法,有:‘auto’, ‘full’, ‘elkan’, 其中 'full’表示用EM方式实现

>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
...               [4, 2], [4, 4], [4, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)
>>> kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)
>>> kmeans.cluster_centers_
array([[ 1.,  2.],
       [ 4.,  2.]])

常用方法:

fit(X[,y])计算k-means聚类;
fi_predictt(X[,y])计算簇质心并给每个样本预测类别;
fit_transform(X[,y])计算簇并把X装换到cluster-distance空间 ;
get_params([deep])取得估计器的参数;
predict(X)给每个样本估计最接近的簇;
score(X[,y])与k-means算法目标相反的值;
set_params(**params)Set the parameters of this estimator;
transform(X[,y])将X转换入cluster-distance 空间。

posted @ 2021-03-16 23:55  MrDoghead  阅读(496)  评论(0编辑  收藏  举报