GMM Membership Functions
gmm-membership converts posterior probabilities from one-dimensional Gaussian mixture models into ordered membership functions. It corrects tail-dominance reversals caused by components with unequal standard deviations and returns the intersections of adjacent corrected curves as cluster thresholds.
Methodological reference
This is a Python impementation of the MATLAB algorithm described in:
Suwalska A, Polanska J. GMM-Based Expanded Feature Space as a Way to Extract Useful Information for Rare Cell Subtypes Identification in Single-Cell Mass Cytometry. International Journal of Molecular Sciences. 2023;24(18):14033. doi:10.3390/ijms241814033.
Algorithm summary
For a one-dimensional Gaussian mixture with component weights $\pi_k$, means $\mu_k$, and standard deviations $\sigma_k$, the posterior probability of component $k$ is
$$ P(k \mid x) = \frac{ \pi_k,\mathcal{N}(x \mid \mu_k,\sigma_k) }{ \sum_j \pi_j,\mathcal{N}(x \mid \mu_j,\sigma_j) } $$
When component variances differ substantially, a broad component can dominate a distant tail even when another component has the nearest ordered mean. The dominant-component sequence can therefore decrease as the feature value increases, for example from Component 2 back to Component 1.
The implemented pipeline performs the following operations:
- Sort components by increasing mean.
- Compute posterior probabilities on a regular grid.
- Smooth each posterior curve with a Savitzky-Golay projection filter.
- Remove components that never dominate within their own local region.
- Recompute and normalize posterior probabilities for retained components.
- Construct a left-boundary membership function anchored at one on the left.
- Construct interior membership functions anchored at zero at both extremes.
- Construct a right-boundary membership function anchored at one on the right.
- Use shape-preserving PCHIP interpolation between retained probability segments and anchors.
- Locate the ordered intersection between every adjacent corrected curve pair. These
n_components - 1values are returned as cluster thresholds.
The resulting values are membership functions, not a probability simplex. Their row-wise sum is not constrained to one.
Installation
Recommended, from pip:
python -m pip install gmm-membership
Directly from GitHub:
python -m pip install git+https://github.com/Aleksandra795/gmm-membership.git
Minimal workflow
import numpy as np
from gmm_membership import build_ordered_membership_functions
# Columns: mean, standard deviation, component weight
parameters = np.array([
[-2.50, 0.22, 0.08],
[-1.60, 1.10, 0.22],
[ 0.50, 0.35, 0.12],
[ 2.40, 0.95, 0.22],
[ 4.00, 1.20, 0.26],
[ 4.80, 0.25, 0.10],
])
result = build_ordered_membership_functions(
parameters,
grid_min=-6.0,
grid_max=8.8,
)
posterior = result.posterior_probabilities
membership = result.membership_functions
thresholds = result.thresholds
new_observations = np.array([-2.6, -1.4, 0.4, 4.9])
expanded_features = result.transform(new_observations)
Visualization functions
Each function returns (figure, axes) and optionally saves the figure through save_path.
GMM density and observations
from gmm_membership import plot_gmm_density
figure, axes = plot_gmm_density(
data,
result.parameters,
grid=result.grid,
save_path="gmm_density.png",
)
Posterior probabilities before correction
from gmm_membership import plot_posterior_probabilities
figure, axes = plot_posterior_probabilities(
result.grid,
result.posterior_probabilities,
cmap="colorblind",
save_path="posterior_probabilities.png",
)
Membership functions after correction
from gmm_membership import plot_membership_functions
figure, axes = plot_membership_functions(
result.grid,
result.membership_functions,
thresholds=result.thresholds,
show_thresholds=True,
cmap="colorblind",
save_path="membership_functions.png",
)
The cmap argument accepts a Seaborn palette name, a Matplotlib colormap name or object, or a custom color list. Custom lists are cycled when too short and truncated when too long.
custom_colors = ["#0072B2", "#D55E00", "#009E73"]
plot_membership_functions(
result.grid,
result.membership_functions,
thresholds=result.thresholds,
show_thresholds=True,
cmap=custom_colors,
)
Reproducible synthetic example
The package includes a fixed six-component dataset with 10,000 observations. Components 1 and 2 create a left-tail conflict, while Components 5 and 6 create a right-tail conflict.
python examples/synthetic_tail_conflict.py
The example saves:
demo_output/
├── 01_gmm_density.png
├── 02_posterior_probabilities.png
├── 03_membership_functions.png
├── cluster_thresholds.csv
├── gmm_parameters.csv
├── membership_functions.csv
├── posterior_probabilities.csv
└── synthetic_data.csv
The example prints and exports the five cluster boundaries returned through result.thresholds. Each boundary is the interpolated intersection of adjacent corrected membership functions at their ordered change of dominance.
Public API
Core computation:
build_ordered_membership_functions
compute_membership_thresholds
compute_posterior_probabilities
compute_weighted_component_densities
identify_active_components
evaluate_membership_functions
Diagnostics:
find_dominance_reversals
Visualization:
plot_gmm_density
plot_posterior_probabilities
plot_membership_functions
Synthetic data:
sample_gaussian_mixture
make_tail_conflict_dataset
See docs/API.md for a compact API description.
Interpretation
The corrected outputs are membership functions rather than normalized posterior probabilities. Consequently, membership values across components are not required to sum to one for every observation.
Citation
When this implementation is used to apply the ordered GMM membership-function method, cite:
Suwalska A, Polanska J. GMM-Based Expanded Feature Space as a Way to Extract Useful Information for Rare Cell Subtypes Identification in Single-Cell Mass Cytometry. International Journal of Molecular Sciences. 2023;24(18):14033. doi:10.3390/ijms241814033.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gmm_membership-0.3.2.tar.gz.
File metadata
- Download URL: gmm_membership-0.3.2.tar.gz
- Upload date:
- Size: 22.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
85d1b13c169ff35378079cfcca500ec0e61653fe039fcebd6fddc7a937a7096f
|
|
| MD5 |
f8c9df4d49d5410aa5325ca8af3f79ef
|
|
| BLAKE2b-256 |
2ed61abda3635d7250d16d253699b93753b241ada2f7f3ae6eb76b60815545d0
|
File details
Details for the file gmm_membership-0.3.2-py3-none-any.whl.
File metadata
- Download URL: gmm_membership-0.3.2-py3-none-any.whl
- Upload date:
- Size: 20.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
78560ddd10799ec4d125a223ab4650bcea5b4ff7d6ab105af8fa491465b6e224
|
|
| MD5 |
4e60dadbc98cbe6b86f826df2c8bed5c
|
|
| BLAKE2b-256 |
c381b4dd1b672577add66502161b6e12e04b0ad7cd81720bf5ebb72245607c44
|