This thread builds upon some prior work on the Weight
class in equadratures. We introduced the ability to incorporate analytical probability distribution functions. Furthermore, even if the functions did not integrate to unity, a function that normalised the PDF was also added.
In the latest github commit (see below), the ability to form data-driven probability distributions has been added to the Weight
class. A working example of this is shown below. First, we introduce some sample data.
import equadratures as eq
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(font_scale=1.5)
sns.set_style("white")
sns.set_style("ticks")
param1 = np.random.rand(1000)
param2 = np.random.randn(1200)
param3 = np.random.randn(1300)*0.3 - 0.5
param4 = np.random.randn(300)*0.1 + 3
data = np.hstack([param1, param2, param3, param4])
Next, we invoke the new Weight
class, which uses scipy
βs in-built kernel density estimation routine,
input_dist = eq.Weight(data, support=[-5, 6], pdf=False)
and pass this distribution instances to the Parameter
class:
s = eq.Parameter(distribution='data', weight_function=input_dist, order=3)
s_values, pdf = s.get_pdf()
s_values, cdf = s.get_cdf()
s_samples = s.get_samples(6000)
Finally we plot!
fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(1,1,1)
plt.fill_between(s_values, pdf*0.0, pdf, color="gold" , label='Density', interpolate=True, hatch="\\\\\\\\", edgecolor="grey", linewidth=0.5,alpha=0.5)
plt.hist(data, 50, density=True, facecolor='dodgerblue', alpha=0.7, label='Data', edgecolor='white')
plt.xlabel('Parameter')
plt.ylabel('PDF')
plt.legend()
sns.despine(offset=10, trim=True)
plt.show()
Now, whatβs nice is that we can truncate the data to a tighter support. So for instance, we set
input_dist = eq.Weight(data, support=[0, 6], pdf=False)
and then re-run the code block above, we obtain
This addition has been added to the feature branch below. In this next few threads, I will comment on why using this within a regression context can be very useful.