docs/algo/kmeans_on_angel.md
KMeans是一种简单的聚类算法,将数据集划分为多个簇,K为簇的个数。传统的KMeans算法,有一定的性能瓶颈,通过PS实现的KMeans,在准确率一致的情况下,性能更佳。
每个样本被划分到距离最近的簇。每个簇所有样本的几何中心为这个簇的簇心,样本到簇心的距离为样本到簇的距离。Kmeans算法一般以迭代的方式训练,如下所示:
其中:代表第i个样本,代表与第i个样本距离最近的簇,代表第j个簇的簇心。
"Web-Scale K-Means Clustering"[1]提出一种在朴素KMeans算法基础上改进的KMeans算法,用mini-batch方法训练,每次迭代选择一个mini-batch的样本更新簇心,如下所示:
Angel实现的KMeans算法将K个簇心以及每个簇心的样本计数存储在ParameterServer上,其中K个簇心用一个K×N维的矩阵表示,簇心的样本计数用一个K×1的向量表示,K为簇心的个数,N为数据的维度,即特征的个数。
KMeans on Angel以迭代的方式训练,每次训练使用上文提到的mini-batch KMeans算法更新簇心。
KMeans on Angel的算法流程如下图所示:
输入格式
输入输出参数
算法参数
资源参数
提交命令
./bin/angel-submit \
--action.type=train \
--angel.app.submit.class=com.tencent.angel.ml.clustering.kmeans.KMeansRunner \
--ml.model.class.name=com.tencent.angel.ml.clustering.kmeans.KMeansModel \
--angel.train.data.path=$traindata \
--angel.save.model.path=$modelout \
--angel.output.path.deleteonexist=true \
--angel.log.path=$logpath \
--ml.data.type=libsvm \
--ml.model.type=T_DOUBLE_DENSE \
--ml.kmeans.center.num=$centerNum \
--ml.kmeans.c=0.15 \
--ml.epoch.num=10 \
--ml.feature.index.range=$featureNum \
--ml.feature.num=$featureNum \
--angel.workergroup.number=4 \
--angel.worker.memory.mb=5000 \
--angel.worker.task.number=1 \
--angel.ps.number=4 \
--angel.ps.memory.mb=5000 \
--angel.job.name=kmeans_train
./bin/angel-submit \
--action.type=inctrain \
--angel.app.submit.class=com.tencent.angel.ml.clustering.kmeans.KMeansRunner \
--ml.model.class.name=com.tencent.angel.ml.clustering.kmeans.KMeansModel \
--angel.train.data.path=$traindata \
--angel.load.model.path=$modelout \
--angel.save.model.path=$modelout \
--angel.output.path.deleteonexist=true \
--angel.log.path=$logpath \
--ml.data.type=libsvm \
--ml.model.type=T_DOUBLE_DENSE \
--ml.kmeans.center.num=$centerNum \
--ml.kmeans.c=0.15 \
--ml.epoch.num=10 \
--ml.feature.index.range=$featureNum \
--ml.feature.num=$featureNum \
--angel.workergroup.number=4 \
--angel.worker.memory.mb=5000 \
--angel.worker.task.number=1 \
--angel.ps.number=4 \
--angel.ps.memory.mb=5000 \
--angel.job.name=kmeans_inctrain
./bin/angel-submit \
--action.type=predict \
--angel.app.submit.class=com.tencent.angel.ml.clustering.kmeans.KMeansRunner \
--ml.model.class.name=com.tencent.angel.ml.clustering.kmeans.KMeansModel \
--angel.predict.data.path=$predictdata \
--angel.load.model.path=$modelout \
--angel.predict.out.path=$predictout \
--angel.output.path.deleteonexist=true \
--angel.log.path=$logpath \
--ml.data.type=libsvm \
--ml.model.type=T_DOUBLE_DENSE \
--ml.kmeans.center.num=$centerNum \
--ml.feature.index.range=$featureNum \
--ml.feature.num=$featureNum \
--angel.workergroup.number=4 \
--angel.worker.memory.mb=5000 \
--angel.worker.task.number=1 \
--angel.ps.number=4 \
--angel.ps.memory.mb=5000 \
--angel.psagent.cache.sync.timeinterval.ms=500 \
--angel.job.name=kmeans_predict
[1] Sculley D. Web-scale k-means clustering[C]// International Conference on World Wide Web, WWW 2010, Raleigh, North Carolina, Usa, April. DBLP, 2010:1177-1178.