问题:对于给定的数据集{x1,x2...xn},如何根据样本点自身的数据特性实现分类,也就是在没有标签的情况下将距离较近的数据点划分到同一类,假设这个类别就是他们的标签。也就是解决如下问题:
k表示算法运行前指定的聚类中心个数,随机选择k个中心点后,计算每一个点到k个中心点的距离,距离最小的点ci为该点所属的簇,然后再更新每一个簇的中心点坐标为簇中所有点的坐标均值。
表示每个样本点到中心点的距离平方和。而k-means算法收敛使得J函数取值最小。在迭代过程中,首先固定中心点调整样本点所属的类别来减小J函数,然后固定样本点类别调整中心点减小J函数。当J函数达到极小值时,xi和ui也同时收敛。类似于对于f(x,y),固定x减小y和固定y减小x会导致函数达到最优点。
2:k个中心点的选择。J函数是非凸函数,意味着收敛达到的最小值不一定是全局最小值,并且极有可能停滞在局部最优解,这也意味着选择不同的k值和k个不同的中心点有可能导致不同的分类结果。
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)的矩阵