Calcular el área de superposición de dos funciones

Necesito calcular el área donde se superponen dos funciones. Utilizo distribuciones normales en este ejemplo simplificado en particular, pero necesito un procedimiento más general que también se adapte a otras funciones.

Vea la imagen a continuación para tener una idea de lo que quiero decir, donde el área roja es lo que busco:

Este es el MWE que tengo hasta ahora:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# Generate random data uniformly distributed.
a = np.random.normal(1., 0.1, 1000)
b = np.random.normal(1., 0.1, 1000)

# Obtain KDE estimates foe each set of data.
xmin, xmax = -1., 2.
x_pts = np.mgrid[xmin:xmax:1000j]
# Kernels.
ker_a = stats.gaussian_kde(a)
ker_b = stats.gaussian_kde(b)
# KDEs for plotting.
kde_a = np.reshape(ker_a(x_pts).T, x_pts.shape)
kde_b = np.reshape(ker_b(x_pts).T, x_pts.shape)


# Random sample from a KDE distribution.
sample = ker_a.resample(size=1000)

# Compute the points below which to integrate.
iso = ker_b(sample)

# Filter the sample.
insample = ker_a(sample) < iso

# As per Monte Carlo, the integral is equivalent to the
# probability of drawing a point that gets through the
# filter.
integral = insample.sum() / float(insample.shape[0])

print integral

plt.xlim(0.4,1.9)
plt.plot(x_pts, kde_a)
plt.plot(x_pts, kde_b)

plt.show()

donde aplicoMonte Carlo Para obtener la integral.

El problema con este método es que cuando evalúo puntos muestreados en cualquier distribución conker_b(sample) (oker_a(sample)), Consigo valores colocadosdirectamente sobre La línea KDE. Debido a esto, incluso las distribuciones claramente superpuestas que deberían devolver un valor de área común / superpuesta muy cerca de 1. devuelvan valores pequeños (el área total de cada curva es 1. ya que son estimaciones de densidad de probabilidad).

¿Cómo podría arreglar este código para dar los resultados esperados?

Así es como apliqué la respuesta de Zhenya.

# Calculate overlap between the two KDEs.
def y_pts(pt):
    y_pt = min(ker_a(pt), ker_b(pt))
    return y_pt
# Store overlap value.
overlap = quad(y_pts, -1., 2.) 

Respuestas a la pregunta(2)

Su respuesta a la pregunta