【原】浅谈KL散度(相对熵)在用户画像中的应用
最近做用户画像,用到了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散度(相对熵)在用户画像中的应用的更多相关文章
- 浅谈KL散度
一.第一种理解 相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence) ...
- 浅谈.NET(C#)与Windows用户账户信息的获取
原文:浅谈.NET(C#)与Windows用户账户信息的获取 目录 1. 用户账户名称 - 使用Environment类 2. 用户账户信息 - 使用WindowsIdentity和IdentityR ...
- 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作
目录 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 NLP相关的文本预处理 浅谈NLP 文本分类/情感分析 任务中的文本预处理工作 前言 之所以心血来潮想写这篇博客,是因为最近在关注N ...
- 浅谈一下Windows下的用户权限
大学毕业后,选择做了苹果开发,一直是使用的Mac系统,所以对Windows的基本操作忘得几乎一干二净:因为做内网穿透的需要,要用到Windows下的权限问题,所以重新研究了一下Windows设置用户权 ...
- [原]浅谈vue过渡动画,简单易懂
在vue中什么是动画 开始先啰嗦一下,动画的解释(自我理解
- 浅谈Excel开发:十 Excel 开发中与线程相关的若干问题
采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互 ...
- 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法
Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...
- 浅谈Bootstrap自适应功能在Web开发中的应用
随着移动端市场的强势崛起,web的开发也变得愈发复杂,对于个体开发者来说,自己开发的网站,在电脑.手机.Pad等上面都要有正常的显示以及良好的用户体验.如果每次都要自己去调整网页去匹配各个不同的客户端 ...
- 浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联
看到网上很多关于svn环境配置和关联Android-Studio的很多博文,发现很零散,想集大家所长整理一下: 在AndroidStudio中开发版本控制中,除了Git就是SVN,和Eclipse不同 ...
随机推荐
- js事件处理、事件对象
事件类型分类: 1 添加在html结构中的事件 <div id="div1" onclick="alert('append click event in html' ...
- 设计一个自动生成棋盘格子的JS小程序
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- iOS屏幕尺寸和分辨率了解
1.截至目前为止,主流的iOS设备屏幕有以下几种: --------------- iPhone ---------- -------- iPad ------------ 2.iOS设备屏幕分 ...
- 了解HTML CSS选择器操作和特性
子选择器 在CSS样式表中, 有时候我们需要为一个选择器进行再次的选择, 比如要为某段落标签下的<span>标签进行样式设定(<span>标签必须为段落标签下的第一代子元素, ...
- js 多选 反选
//$(".435__1").attr("checked", true); //$(".435__0").removeAttr(" ...
- React Native 红屏之Could not connect to development server.
React Native 是目前最火的开发框架,其他不说了,上Bug. 按照 React Native iOS环境搭建 高级版 在mac上 搭建 React Native 环境,运行 项目 若出 ...
- SQL Server 2008 master 数据库损坏解决总结
SQL Server 2008 master数据库损坏后,SQL SERVER服务启动失败,查看错误日志,你会看到下面错误信息: 2015-10-27 10:15:21.01 spid6s ...
- 关于datetime 和 int 之间相互转换
在其他地方看到一个有点意思的东西.是记录转换规则的. DECLARE @Date1 DATETIME = '2016-06-21 11:53:00' , @Date2 DATETIME = '2016 ...
- MySQL有关Group By的优化
昨天我写了有关MySQL的loose index scan的相关博文(http://www.cnblogs.com/wingsless/p/5037625.html),后来我发现上次提到的那个优化方法 ...
- jquery $.trim()去除字符串空格详解
jquery $.trim()去除字符串空格详解 语法 jQuery.trim()函数用于去除字符串两端的空白字符. 作用 该函数可以去除字符串开始和末尾两端的空白字符(直到遇到第一个非空白字符串为止 ...