非监督算法是机器学习研究的一大领域,它适用于不带标签的样本数据,采取一定的算法,将样本分成自动分类成不同的簇。
K均值算法接收两个输入,一个是K,表示簇的数量,另一个是不带标签的训练集{ x 1 , x 2 , . . x m x_1,x2,..x_m x1,x2,..xm}。
算法过程如下:
令 c ( i ) c^{(i)} c(i)表示样本i被划分到的簇的下标,则损失函数可以定义为:
J ( c ( i ) , . . . , c ( m ) , μ 1 , . . . , μ k ) = 1 m ∣ ∣ x ( i ) − μ c ( i ) ∣ ∣ 2 . . . . . . . . ( 1 ) J(c^{(i)},...,c^{(m)},\mu_1,...,\mu_k)=\frac{1}{m}||x^{(i)}-\mu_{c^{(i)}}||^2........(1) J(c(i),...,c(m),μ1,...,μk)=m1∣∣x(i)−μc(i)∣∣2........(1)
我们的目标就是最小化(1),而算法步骤2和3的过程就是在最小化损失函数的过程,其本质是EM算法的迭代过程。
通常使用欧式距离 d = ∑ i = 1 m ( x ( i ) − y ( i ) ) 2 d=\sqrt{\sum\limits_{i=1}^m(x^{(i)}-y^{(i)})^2} d=i=1∑m(x(i)−y(i))2 。
方法:通常随机取K个样本作为初始聚类中心。
肘部原则:画出K从1开始的损失函数值的图像,一开始,图像会下降地比较快,然后趋于平缓,整个形状看起来像人的手肘,我们所要做的就是选取肘部对应的K作为我们的参数K。因为选取它前面的参数的话,损失函数值太高,选取它后面的参数的话,损失函数值变化的量又太少,因此肘部可能是一个合适的参数。然而画出来的图像不一定总是存在肘部,也有可能是平滑的,不过也是一种值得尝试的方法。
另一种方法是根据后续的目的来决定K参数的取值。
是K-means的一个改进算法。在K-means中,对于聚类中心的初始化使用随机选取K个样本作为聚类中心,而K-means++按照以下的思路选取:
这是一种符合直觉的选取方式,K-means++在这一点上做了改进,其余的和K-means没有任何区别。
ISODATA算法,全称是迭代自组织数据分析法。它针对K均值中K需要手动选择这一问题做了改进,其核心思想是:若属于某个类别的样本数少于某个阈值,则去除该类别。若属于某个类别的样本数大于某个阈值,则将该类别分类为两个类别。
这样我们不用指定K的大小,算法就可以为我们自动选择一个合适的K出来。当然除此之外,我们有了更多的超参数,包括每个类所需要的最小样本数 N m i n N_{min} Nmin,最大方差 S i g m a Sigma Sigma,两个聚类中心所允许的最小距离 D m i n D_{min} Dmin,以及预期聚类中心 K o K_o Ko,通常最终输出的聚类中心是在 [ K o / 2 , 2 K o ] [K_o/2,2K_o] [Ko/2,2Ko]的范围之间。
优点:易于实现,非常简单且使用广泛
缺点:可能收敛于局部最小值,在大规模数据下收敛慢,对初始聚类中心的位置较为敏感,参数K需要手动选择。