基于K-means Clustering聚类算法对电商商户进行级别划分(含Octave仿真)
Posted Rhys_Wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于K-means Clustering聚类算法对电商商户进行级别划分(含Octave仿真)相关的知识,希望对你有一定的参考价值。
在从事电商做频道运营时,每到关键时间节点,大促前,季度末等等,我们要做的一件事情就是品牌池打分,更新所有店铺的等级。例如,所以的商户分入SKA,KA,普通店铺,新店铺这4个级别,对于不同级别的商户,会给予不同程度的流量扶持或广告策略。通常来讲,在一定时间段内,评估的维度可以有:UV,收订金额,好评率,销退金额,广告位点击率,转化率,pc端流量、手机端流量、客单价......等n多个维度,那么如何在这n多个维度中找到一种算法,来将我们的品牌划分到4个级别中呢?今天所讨论的K-means聚类算法是其中一种,基于某电商频道296个品牌的周销量真实数据,我们来进行品牌池划分。
首先, K-means聚类算法可以描述为如下几步:
1、随机选取K个质心(centroids);
2、计算每个数据点距离K个质心的距离,选择距离最小的一个质心作为该数据点的所属组。例如,某数据点距离#3质心最近,那么它就属于#3组。
3、更新质心的坐标,将每个组的数据点坐标相加求平均值,得出新的质心位置并更新。
4、重复第二和第三步n次。
其中,K和n是提前指定的。
为了将K-means运行过程可视化,我们只取296的品牌的2个维度:UV与收订金额。主控代码如下:
%% ================= Part 1: load data ==================== fprintf(\'load parameters.\\n\\n\'); pkg load io; tmp = xlsread(\'data.xlsx\'); id=tmp(:,1); X=tmp(:,2:3); %% =================== Part 2: set parameters ====================== K = 4; max_iters = 10; %% =================== Part 3: K-Means Clustering ====================== fprintf(\'\\nRunning K-Means clustering on example dataset.\\n\\n\'); initial_centroids = kMeansInitCentroids(X,K); % Run K-Means algorithm. The \'true\' at the end tells our function to plot % the progress of K-Means [centroids, idx] = runkMeans(X, initial_centroids, max_iters, true); fprintf(\'\\nK-Means Done.\\n\\n\');
K-Means Clustering Algorithm核心代码:
function [centroids, idx] = runkMeans(X, initial_centroids, ... max_iters, plot_progress) [m n] = size(X); K = size(initial_centroids, 1); centroids = initial_centroids; previous_centroids = centroids; idx = zeros(m, 1); % Run K-Means for i=1:max_iters % Output progress fprintf(\'K-Means iteration %d/%d...\\n\', i, max_iters); if exist(\'OCTAVE_VERSION\') fflush(stdout); end % For each example in X, assign it to the closest centroid idx = findClosestCentroids(X, centroids); % Given the memberships, compute new centroids centroids = computeCentroids(X, idx, K); end end
选择最近质心的算法:
function idx = findClosestCentroids(X, centroids) K = size(centroids, 1); idx = zeros(size(X,1), 1); m = size(X,1); for(i = 1:m) distance = -1; index = -1; for(j=1:K) e = X(i,:)-centroids(j,:); d_tmp = e*e\'; if(distance == -1) distance = d_tmp; index = j; else if (d_tmp<distance) distance = d_tmp; index = j; endif endif endfor idx(i) = index; endfor end
重新计算质心及初始化质心的算法:
function centroids = computeCentroids(X, idx, K) [m n] = size(X); centroids = zeros(K, n); num = zeros(K,1); for(i = 1:m) c = idx(i,:); centroids(c,:) += X(i,:); num(c,:)++; endfor centroids = centroids./num; function centroids = kMeansInitCentroids(X, K) centroids = zeros(K, size(X, 2)); randidx = randperm(size(X, 1)); centroids = X(randidx(1:K), :); end
经过十次迭代后,分组的结果如下:
在我本地的原始数据表格中,共有约20个维度来衡量每个店铺的运行情况,根据K-means聚类算法可以很轻松的将它们归类,虽然无法将其进行可视化操作,但原理与二维K-means完全相同。
以上是关于基于K-means Clustering聚类算法对电商商户进行级别划分(含Octave仿真)的主要内容,如果未能解决你的问题,请参考以下文章
机器学习笔记聚类算法及实践(K-Means,DBSCAN,DPEAK,Spectral_Clustering)