Chinaunix首页 | 论坛 | 博客
  • 博客访问: 686636
  • 博文数量: 90
  • 博客积分: 1631
  • 博客等级: 上尉
  • 技术积分: 1413
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-15 22:43
文章分类
文章存档

2017年(8)

2016年(9)

2015年(11)

2014年(10)

2013年(9)

2012年(9)

2010年(2)

2009年(10)

2008年(22)

我的朋友

分类: C#/.net

2016-03-21 22:39:41

KL-distance是用来计算两组离散数值的信息量(相对熵)的,一般针对的是离散数据。可以用来做特征筛选。但如果是连续数据,则先要离散化求每个bin内的frequency后再计算KL-distance。
KL-distance的解释:
(1)–Leibler_divergence
(2)


那么具体用matlab或者R都可以实现KL-distance的计算。R中有entropy的包,不再介绍。这里重点说明用matlab如何计算KL-distance。
参考资料:
(1)
这个帖子里面提供了一个KLDiv.m的代码,但是输入得是已经求好概率或者frequency的数据。
经过测试,可以使用,但是我没有看懂它的计算方法,测试后的结果都是0,放弃。


(2)http://blog.sina.com.cn/s/blog_64e045400101o8ln.html
这个帖子中作者粘贴了一个更加详细的code,尚未测试。


(3)
在stackoverflow上有一些相关的帖子,其中这个人问如何由两个histogram数据中(只有bin和每个bin里面的count)计算KL-distance,这个跟我的要求最相近。


因此,决定参考上述(1)(2)(3)中的代码自己写一个从连续值做histogram,然后利用每个bin的frequency求KL-distance的代码,如下所示:


function dist=KLDiv_v2(P,Q)


if size(P,2)~=size(Q,2)
    error('the number of columns in P and Q should be the same');
end


if sum(~isfinite(P(:))) + sum(~isfinite(Q(:)))
   error('the inputs contain non-finite values!') 
end


dist = zeros(size(P));


%# create an index of the "good" data points
goodIdx = P>0 & Q>0; %# bin counts <0 are not good, either


d1 = sum(P(goodIdx) .* log(P(goodIdx) ./Q(goodIdx)));
d2 = sum(Q(goodIdx) .* log(Q(goodIdx) ./P(goodIdx)));


%# overwrite d only where we have actual data
%# the rest remains zero
dist(goodIdx) = d1 + d2;
end

阅读(1692) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~