KNN与K-Means的区别
from sklearn.cluster import KMeans
Name | Description |
---|---|
n_clusters | 聚类类别总数 |
init | 初始中心点创建方法 |
n_init | 初始化几次中心点 |
max_iter | 最大迭代次数 |
tol | 收敛条件 |
precompute_distances | 是否提前预计算距离 |
algorithm | 优化距离计算的方法选取 |
尽管此前例子中K-Means的迭代过程快速高效,但实际上,当面对复杂数据集时,K-Measn很有可能陷入“局部最小值陷进”或者“震荡收敛”。所谓落入局部最小值陷进,指的是尽管可能有更好的划分数据集的方法(SSE取值更小),但根据K-Means的收敛条件却无法达到,算法会在另外一种划分情况时停止迭代;而所谓“震荡收敛”,指的是算法会在两种不同的划分方法中来回震荡(尽管SSE取值可能有差别)。前种情况非常类似于参数进行梯度下降求解过程中,如果采用BGD,并且参数在一个局部最小值点附近,则最终参数会收敛到局部最小值点类似,而后面一种情况则非常类似于学习率过大导致无法收敛、一直处于震荡状态。
而出现这种问题的根本原因,其实在于初始中心点的随机选取。因此sklearn中其实集成了两种技术手段来避免上述两种问题的出现。其一是采用k-means++算法来计算初始中心点,经过这种算法生成的中心点,能够大概率在后续的迭代过程中让模型保持平稳,相关说明可参考论文:“k-means++: The advantages of careful seeding” 。而无论k-means++是否生效,为了保险起见,sklearn中都采用了多次初始化中心点、多次训练模型、然后找到最优数据集划分的方法,这就是n_init参数的意义。在这双重保证下,sklearn的K-means快速聚类能够整体保持非常平稳的状态。