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

  • 相关阅读:
    Mybatis 原始dao CRUD方法
    JQuery的焦点事件focus() 与按键事件keydown() 及js判断当前页面是否为顶级页面 子页面刷新将顶级页面刷新 window.top.location
    使用actionerror做失败登录验证
    Java项目中的下载 与 上传
    shiro框架 4种授权方式 说明
    javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式
    序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
    Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法
    orcal 数据库 maven架构 ssh框架 的全注解环境模版 maven中央仓库批量删除lastupdated文件后依然是lastupdated解决方法 mirror aliyun中央仓库
    EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
  • 原文地址:https://www.cnblogs.com/rhyswang/p/7122665.html
Copyright © 2011-2022 走看看