k-means++

原理
1.0、K-means原理 
1、随机在图中取K个种子点。
 2、然后对所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群。
 3、接下来,我们要移动种子点到属于他的“点群”的中心。这里求中心的方法最简单的是直接将中心定为点群各个坐标的平均值 ,也可以参考下面三种求中心的方法。
 4、然后重复第2)和第3)步,直到,种子点没有移动
1.1、k-means 优缺点:
K-Means聚类算法的优点主要集中在:
 1.算法快速、简单;
 2.对大数据集有较高的效率并且是可伸缩性的;
 3.时间复杂度近于线性,而且适合挖掘大规模数据集。K-Means聚类算法的时间复杂度是O(n×k×t) ,其中n代表数据集中对象的数量,t代表着算法迭代的次数,k代表着簇的数目 
1.2、k-means的缺点:
  1、在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。
  2、 在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,一旦初始值选择的不好,可能无法得到有效的聚类结果,这也成为 K-means算法的一个主要问题。
3、从 K-means 算法框架可以看出,该算法不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。所以需要对算法的时间复杂度进行分析、改进,提高算法应用范围。
2.0、k-means ++原理
k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。
算法描述如下:
1、随机选取一个样本作为第一个聚类中心 c1;
2、计算每个样本与当前已有类聚中心最短距离(即与最近一个聚类中心的距离),用 D(x)表示;这个值越大,表示被选取作为聚类中心的概率较大;最后,用轮盘法选出下一个聚类中心;
3、重复2,选出 k 个聚类中心。
4、选出初始点后,就继续使用标准的 k-means 算法了。

2.2举例说明
下面结合一个简单的例子说明K-means++是如何选取初始聚类中心的。
数据集中共有8个样本,分布以及对应序号如下图所示:

假设经过图2的步骤一后6号点被选择为第一个初始聚类中心,
那在进行步骤二时每个样本的D(x)和被选择为第二个聚类中心的概率如下表所示:

其中的P(x)就是每个样本被选为下一个聚类中心的概率。
最后一行的Sum是概率P(x)的累加和,用于轮盘法选择出第二个聚类中心。
方法是随机产生出一个0~1之间的随机数,判断它属于哪个区间,那么该区间对应的序号就是被选择出来的第二个聚类中心了。
例如1号点的区间为[0,0.2),2号点的区间为[0.2, 0.525)。
从上表可以直观的看到第二个初始聚类中心是1号,2号,3号,4号中的一个的概率为0.9。
而这4个点正好是离第一个初始聚类中心6号点较远的四个点。
这也验证了K-means的改进思想:即离当前已有聚类中心较远的点有更大的概率被选为下一个聚类中心。
可以看到,该例的K值取2是比较合适的。当K值大于2时,每个样本会有多个距离,需要取最小的那个距离作为D(x)。
应用:
3.0、sklearn.cluster.KMeans 参数介绍
sklearn这个库里的kmeans,这个是现在python机器学习最流行的集成库,上面介绍了k-means++,sklearn.cluster.KMeans这个类对于初始聚类中心的选择刚好默认选择的就是k-means ++。
3.1、参数
0、初始化
def init(self, n_clusters=8, init=‘k-means++’, n_init=10, max_iter=300,tol=1e-4,precompute_distances=‘auto’,verbose=0, random_state=None, copy_x=True, n_jobs=1):
1、n_clusters:整形,缺省值=8 【生成的聚类数,即产生的质心(centroids)数。】
2、max_iter:整形,缺省值=300执行一次k-means算法所进行的最大迭代数。质心点调整300此
3、n_init:整形,缺省值=10,用不同的质心初始化值运行算法的次数,最终解是在inertia(每个点到其簇的质心的距离之和)意义下选出的最优结果。
4、init:有三个可选值:’k-means++’, ‘random’,或者传递一个ndarray向量。
此参数指定初始化方法,默认值为 ‘k-means++’。
(1)‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛(即上文中的k-means++介绍)
(2)‘random’ 随机从训练数据中选取初始质心。
(3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
5、precompute_distances:三个可选值,auto、True 或者 False。
预计算距离,计算速度更快但占用更多内存。
(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.
(2)True:总是预先计算距离。
(3)False:永远不预先计算距离。
6、tol:float形,默认值= 1e-4,容忍的最小误差,当误差小于tol就会退出迭代(算法中会依赖数据本身,与inertia(每个点到其簇的质心的距离之和)结合来确定收敛条件。
7、n_jobs:整形数。 指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。
(1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
(2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。
8、random_state:整形或 numpy.RandomState 类型,可选
用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
9、copy_x:布尔型,默认值=True,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。当我们precomputing distances(预计算距离)时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。
3.2、属性
1、cluster_centers_:向量,[n_clusters, n_features] (聚类中心的坐标)
2、Labels_: 每个点的分类
3、inertia_:float形,每个点到其簇的质心的距离之和。
Notes:
  这个k-means运用了 Lioyd’s 算法,平均计算复杂度是 O(knT),其中n是样本量,T是迭代次数。
  计算复杂读在最坏的情况下为 O(n^(k+2/p)),其中n是样本量,p是特征个数。(D. Arthur and S. Vassilvitskii, ‘How slow is the k-means method?’ SoCG2006)
  在实践中,k-means算法时非常快的,属于可实践的算法中最快的那一类。但是它的解只是由特定初始值所产生的局部解。所以为了让结果更准确真实,在实践中要用不同的初始值重复几次才可以。
3.3、Methods
1、fit(X[,y]):计算k-means聚类。
2、fit_predictt(X[,y]):计算簇质心并给每个样本预测类别。
3、fit_transform(X[,y]):计算簇并 transform X to cluster-distance space。
4、get_params([deep]):取得估计器的参数。
5、predict(X):predict(X)给每个样本估计最接近的簇。
6、score(X[,y]):计算聚类误差
7、set_params(**params):为这个估计器手动设定参数。
8、transform(X[,y]): 将X转换为群集距离空间。在新空间中,每个维度都是到集群中心的距离。 请注意,即使X是稀疏的,转换返回的数组通常也是密集的。
参考资料:
https://blog.csdn.net/github_39261590/article/details/76910689
https://www.cnblogs.com/wang2825/articles/8696830.html
https://www.cnblogs.com/wuchuanying/p/6218486.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值