Python:找到两条高斯曲线的交点

use*_*841 7 python gaussian

我有两个高斯图:

x = np.linspace(-5,9,10000)
plot1=plt.plot(x,mlab.normpdf(x,2.5,1))
plot2=plt.plot(x,mlab.normpdf(x,5,1))
Run Code Online (Sandbox Code Playgroud)

我想找到两条曲线相交处的点.有办法做到这一点吗?特别是我想找到它们相遇的x坐标的值.

aha*_*aha 13

你想找到x,使得两个高斯函数具有相同的高度.(即相交)

您可以通过将两个高斯函数等同并求解x来实现.最后,您将得到一个二次方程,其系数与高斯均值和方差有关.这是最终结果:

import numpy as np

def solve(m1,m2,std1,std2):
  a = 1/(2*std1**2) - 1/(2*std2**2)
  b = m2/(std2**2) - m1/(std1**2)
  c = m1**2 /(2*std1**2) - m2**2 / (2*std2**2) - np.log(std2/std1)
  return np.roots([a,b,c])

m1 = 2.5
std1 = 1.0
m2 = 5.0
std2 = 1.0

result = solve(m1,m2,std1,std2)
Run Code Online (Sandbox Code Playgroud)

输出是:

array([ 3.75])
Run Code Online (Sandbox Code Playgroud)

您可以绘制找到的交叉点:

x = np.linspace(-5,9,10000)
plot1=plt.plot(x,mlab.normpdf(x,m1,std1))
plot2=plt.plot(x,mlab.normpdf(x,m2,std2))
plot3=plt.plot(result,mlab.normpdf(result,m1,std1),'o')
Run Code Online (Sandbox Code Playgroud)

情节将是: 在此输入图像描述

如果你的高斯人有多个交叉点,代码也会找到所有这些交叉点(例如m1 = 2.5,std1 = 3.0,m2 = 5.0,std2 = 1.0): 在此输入图像描述

  • @user3287841您可以通过对 **solve** 函数 c 参数计算进行简单修改来添加缩放因子:`defsolve(m1,m2,std1,std2,s1,s2):`(s1和s2是缩放因子),并将 c 计算更改为 `c = m1**2 /(2*std1**2) - m2**2 / (2*std2**2) - np.log((std2*s1)/(std1*s2 ))`。其他一切都保持不变。你可以用`plot3=plt.plot(result,0.2*mlab.normpdf(result,2.5,1),'o')`来绘制它 (3认同)