zoukankan      html  css  js  c++  java
  • 基于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.
    
    ');
    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('
    Running K-Means clustering on example dataset.
    
    ');
    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('
    K-Means Done.
    
    ');
    

     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...
    ', 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完全相同。

  • 相关阅读:
    gulp4.0 存在的错误信息 The following tasks did not complete: default,Did you forget to signal async completion?
    高性能前端 art-template 模板
    cookie 详解
    Cross origin requests are only supported for protocol schemes: http, data, chrome,chrome-extension的问题
    jQuery EasyUI 详解
    我的游戏学习日志1——恐龙快打
    我的游戏学习日志2——雪人兄弟
    关于网页导航栏制作的几种方法与常见问题解决(新人向)
    JavaScript基础
    利用CSS3制作网页动画
  • 原文地址:https://www.cnblogs.com/rhyswang/p/7122665.html
Copyright © 2011-2022 走看看