聚类是一种很常见的数据处理方式,为的就是把具有相同类型的数据聚集在一起,再做处理,聚类属于无监督学习算法的一种,没有正确的结果可供检验。
书中介绍了两种聚类的方法,一种是层次聚类,另一种是是k-均值聚类。
层次聚类可以看做是在一个图中找出最小代价树的kruskal算法,每次处理时会将两个相聚最近的不同类聚集在一起,这个过程一直重复直到整个数据集属于一个类,当然也可以等有k个类别的时候就停止聚类操作。初始数据集中的每个数据都属于不同的类别,经过一次操作后两个最接近的数据点会被划分成同一个类别,这个时候就会出现一个问题,这一个类别中包含了多个点,当计算这个类别和其他类别的相似度时该如何计算呢?
聚类操作是将数据集中的每个数据,映射到n维空间中的一个点,计算两点间的相似性可以使用欧氏距离,也可以使用相关系数(计算n维空间中两点间不同分量的趋势是否一致)。计算单独两个点间的距离的数据非常明显,但是计算两个点集合之间的相似性则不太明了,这是可以选用很多不同的方式,不同选取两个集合之间所有的点对之间距离最近的两个点间的相似性来作为两点间的相似性,选取两个集合中相距最远的两个点对之间的相似性作为两个集合的相似性,也可以先计算一个类的中心(所有点先求和,再平均),再计算两个中心之间的距离。但是在这本书中这几种方法都没有使用到,使用的是另外一种方法。首先假设每个类都有一个中心,当这个类中只有单个数据点时,很明显这个数据点就是这个类的中心,当将两个类别聚合成一个类时,新的类的中心,取这两个类中心的均值作为新的类的中心,按照这种方式,不同数据点在聚类中的效果不同,最早的被归入类中的数据点相比于后来的聚合的数据点的权值偏低,不知道这有什么道理~
另一个就是k-均值聚类。k-均值聚类的想法就是直接假定k个类别的中心,对每个数据,计算这个数据点跟k个类别的距离,跟哪个类别中心的距离最近,就将它归入那个类中。将所有数据处理完后再重新计算类中心,重复以上的过程,知道类别中心不再发生变化为止。这个方法相对于层次聚类来说就是计算量得以减小了,层次聚类方法每次聚类需要计算每两个点之间的距离,选取其中最小的,这种消耗为O(n2),为了减小计算量可以将前次的结果存储起来,后面的如果用到了这个数据可以直接使用,无需计算,大大的减少了时间。而k-均值聚类,每次的计算量为O(nk),而且需要的迭代次数比较少,相比起来就比较好些。