Bhattacharyya 距离(附matlab代码)

http://www.cnblogs.com/yingying0907/archive/2012/07/26/2609920.html

Bhattacharyya距离

在统计学中,Bhattacharyya距离(以下称巴氏距离)测量的是两个离散或连续概率分布的相似性。计算方式和Bhattacharyya系数关系很密切。两种计算方式都以A. Bhattacharyya名字命名,Bhattacharyya是一位30年代在印度统计研究所工作的统计学家。巴氏系数可用来对两组样本的相关性进行测量。这一方法常用来作分类器算法。[1]

 

数学定义

-离散概率分布

  对于在X数域上的两个离散概率分布p和q,巴氏距离定义为[2]:

 
  DB(p,q) = -ln(BC(p,q))
 
  其中
 
  BC(p,q) = ∑√p(x)q(x)
 
  BC被称作Bhattacharyya系数(巴氏系数)
 

  0≤BC≤1q且0≤DB≤∞

-连续概率分布

  在连续情形中,Bhattacharyya系数如下定义:

 
  BC(p,q) = ∫√p(x)q(x)dx
 
  0≤BC≤1q且0≤DB≤∞
 
  两种情形中,巴氏距离DB均不满足三角不等式
 

Bhattacharyya系数

  Bhattacharyya系数[3](Bhattacharyya Coefficient, 巴氏系数)是对两个统计样本的重叠量的近似计算。巴氏系数可用来对两组样本的相关性进行测量。

 
  计算巴氏系数涉及到对该两个样本的重叠部分进行基本形式的积分。两个样本值的积分被分成指定数目的部分。而每一个样本的每一个部分的成员数被用于下式中:
 
  Bhattacharyya = ∑{i=1|n}√(∑ai·∑bi)
 
  其中,a,b为两个样本,n是分块数,ai, bi分别是在a, b中第i部分的成员数。
 
  这样一来,这个式子就会随着因某块中有两个样本的公共成员而变大,也会随着某块中有一大片重叠的样本成员而变大。分块数的选定依赖于样本中的成员数量;如果分块太少会因过估了重叠区域而失去精确性,如果分块太多会因为造成空块而失去精确性。
 
  如果两个样本完全没有重叠,巴氏系数将会等于0,因为每一个分块都将被0乘。这意味着完全分离的样本不能被巴氏系数单独测定出来。



function d=bhattacharyya(X1,X2) 
% BHATTACHARYYA  Bhattacharyya distance between two Gaussian classes 
% 
% d = bhattacharyya(X1,X2) returns the Bhattacharyya distance between X1 and X2. 
% 
% Inputs: X1 and X2 are n x m matrices represent two sets which have n 
%         samples and m variables. 
% 
% Output: d is the Bhattacharyya distance between these two sets of data. 
% 
% Example: 
%{ 
N=100; 
M=10; 
e1=2; 
e2=5; 
c1=3; 
c2=7; 
X1 = c1*randn(N,M)+e1; 
X2 = c2*randn(N,M)+e2; 
d = bhattacharyya(X1,X2); 
%} 
% Reference: 
% Kailath, T., The Divergence and Bhattacharyya Distance Measures in Signal 
% Selection, IEEE Trasnactions on Communication Technology, Vol. 15, No. 1, 
% pp. 52-60, 1967 
% 
% By Yi Cao at Cranfield University on 8th Feb 2008. 
% 
 
%Check inputs and output 
error(nargchk(2,2,nargin)); 
error(nargoutchk(0,1,nargout)); 
 
[n,m]=size(X1); 
% check dimension  
% assert(isequal(size(X2),[n m]),'Dimension of X1 and X2 mismatch.'); 
assert(size(X2,2)==m,'Dimension of X1 and X2 mismatch.'); 
 
mu1=mean(X1); 
C1=cov(X1); 
mu2=mean(X2); 
C2=cov(X2); 
C=(C1+C2)/2; 
dmu=(mu1-mu2)/chol(C); 
try 
    d=0.125*dmu*dmu'+0.5*log(det(C/chol(C1*C2))); 
catch 
    d=0.125*dmu*dmu'+0.5*log(abs(det(C/sqrtm(C1*C2)))); 
    warning('MATLAB:divideByZero','Data are almost linear dependent. The results may not be accurate.'); 
end 
% d=0.125*dmu*dmu'+0.25*log(det((C1+C2)/2)^2/(det(C1)*det(C2))); 


  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值