【问题标题】:Finding the intersection of Gaussian distributions寻找高斯分布的交点
【发布时间】:2018-08-25 21:36:38
【问题描述】:

如何在 MATLAB 中找到高斯混合分布相交的所有点?

【问题讨论】:

标签: matlab gaussian


【解决方案1】:

您的问题的一般类别是找到两条曲线的交点,这是一项易于管理但并非微不足道的任务(最难的部分是确保您抓住所有交点)。

但您的问题非常具体:您正在寻找两个高斯的交集。这非常好:我们都为您的函数提供了一个解析公式,并且除非您的某些参数相同,否则可以保证恰好有两个交集。*

假设您的分布通过mu1mu2 和规模sigma1sigma2 来表征。然后你在x 位置的高斯函数由函数定义

1/sqrt(2*pi*sigma^2) * exp(-(x-mu)^2/2/sigma^2)

事实证明,我们可以在纸上完全解出x 的这个方程:

1/sqrt(2*pi*sigma1^2)*exp(-(x-mu1)^2/2/sigma1^2) == 1/sqrt(2*pi*sigma2^2)*exp(-(x-mu2)^2/2/sigma2^2)
sigma2/sigma1 == exp((x-mu1)^2/2/sigma1^2) * exp(-(x-mu2)^2/2/sigma2^2)
log(sigma2/sigma1) == (x-mu1)^2/2/sigma1^2) - (x-mu2)^2/2/sigma2^2

导致抛物线方程ax^2 + bx + c == 0 where

a = 1/(2*sigma1^2) - 1/(2*sigma2^2);
b = mu2/(sigma2^2) - mu1/(sigma1^2);
c = mu1^2/(2*sigma1^2) - mu2^2/(2*sigma2^2) - log(sigma2/sigma1);

很容易证明D = b^2 - 4 a c判别式是非负的,所以当参数不退化时,方程确实有两个实根。所以这两个交点,按照上面的定义,

D = b^2 - 4 * a * c;
x1 = (-b + sqrt(D))/(2*a);
x2 = (-b - sqrt(D))/(2*a);

使用两个具有伪随机参数的高斯函数:

% define parameters and Gaussian
mu1=1; sigma1=3; mu2=2; sigma2=4;

% intersections
a = 1/(2*sigma1^2) - 1/(2*sigma2^2);
b = mu2/(sigma2^2) - mu1/(sigma1^2);
c = mu1^2/(2*sigma1^2) - mu2^2/(2*sigma2^2) - log(sigma2/sigma1)
D = b^2 - 4 * a * c;
x1 = (-b + sqrt(D))/(2*a);
x2 = (-b - sqrt(D))/(2*a);

只是为了证明上面的交点是正确的:

>> f = @(x,mu,sigma) 1/sqrt(2*pi*sigma^2) * exp(-(x-mu).^2/2/sigma^2);
>> f(x1,mu1,sigma1) - f(x1,mu2,sigma2)

ans =

   2.7756e-17

>> f(x2,mu1,sigma1) - f(x2,mu2,sigma2)

ans =

   1.0408e-17

以上意味着x1x2点的两个高斯值在机器精度内是相等的,这与任何数字答案一样好。


*我最初声称只要高斯不完全相同,我们总是有两个交点。显然,如果均值和方差都相同,我们就会有两条退化曲线,并且交点变得毫无意义。但就像Cris Luengo pointed out in a comment 一样,可能只有一个交点:当方差相同且均值不同时(即,我们有两条形状完全相同的曲线沿x 移动)。在这种情况下a=0,因此对应的方程是b*x + c == 0,给我们x0 = -c/b作为交集。所以一个更准确(但有点伪代码)的答案(给定abc)是

if a == 0 % or allow some tolerance... <=> sigma1 == sigma2
   if b == 0 % or allow some tolerance... <=> mu1 == mu2
      % degenerate curves: a == b == c == 0, f1(x)==f2(x) for all x
      disp('curves are degenerate...')
   else
      % single intersection: mu1 ~= mu2
      x1 = -c/b;
   end
else
   % two intersections; both parameters are different
   D = b^2 - 4 * a * c;
   x1 = (-b + sqrt(D))/(2*a);
   x2 = (-b - sqrt(D))/(2*a);

【讨论】:

  • 总是有两个交叉点吗?方差相同但均值不同的情况如何?那样的话不是只有一个路口吗?
  • @CrisLuengo 你的权利:在这种情况下a=0 这正好意味着方程是线性的:)(分母也是 0)。谢谢指正!
  • 哈哈! — 两个均值之间的交集是最优贝叶斯分类器。如果你在那里设置阈值,你会得到两个高斯描述的两个类之间的最佳分离。
  • @AndrasDeak 谢谢你。我一直在寻找这个公式很长时间。我在 Excel 中构建了一个示例。但是,截距略有偏离。我已经四次检查我是否完全遵循了您的公式,并且没有看到错误。为x 截距查找y 会为每条曲线产生不同的结果。有没有办法可以联系你寻求帮助?我将不胜感激。
  • @IamIC 如果它在 excel 中,我可能无法提供帮助,但无论如何你可以 open a chatroom for us(不保证可靠的可用性,但我很乐意看看)。跨度>
猜你喜欢
  • 2016-03-26
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多