sklearn.cluster常用API介绍(KMeans,MiniBatchKMeans)

问题:对于给定的数据集{x1,x2...xn},如何根据样本点自身的数据特性实现分类,也就是在没有标签的情况下将距离较近的数据点划分到同一类,假设这个类别就是他们的标签。也就是解决如下问题:
sklearn.cluster常用API介绍(KMeans,MiniBatchKMeans)_第1张图片
通过计算机来将人类可以迅速分类的点群划分出来。


这里介绍几个常用的求点到中心距离公式:

1)Minkowski Distance 公式 —— λ 可以随意取值,可以是负数,也可以是正数,或是无穷大。

2)Euclidean Distance 公式 —— 也就是第一个公式 λ=2 的情况

3)CityBlock Distance 公式 —— 也就是第一个公式 λ=1 的情况

K-means算法:

1、 随机选取k个聚类质心点(cluster centroids)为clip_image008[6]

2、 重复下面过程直到收敛 {

               对于每一个样例i,计算其应该属于的类

               clip_image009

               对于每一个类j,重新计算该类的质心

               clip_image010[6]

}


k表示算法运行前指定的聚类中心个数,随机选择k个中心点后,计算每一个点到k个中心点的距离,距离最小的点ci为该点所属的簇,然后再更新每一个簇的中心点坐标为簇中所有点的坐标均值。


k-means思想较为简单,但也有几个问题。

1:如何保证收敛。定义畸变函数如下:
表示每个样本点到中心点的距离平方和。而k-means算法收敛使得J函数取值最小。在迭代过程中,首先固定中心点调整样本点所属的类别来减小J函数,然后固定样本点类别调整中心点减小J函数。当J函数达到极小值时,xi和ui也同时收敛。类似于对于f(x,y),固定x减小y和固定y减小x会导致函数达到最优点。

2:k个中心点的选择。J函数是非凸函数,意味着收敛达到的最小值不一定是全局最小值,并且极有可能停滞在局部最优解,这也意味着选择不同的k值和k个不同的中心点有可能导致不同的分类结果。
一种选取的方法称为k-means++算法:

(1).  先从我们的数据库随机挑个随机点当“种子点”。
(2). 对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
(3) . 然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
(4) .  重复第(2)和第(3)步直到所有的K个种子点都被选出来。
(5). 进行K-Means算法。

其核心思想是初始选择的中心点彼此之间的距离尽可能的远。

其实现较为简单,这里介绍sklearn.cluster常用的两个算法KMeans和MiniBatchKmeans
sklearn.cluster.KMeans(n_cluster=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_cluster:类中心的个数,默认为8

init:参数为'k-means++','random'或一个numpy的矩阵,默认为'k-means++'
'k-means++':启发式选择一个初始聚类中心
'random':随机选择数据中的k行作为类中心,每一行代表一个数据的属性集合
传入ndarray需要是(n_clusters*n_features)维,并给定初始化中心

n_init:默认为10.k-means算法会选择不同的质心运行的次数,最终结果是n_init次中最好的模型.

max_iter:默认为30,每一次k-means算法迭代的最大次数

tol:默认为1e-4,相对于惯性收敛的容错率,小于该值停止迭代,认为达到收敛

precompute_distances:参数为'auto',True,False。预计算,会得到更高的收敛速度但会占用更多内存
'auto':n_samples*n_clusters>12时不进行预计算
True:始终预计算
False:永远不进行预计算

verbose:默认为0,冗余模式?文档也没有提供详细的解释,不过通常不对默认值进行修改,如果有大神知道请评论告知QAQ

random_state:参数为int,RandomState instance or None.用来设置生成随机数的方式
int:作为随机数生成器的种子
RandomState instance:作为随机数生成器
None:随机数生成器采用np.random

copy_x:默认为True,是个boolean变量
True:对输入训练数据x所做的任何操作都是对x.copy()进行的,不改变x的原值。
False:对x的操作会同步到x上,即传引用调用

n_jobs:int型变量,并行运行的个数。
-1:使用所有CPU. n_jobs<-1时,使用(n_cpus+1+n_jobs)个CPU.

algorithm:'auto','full' or 'elkan'.默认为'auto'
full:采用经典的EM算法
elkan:通过使用三角不等式从而更有效,但不支持稀疏数据
auto:数据稀疏选择full模式,数据稠密选择elkan模式
属性:

cluster_centers_: 一个n-clusters*n_features的矩阵,表示聚类中心的坐标

labels_: 每个点的标签

inertia: 每个点到所属的聚类中心的平方和
例子:
>>> 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.]])
方法:
__init__:同上述构造函数KMeans

fit(x,y=None):对输入数据进行训练
x:训练数据,表示为(n_samples*n_features)的矩阵

fit_predict(x,y=None):(等于调用fit(x)后predict(x))
x:训练数据,表示为(n_samples*n_features)的矩阵
返回值为(n_samples*1)的矩阵表示每一个数据的标签类型

fit_transform(x,y=None):将x转化到聚类距离空间(方便计算距离),等价于fit(x).transform(x)但更高效
x:训练数据,表示为(n_samples*n_features)的矩阵
返回值为(n_samples*k)的矩阵,即将x映射到新的空间中

get_params(deep=True):返回模型的参数

predict(x):对x进行预测,返回距离最近的聚类中心所属的类别
x:训练数据,表示为(n_samples*n_features)的矩阵
返回值为(n_samples*1)的矩阵表示每一个数据的标签类型

score(x,y=None):
x中每一点到聚类中心的距离平方和的相反数.

set_params(**params):根据传入的params构造模型的参数

transform(x):
x:训练数据,表示为(n_samples*n_features)的矩阵
返回值为(n_samples*k)的矩阵,即将x映射到新的空间中

sklearn.cluster.MiniBatchKMeans(n_clusters=8,init='k-means++',max_iter=100,batch_size=100,verbose=0,
compute_labels=True,random_state=None,tol=0.0,max_no_improvement=10,init_size=None,n_init=3,reassignment_ratio=0.01)
每次使用一定数量(batch)的点进行迭代,加快收敛。适用于大量数据点的情况

batch_size:int 默认100,最小批的数量

compute_labels:boolean,默认为True
最小批优化收敛之后计算标签和误差距离

max_no_improvement:int 默认10
控制不产生性能提升的连续最小批的数量,设置为None时取消根据误差的收敛性检测

init_size:int 默认为3*batch_size
加速初始化随机选择的样本数

reassignment_ratio:float 默认0.01
占再聚类中心最大数量的比例。越高收敛越慢,但是效果越好

方法:
partial_fit(x,y=None):根据x更新k-means的参数
x是大小为(n_samples*n_features)的矩阵

引用:
https://coolshell.cn/articles/7779.html

http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html
http://scikit-learn.org/stable/modules/classes.html

你可能感兴趣的:(sklearn常用API介绍)