这里我们来学习k均值算法的优化目标(代价函数):
优化目标的值等于每一个训练集数据到该所属的聚类中心距离的平方的平均值
其实在我们进行之前所循环进行的聚类分簇和移动聚类中心的操作,都是在不断的最小化J的大小,使J最小化。
我们再来说随机初始化:在之前我们选择聚类中心是随机任意的选择,但是这里我们用的是更加好或者用的更加多的随机选择聚类中心的方法。我们在训练集中随机选择k个聚类中心。
当然有时候我们的选择会很好,有时我们的随机选择会不太理想:
这里我们还要讨论这种随机初始化可能带来的缺点,即我们可能求得是一个不太理想的局部最优解,而不是最优解。
如下图右边的上面的图,我们随机的聚类中心导致我能可以很好的将训练集分为3个簇,但是当我们随机的聚类中心是右下的两种情况,那我们我们可能就是得到不太好的局部最优解。
所以为了避免这种现象的出现,我们的做法是多次随机初始化聚类中心。例如我们运行100次k均值算法,这样我们就随机初始化了100次,我们分别计算出各自的代价函数值,然后选择最小的一种情况就是我们的最优解。当然这种做法,只是适用于k比较小的情况(2-10),当k值很大时就不太实用。
最后我们来讨论聚类数量选择:
对于类别数量的选择,我们首先想到的一般是同构观察,手动的选择。
例如下面的训练集,我们有的会认为应该分为4类,有的认为分为2类等等,所以这种方法因人而异。
另一种方法叫做“肘部法则”:
如果随着k不断增大,J的值如下图左边所示,那么可以很好的根据肘部法则选择k=3,但是当我们的曲线比较模糊的时候,我们就不能很好的准确出k。
相比以上两种,更加好一点的方法叫做下游目标,即我们根据我们划分后的目的来选择k的值。
例如之前的T恤厂家将T恤大小分类,是3类,还是5类,这就要根据商家的目的。例如如果分为5类,则可以很好的满足大部分客户的需求,如果分为3类,就可以将价格定低点便宜销售等等。。。