您的位置:首页 > Web前端

传递熵——transfer entropy的计算和感想

2014-04-23 11:25 1001 查看
今天第一次写博客,突然想写点自己做的东西。虽然可能做的不好,但是感觉很有意思想和大家分享一下.......自己做物理,但是不知什么原因冥冥之中自己却去做时间序列之间因果性的探测了,嘿嘿。 今天就分享一下自己搞清楚的一点点东西......

相信随着大数据的到来,会使得传递熵(transfer entropy)这种方法会受到更多人的关注,因为它是一种基于概率分布,香农熵,统计的方法得出时间序列间因果性的方法。这种方法首先提出是在PRL上由T.Schreiber 提出的,又用在生物系统中,所以这里大部分人可能不熟悉。由于transfer entropy
所需的时间序列长度较大,所以在普遍数据量较小的时代,只能用在神经信号和脑电图中。现在很多地方都意识到数据的重要性,各种传感器也被大量应用,原本不存在的数据来源慢慢的也被发掘了。相信transfer entropy 的春天就要来了。

什么是transfer entropy 它其实就是一个条件分布带来的探测到时间序列间的不对称性。说的学术一点:传递熵是在错误假设传递概率函数为p(in+1|in(k)),而不是p(in+1|in(k),jn(l))的情况下,预测系统状态额外需要的信息。这个信息由Y到X和由X到Y是不对称,这种不对称就带来了,驱动和响应的关系的建立。不过他和granger
因果性检验之间的等价性在一篇工作中已经证明。而且传递熵能对非线性时间序列应用,对这种granger的因果性也很敏感。下面看看它是怎么计算的:



这有k和l,两个参数,是时间序列延迟的长度  这个大家应该都懂的   现实的系统中总会纯在记忆,而且并非是马尔科夫的。但是对model来说 大部分情况下都会认为是马尔科夫的,所以k=l=1,比较常见。我相信对于以后分析的真实时间序列,都必须先通过其它方法确定,系统记忆的时间尺度,再将数据展开。

接下来看看如果k=l=1时,系统的传递熵应该是怎么计算的,直接上代码吧  不过相信我的代码写的非常的糟糕,只是能运行得到结果而已  嘿嘿   还请多多指教。

还希望大家指正,这个只是一个计算马尔科夫系统传递熵的matlab,函数希望大家能把他用到高维中,并分享,嘿嘿    

%X是一个时间序列,是一个一维列向量
%Y是一个时间序列,是一个一维列向量
%pieces是将空间离散多少分,一般在数据量足够大的情况下分的越多,能够得到的信息越多
%j是一个真实想要用的时间长度大小
function [en_1_2,en_2_1]=transfer_entropy(X,Y,pieces,j)
%% parpare some data that use in reconstruction phase space
d_x=[]; sit=size(X);
templ=randperm((sit(1,1)-1));
select=templ(1:j);
d_x(:,1)=X(select+1,1);d_x(:,2)=X(select,1);d_x(:,3)=Y(select+1,1);d_x(:,4)=Y(select,1);
X_max=max(X(:,1));X_min=min(X(:,1));Y_max=max(Y(:,1));Y_min=min(Y(:,1));
delta1=(X_max-X_min)/(2*pieces);delta2=(Y_max-Y_min)/(2*pieces);
%% calculate the data disturbution p(x(t)),p(x(t+1)),P(x(t+1),x(t)),p(x(t+1),x(t),y(t)),p(x(t),y(t)),p(y(t)),p(y(t+1)),p(y(t+1))
L1=linspace(X_min+delta1,X_max-delta1,pieces);L2=linspace(Y_min+delta2,Y_max-delta2,pieces);
dist1=zeros(pieces(1,1),2);
count=0;
for q1=1:pieces
k1=L1(q1);k2=L2(q1);
count=count+1;
count1=0;count2=0;
for i=1:j
if d_x(i,2)>=(k1-delta1) && d_x(i,2)<=(k1+delta1)
count1=count1+1;
end
if d_x(i,4)>=(k2-delta2) && d_x(i,4)<=(k2+delta2)
count2=count2+1;
end
end
dist1(count,1)=count1;dist1(count,2)=count2;
end

dist1(:,1)=dist1(:,1)/sum(dist1(:,1)); dist1(:,2)=dist1(:,2)/sum(dist1(:,2));

dist2=zeros(pieces(1,1),pieces(1,1),3);
for q1=1:pieces
for q2=1:pieces
k1=L1(q1);k2=L1(q2);
k3=L2(q1);k4=L2(q2);
count1=0;count2=0;count3=0;
for i1=1:j
if d_x(i1,1)>=(k1-delta1) && d_x(i1,1)<=(k1+delta1) && d_x(i1,2)>=(k2-delta1) && d_x(i1,2)<=(k2+delta1)
count1=count1+1;
end
if d_x(i1,3)>=(k3-delta2) && d_x(i1,3)<=(k3+delta2) && d_x(i1,4)>=(k4-delta2) && d_x(i1,4)<=(k4+delta2)
count2=count2+1;
end
if d_x(i1,2)>=(k1-delta1) && d_x(i1,2)<=(k1+delta1) && d_x(i1,4)>=(k4-delta2) && d_x(i1,4)<=(k4+delta2)
count3=count3+1;
end
end
dist2(q1,q2,1)=count1;dist2(q1,q2,2)=count2;dist2(q1,q2,3)=count3;
end
end
dist2(:,:,1)=dist2(:,:,1)/sum(sum(dist2(:,:,1)));dist2(:,:,2)=dist2(:,:,2)/sum(sum(dist2(:,:,2)));dist2(:,:,3)=dist2(:,:,3)/sum(sum(dist2(:,:,3)));

dist3=zeros(pieces(1,1),pieces(1,1),pieces(1,1),2);
for q1=1:pieces
for q2=1:pieces
for q3=1:pieces
k1=L1(q1);k2=L1(q2);k3=L1(q3);
k4=L2(q1);k5=L2(q2);k6=L2(q3);
count1=0;count2=0;
for i1=1:j
if d_x(i1,1)>=(k1-delta1) && d_x(i1,1)<=(k1+delta1) && d_x(i1,2)>=(k2-delta1) && d_x(i1,2)<=(k2+delta1) && d_x(i1,4)>=(k6-delta2) && d_x(i1,4)<=(k6+delta2)
count1=count1+1;
end
if d_x(i1,3)>=(k4-delta2) && d_x(i1,3)<=(k4+delta2) && d_x(i1,4)>=(k5-delta2) && d_x(i1,4)<=(k5+delta2) && d_x(i1,2)>=(k3-delta1) && d_x(i1,2)<=(k3+delta1)
count2=count2+1;
end
end
dist3(q1,q2,q3,1)=count1;dist3(q1,q2,q3,2)=count2;
end
end
end
dist3(:,:,:,1)=dist3(:,:,:,1)/sum(sum(sum(dist3(:,:,:,1))));dist3(:,:,:,2)=dist3(:,:,:,2)/sum(sum(sum(dist3(:,:,:,2))));

%% use the dosturbution calculate thansfer entropy
sum_f_1=0;sum_f_2=0;
for k1=1:pieces(1,1)
for k2=1:pieces(1,1)
if dist2(k1,k2,2)~=0 && dist1(k2,2)~=0
sum_f_1=sum_f_1-dist2(k1,k2,2)*log2(dist2(k1,k2,2)/dist1(k2,2));
end

if dist2(k1,k2,1)~=0 && dist1(k2,1)~=0
sum_f_2=sum_f_2-dist2(k1,k2,1)*log2(dist2(k1,k2,1)/dist1(k2,1));
end
end
end
disp(sum_f_1);disp(sum_f_2)
sum_s_1=0;sum_s_2=0;
for k1=1:pieces(1,1)
for k2=1:pieces(1,1)
for k3=1:pieces(1,1)
if dist3(k1,k2,k3,2)~=0 && dist2(k3,k2,3)~=0
sum_s_1=sum_s_1-dist3(k1,k2,k3,2)*log2(dist3(k1,k2,k3,2)/dist2(k3,k2,3));
end

if dist3(k1,k2,k3,1)~=0 && dist2(k2,k3,3)~=0
sum_s_2=sum_s_2-dist3(k1,k2,k3,1)*log2(dist3(k1,k2,k3,1)/dist2(k2,k3,3));
end
end
end
end
disp(sum_s_1);disp(sum_s_2)

en_1_2=sum_f_1-sum_s_1;
en_2_1=sum_f_2-sum_s_2;
en
4000
d


                 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息