无监督学习:
和监督学习相比,无监督学习的数据集是没有标签的。所谓没有标签的意识就是我们对数据一无所知,但是要借助一些算法试着帮我们寻找到数据的某些结构特性。聚类(CLustering)算法是我们要学习的第一个无监督学习的算法,将我们的数据分成不同的簇。
K-means算法:
假设我们有下图所示的数据集:
K-means算法是一个迭代算法。K-means算法的流程是这样的,首先随机选择K个初始点,K代表你想将数据分为几类,如图所示,K=2;然后将数据集中的所有点分别计算与这两个初始点的距离,按照就近分配原则,分配给相应的簇,如下图所示。然后移动我们的初始点,也可以叫做聚类中心,将所有同一类的点相加之后取平均值,然后将我们的聚类中心移动到这个平均值上。如下图所示,如此循环直到收敛。
第一次循环的结果
第二次循环的结果
收敛的结果
上面的步骤我们可以叫做第一:簇分配(cluster assignment);第二:移动聚类中心(move centroid step)。
计算距离,matlab有一个函数叫做pdist2:
X = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12];
Y = [1, 2, 3];
pdist2(X,Y)计算的是欧式距离。
distance = pdist2(X, Y) % X是a*m维的,Y是b*m维的,得出来的结果是a*b维的。
优化目标:
其中表示与最近的聚类中心点,在迭代的过程中,代价函数一定是慢慢下降的,否则就是出现了问题。
随机初始化:
我们应该怎么选择初始化的聚类中心呢,一种推荐的方法是从实例当中选取,比如K=3,则随机从实例当中选取3个点分别作为聚类中心。但是由于随机初始化的原因,K-means算法可能会陷入局部最优解。
避免局部最优解——初始化K-means算法若干次,返回代价函数最小的那个结果。在K较小的时候,比如小于10,多次随机初始化的效果是非常明显的,但是如果K很大的话,多次随机初始化的效果就不那么明显了。
选择聚类数量:
大多数情况下,我们还是人为的选择K值,还有一种叫做手肘法则:
如上图所示:我们可以画出我们的代价函数随着K的变化曲线,选择拐点那个K值,通常是比较好的选择;但是并不是所有的曲线都有拐点,我们碰到的大多数情况是右边的这种情况,那么这样我们的肘部法则就不在那么适用了。
其实大多数情况下,我们使用K-means算法进行聚类分析,和我们的目的都是相对应的,我们的目的能够为我们选择K值提供很好的指引。比如我们下图我们进行衣服的尺寸设计,我们即可以分成3类,也可以分成5类。