之前章节讲到的算法都是有监督学习方法, 在建模之前需要训练(样本)数据集,模型根据样本数据集的结果,训练得到某些参数,形成分类器。无监督学习没有训练数据集,在数据集上根据某种规则完成模型建立;
算法描述
所谓物以类聚-人以群分,“类”指的是具有相似性的集合,聚类是指将数据集划分为若干类,使得各个类之内的数据最为相似,而各个类之间的数据相似度差别尽可能的大。聚类分析就是以相似性为基础,在一个聚类中的模式之间比不在同一个聚类中的模式之间具有更多的相似性。对数据集进行聚类划分,属于无监督学习。
K-Means 是最常用且简单的聚类算法,最大特点是好理解,运算速度快,时间复杂度近于线性,适合挖掘大规模数据集。但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类;
K-Means 采用距离作为相似性指标,从而发现给定数据集中的 K 个类,且每个类的中心是根据类中所有数值的均值得到的,每个类的中心用聚类中心来描述。对于给定的一个(包含 n 个一维以及一维以上的数据点的)数据集 X 以及要得到的类别数量 K,选取欧式距离作为相似度指标,聚类目标是使得类的聚类平方和最小,即最小化:
K-Means 算法流程:
1、随机选取 K 个样本作为聚类中心;
2、计算各样本与各个聚类中心的距离;
3、将各样本回归于与之距离最近的聚类中心;
4、求各个类的样本的均值,作为新的聚类中心;
5、判定:若类中心不再发生变动或者达到迭代次数,算法结束,否则回到第二步。
西瓜数据集
from sklearn import datasets
复制代码
调参
n_clusters:整型,缺省值=8 ,生成的聚类数。
max_iter:整型,缺省值=300 ,执行一次 k-means 算法所进行的最大迭代数。
n_init:整型,缺省值=10 ,用不同的聚类中心初始化值运行算法的次数,最终解是在 inertia 意义下选出的最优结果。
init:有三个可选值:’k-means++’, ‘random’,或者传递一个 ndarray 向量,此参数指定初始化方法,默认值为 ‘k-means++’。(1)‘k-means++’ 用一种特殊的方法选定初始聚类,可加速迭代过程的收敛(2)‘random’ 随机从训练数据中选取初始质心。(3)如果传递的是一个 ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
precompute_distances:三个可选值,‘auto’,True 或者 False,预计算距离,计算速度更快但占用更多内存。(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。(2)True:总是预先计算距离。(3)False:永远不预先计算距离。
tol:float 类型,默认值= 1e-4 与 inertia 结合来确定收敛条件。
n_jobs:整形数。 指定计算所用的进程数。内部原理是同时进行 n_init 指定次数的计算。(1)若值为 -1,则用所有的 CPU 进行运算。若值为 1,则不进行并行运算。(2)若值小于-1,则用到的 CPU 数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs 值为-2,则用到的 CPU 数为总 CPU 数减 1。
random_state:整型或 numpy.RandomState 类型,可选,用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个 seed。此参数默认值为 numpy 的随机数生成器。
copy_x:布尔型,默认值=True,当我们 precomputing distances 时,将数据中心化会得到更准确的结果。如果把此参数值设为 True,则原始数据不会被改变。如果是 False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。