k-means优化 & k-means距离的选择 &k-medoids对比

一、k-means:在大数据的条件下,会耗费大量的时间和内存。
优化k-means的建议:
1、减少聚类的数目K。因为,每个样本都要跟类中心计算距离。
2、减少样本的特征维度。比如说,通过PCA等进行降维。
3、考察其他的聚类算法,通过选取toy数据,去测试不同聚类算法的性能。
4、hadoop集群,K-means算法是很容易进行并行计算的。

二、K-means距离的定义:
目前各种机器学习开源库,对于k-means的实现,都是基于欧式距离。如果想自定义距离,比如说用余弦相似度,那么k-means就必须要重新推导,也即需要重新实现k-means。
下面,从k-means的推导中,可以发现,在k-means当中,计算类的中心,跟距离的定义是紧密相关的。
k-means优化 & k-means距离的选择 &k-medoids对比_第1张图片

如上所示:在k-means当中,重新计算类中心, 仅在距离定义为欧式距离的前提下,才是加和取平均。如果想用cos相似度,那么就必须要重新推导,计算类中心的方式。所以说, 一般开源库实现的k-means,都没有提供让你自定义聚类的接口。或者说,让你传进去一个距离矩阵

就我们这个问题而言:LDA提取出来的隐特征向量,是概率分布。本来我使用的聚类算法是计算cos相似度来衡量距离。使用
k-medoid算法去聚类。传进去的是,我计算好的个体之间的相似度矩阵。但是,这种聚类算法局限性很大,需要占用非常多的内存。
1、比如说,我有50w和用户,那么需要一个N*N的相似度矩阵。那么要存储这个大矩阵,需要的内存。50w*50w*24/(1024*1024*1024)=5587GB。注:浮点数在python中占用了24个字节。很明显,当用户数达到50w时,这种传相似度矩阵的办法已经不可行。
2、不过,传相似度矩阵的办法,虽然很占用内存,并且时间效率也不高。
3、所以,当用户数量达到50w时,使用k-means,k-means只需要,把所以数据载入内存,即可。即使,载入50w条记录,也不会耗费多少内存。
4、并且,k-means的话,其时间复杂度是O(K*N)。但是,k-medoid的时间复杂度O(N*N),主要集中在计算相似度矩阵。一般情况下,N>>K。故k-means的时间复杂度,和空间复杂度都会优于k-medoid。但,只是k-means的局限性是无法自定义距离,只能使用欧式距离。

三、欧式距离和余弦距离的联系

1、首先,余弦距离和欧式距离一般是不等价的。比如说,夹角一样的两条边,边的距离是不一样的。
2、当,两个向量的模长=1时,其欧式距离和余弦距离是等价的。
k-means优化 & k-means距离的选择 &k-medoids对比_第2张图片
3、所以说,在这个问题中,如果我们将LDA提取到的隐特征,进行模长归一化为1。那么将该训练数据丢到k-means里面去,即使使用欧式距离,那么也等价于使用了余弦距离。 前提是,对于特征向量归一化到模长为1。余弦距离和欧式距离才会等价。
4、当然,也可以不归一化到模长为1,直接使用用k-means聚类,相当于直接是使用了欧式距离。

四、k-medoids简介
k-medoids 算法,其实从名字上就可以看出来,和 k-means 肯定是非常相似的。事实也确实如此,k-medoids 可以算是 k-means 的一个变种。
  k-medoids 和 k-means 不一样的地方在于中心点的选取, 在 k-means 中,我们将中心点取为当前 cluster 中所有数据点的平均值
  并且我们已经证明在固定了各个数据点的 assignment 的情况下,这样选取的中心点能够把目标函数 最小化。 然而在 k-medoids 中,我们将中心点的选取限制在当前 cluster 所包含的数据点的集合中。换句话说,在 k-medoids 算法中,我们将从当前 cluster 中选取这样一个点——它到其他所有(当前 cluster 中的)点的距离之和最小——作为中心点k-means 和 k-medoids 之间的差异就类似于一个数据样本的均值 (mean) 和中位数 之间的差异前者的取值范围可以是连续空间中的任意值,而后者只能在给样本给定的那些点里面选。那么,这样做的好处是什么呢?
 一个最直接的理由就是 k-means 对数据的要求太高了,它使用欧氏距离描述数据点之间的差异 (dissimilarity) 从而可以直接通过求均值来计算中心点。这要求数据点处在一个欧氏空间之中
然而并不是所有的数据都能满足这样的要求,对于数值类型的特征,比如身高,可以很自然地用这样的方式来处理,但是类别 (categorical) 类型的特征就不行了。 因为k-medoids,类中心点的选择,是选取该类中的一个样本,所以说k-medoids可以传进去一个个体间的相似度矩阵。







你可能感兴趣的:(机器学习,机器学习,k-means)