K-means算法
K-means是比较一种流行的聚类算法,它以非监督的方式将数据分为k个聚类。具体步骤如下,
- 随机地选择k个数据点作为初始分类的中心(+标记)
-
计算所有数据点与k个分类中心的“距离”(e.g.欧式距离),将它们标记为最近的那个分类,如上图
-
对每种分类数据群,重新计算他们的中心(mean point),这个中心的计算和距离一样有很多定义方法
- 重复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 空间。