最近做用户画像,用到了KL散度,发现效果还是不错的,现跟大家分享一下,为了文章的易读性,不具体讲公式的计算,主要讲应用,不过公式也不复杂,具体可以看链接

  首先先介绍一下KL散度是啥。KL散度全称Kullback–Leibler divergence,也称为相对熵,信息增益,它是度量两个概率分布P与Q之间差异的一种不对称度量,可以看做是概率分布P到目标概率Q之间距离。一般情况下,P表示数据的真是分布,Q表示数据的理论分布,也可以理解为影响P分布的一种因素。计算公式为:

                      DKL(P||Q) =ΣP(i)log(P(i)/Q(i))                         (1)

 从字面意思来看呢,是一种距离,但是实际上和我们理解的“距离”并不一样。我们常规理解的距离一般来说有几点性质:

  1.非负:距离是绝对值,非负好理解。

  2.对称:从A到B的距离 = 从B到A的距离

  3.勾股定理:两边之和大于第三边

  而KL的性质只满足第一点非负性,不满足对称性和勾股定理。

  1.非负:当P(x) = Q(x)几乎处处成立时,才有DKL(P||Q) = 0. 证明可利用詹森不等式

  2.非对称性:根据定义可知,如果要弄成对称的,可以定义

                      DSKL(P||Q) = (DKL(P||Q)+DKL(Q||P))/2                    (2)

  为什么是非对称的呢,其实很简单,如果P(i)大,Q(i)小,那么log是一个增函数,P(i)/Q(i) > Q(i)/P(i),则log(P(i)/Q(i)) > log(Q(i)/P(i)),因此DKL(P||Q) > DKL(Q||P),如果想要DKL(P||Q) = DKL(Q||P),那么P(i)大,Q的分布应该尽量和P接近一致,P(i)小,P和Q的差别对KL影响较小。

举例:

1.假设现在有两个用户群体A和B,在“女装”这个商品类别下面,A和B的消费总金额分别是11W和2W,是不是就能说明A群体相对于B群体就一定更偏好女装呢?不一定。因为A的人数可能比B的多,如果A和B的人数比例是10:1,那么可能A和B群体对于“女装的”偏好是一样的,简单来算的话,你可以只算人均价格,如果A和B在“女装”下的人均消费相似,可以说明偏好相同,但是这一点没有什么理论支撑,我们可以把A和B群体在“女装”下的消费情况分布作为P(真实分布),A群体和B群体的人数比例作为Q(拟合分布),那么

                          P= [11/13,2/13]     Q =[10/11,1/11]

                          DKL(P||Q) =Σi=1,2P(i)log(P(i)/Q(i))  = 0.02023101833433108

计算得出KL散度约为0.02,接近0,说明A和B在女装下的消费情况分布基本相同,即,两者对“女装”的偏好并没有明显差异,喜欢“女装”的程度为1:1

  贴上KL散度的代码:

  

 #P和Q是两个概率分布,np.array格式
P = np.array()
Q = np.array()
def KL(P,Q):
sum = P*(log(P/Q))#计算KL散度
all_value= [x for x in sum if str(x) != 'nan' and str(x)!= 'inf']#除去inf值
return np.sum(all_value)#计算总和,要用np.sum,不能直接用sum KL(P,Q)#得出KL散度值

  具体在用户画像里有什么用呢?举个例子,我在做用户画像的时候,根据消费金额,分出了8个用户群体,这八个群体的人均消费Top10的重叠性很大,很多人都集中在“女装”,“淑女装”,“商务休闲”,“运动户外”等这几类,看起来没有什么区分度,只能根据金额的高低来区分这些群体的消费能力,但并不能区分这些群体对某类商品的偏好。在计算了各商品类型下不同群体的消费金额的KL散度后,可以发现,这写消费比较集中的几类商品(“女装”,“淑女装”,“商务休闲”,“运动户外”等)的KL散度几乎等于0,或者0.1等,我取阈值为0.5的话,进行过滤一下,可以提取出对用户有偏好区分的商品,我做的实际情况中过滤掉了1/3的商品,再根据不同商品类型下的8个用户群体的消费金额百分比来进行排名,就可以看出各用户群对商品类型的真是偏好了。

  简单来说,从表格上看,可以看到明显效果:

  图1是没有计算KL散度之前的用户偏好,图2是计算KL散度之后的用户偏好。行:用户群体消费偏好的商品类型   列:8个用户群体

  1 2 3 4 5 6 7 8
1 少女装 少女装 少女 淑女装 淑女装 黄金饰品 淑女装 少女装
2 时尚 时尚 时尚 少女装 少女装 少女装 商务休闲 时尚
3 黄金饰品 淑女装 黄金饰品 黄金饰品 黄金饰品 淑女装 黄金饰品 黄金饰品
4 淑女装 黄金饰品 淑女装 镶嵌 镶嵌 时尚 少女装 商务休闲
5 商务休闲 商务休闲 商务休闲 时尚 商务休闲 商务休闲 镶嵌 淑女装

图1 原始用户偏好

1

2

3

4

5

6

7

8

1

护肤

玻璃饰品

玻璃饰品

玉石

饰品

经典

女装

玻璃饰品

2

经典

厨具

铂金饰品

黄金摆件

皮包

综合

保健品

布艺

3

玩具

滋补保健

工艺金条

文教

国际名品

杂饰品

美健

滋补保健

4

彩妆

礼品

国际流行

运动配品

礼品

女士手袋

家居生活

香水

5

家居生活

婴童、用品

投资金条

旅行箱包

羽绒

女饰品

银饰品

陶瓷

图2 计算KL散度后的用户偏好

  从图2可以很明显看出,各用户群体已经有了明显的偏好了,第一类的用户群体可能偏好女性护肤,对象可能是18-30岁的时尚爱美女性;第二类用户群体可能是25-40的居家带娃女性;第三类用户群体可能是偏好贵金属投资的土豪群体;第四类可能是爱好旅游的文艺青年;第五类可能是偏好大牌的富人群体;第六类可能是钟爱宝宝的白富美;第七类可能是热爱运动的女青年;第八类可能是热衷手工和养身的动手达人。(妈呀,编不下去了 = =)

  这个粒度还是比较粗的,因为同一个商品类别里面的商品的价格和风格也不一样,经常买LV的和买coach的人明显不是一个消费水平的,买coach的和买达芙妮的也不是一个消费水平。如果是以品牌为维度的话,再加上年龄、性别、其他的消费几率等等,因该就可以很容易看出各类用户群体的偏好了,这里写KL散度在用户画像中的应用只是一个引子,其实KL散度还有很多其他的应用,例如文档之间的相似度计算,推荐系统之间的应用等等,具体的怎么应用可以结合实际业务可以把KL散度的价值发挥的更好。

【原】浅谈KL散度(相对熵)在用户画像中的应用的更多相关文章

  1. 浅谈KL散度

    一.第一种理解 相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence) ...

  2. 浅谈.NET(C#)与Windows用户账户信息的获取

    原文:浅谈.NET(C#)与Windows用户账户信息的获取 目录 1. 用户账户名称 - 使用Environment类 2. 用户账户信息 - 使用WindowsIdentity和IdentityR ...

  3. 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作

    目录 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 NLP相关的文本预处理 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 之所以心血来潮想写这篇博客,是因为最近在关注N ...

  4. 浅谈一下Windows下的用户权限

    大学毕业后,选择做了苹果开发,一直是使用的Mac系统,所以对Windows的基本操作忘得几乎一干二净:因为做内网穿透的需要,要用到Windows下的权限问题,所以重新研究了一下Windows设置用户权 ...

  5. [原]浅谈vue过渡动画,简单易懂

    在vue中什么是动画 开始先啰嗦一下,动画的解释(自我理解

  6. 浅谈Excel开发:十 Excel 开发中与线程相关的若干问题

    采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互 ...

  7. 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法

    Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...

  8. 浅谈Bootstrap自适应功能在Web开发中的应用

    随着移动端市场的强势崛起,web的开发也变得愈发复杂,对于个体开发者来说,自己开发的网站,在电脑.手机.Pad等上面都要有正常的显示以及良好的用户体验.如果每次都要自己去调整网页去匹配各个不同的客户端 ...

  9. 浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联

    看到网上很多关于svn环境配置和关联Android-Studio的很多博文,发现很零散,想集大家所长整理一下: 在AndroidStudio中开发版本控制中,除了Git就是SVN,和Eclipse不同 ...

随机推荐

  1. js事件处理、事件对象

    事件类型分类: 1 添加在html结构中的事件 <div id="div1" onclick="alert('append click event in html' ...

  2. 设计一个自动生成棋盘格子的JS小程序

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. iOS屏幕尺寸和分辨率了解

    1.截至目前为止,主流的iOS设备屏幕有以下几种: ---------------  iPhone  ---------- --------  iPad ------------ 2.iOS设备屏幕分 ...

  4. 了解HTML CSS选择器操作和特性

    子选择器 在CSS样式表中, 有时候我们需要为一个选择器进行再次的选择, 比如要为某段落标签下的<span>标签进行样式设定(<span>标签必须为段落标签下的第一代子元素, ...

  5. js 多选 反选

    //$(".435__1").attr("checked", true); //$(".435__0").removeAttr(" ...

  6. React Native 红屏之Could not connect to development server.

    React Native 是目前最火的开发框架,其他不说了,上Bug. 按照  React Native iOS环境搭建 高级版 在mac上  搭建 React Native  环境,运行 项目 若出 ...

  7. SQL Server 2008 master 数据库损坏解决总结

    SQL Server 2008 master数据库损坏后,SQL SERVER服务启动失败,查看错误日志,你会看到下面错误信息: 2015-10-27 10:15:21.01 spid6s      ...

  8. 关于datetime 和 int 之间相互转换

    在其他地方看到一个有点意思的东西.是记录转换规则的. DECLARE @Date1 DATETIME = '2016-06-21 11:53:00' , @Date2 DATETIME = '2016 ...

  9. MySQL有关Group By的优化

    昨天我写了有关MySQL的loose index scan的相关博文(http://www.cnblogs.com/wingsless/p/5037625.html),后来我发现上次提到的那个优化方法 ...

  10. jquery $.trim()去除字符串空格详解

    jquery $.trim()去除字符串空格详解 语法 jQuery.trim()函数用于去除字符串两端的空白字符. 作用 该函数可以去除字符串开始和末尾两端的空白字符(直到遇到第一个非空白字符串为止 ...