DensityFlow
A deep additive model for learning perturbation semantics.
Installation
- Create a virtual environment
conda create -n densityflow python=3.10 scipy numpy pandas scikit-learn && conda activate densityflow
- Install PyTorch following the official instruction.
pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu126
- Install DensityFlow
pip3 install DensityFlow
Tutorial
More examples are availablet at DensityFlow's reprodcibility repository.
Example
Dataset used in this example is obtained from scPerturb
import re
import scanpy as sc
from DensityFlow import DensityFlow
from DensityFlow.perturb import LabelMatrix
from sklearn.model_selection import train_test_split
from eval_metrics import mmd_eval, r2_score_eval, pearson_eval
# perturbation information
pert_col = 'perturbation'
control_label = 'control'
loss_func = 'multinomial'
# load single cell data
adata = sc.read_h5ad('PapalexiSatija2021_eccite_RNA.h5ad')
sc.pp.normalize_total(adata)
sc.pp.log1p(adata)
# normalize perturbation labels
adata.obs[pert_col] = [re.sub(r'g\d+$', '', s) for s in adata.obs[pert_col]]
# split single cell data into training and test subsets
cells_pert = adata[adata.obs[pert_col]!=control_label].obs_names
cells_train, cells_test = train_test_split(cells_pert, test_size= adata.shape[0] // 8)
cells_train = cells_train.tolist() + adata[adata.obs[pert_col]==control_label].obs_names.tolist()
adata_train = adata[cells_train].copy()
adata_test = adata[cells_test].copy()
# prepare data for training
xs = adata_train.X
lb = LabelMatrix()
us = lb.fit_transform(adata_train.obs[pert_col],control_label)
ln = lb.labels_
# training model
model = DensityFlow(input_size = xs.shape[1],
cell_factor_size=us.shape[1],
loss_func = loss_func,
seed=42,
use_cuda=True)
model.fit(xs, us=us, num_epochs=200, batch_size=1000, use_jax=True)
# save model
# DensityFlow.save_model(model, f'densityflow_{loss_func}_model.pt')
# load pre-trained model
# model = DensityFlow.load_model(f'densityflow_{loss_func}_model.pt')
# evaluation
def predict_pert_effect(ad,pert):
ad = ad.copy()
xs_pert = ad.X.toarray()
zs_basal = model.get_basal_embedding(xs_pert, show_progress=False)
ind = int(np.where(ln==pert)[0])
us_pert = np.ones([xs_pert.shape[0],1])
dzs = model.get_cell_shift(ad.X.toarray(), perturb_idx=ind, perturb_us=us_pert, show_progress=False)
counts = model.get_counts(zs_basal+dzs, library_sizes=ad.X.sum(1), show_progress=False)
return counts.copy()
results = []
pert_sets = adata_test.obs[pert_col].unique().tolist()
i = 0
for pert in pert_sets:
i += 1
print(f'{i}/{len(pert_sets)}')
if pert==control_label:
continue
ad_test = adata_test[adata_test.obs[pert_col]==pert].copy()
xs_test = ad_test.X.toarray()
ind = np.random.choice(np.arange(adata_control.shape[0]), size=ad_test.shape[0], replace=True)
ad_ctrl = adata_control[ind].copy()
ad_ctrl.obs_names_make_unique()
xs_basal = ad_ctrl.X.toarray()
xs_test_pred = predict_pert_effect(ad_test, pert)
xs_test_pred = xs_test_pred.astype(float)
xs_test = xs_test.astype(float)
xs_basal = xs_basal.astype(float)
mmd_value=mmd_eval(xs_test_pred, xs_test)
r2 = r2_score_eval(xs_test_pred, xs_test)
pr = pearson_eval(xs_test_pred-xs_basal,xs_test-xs_basal)
print(f'mmd:{mmd_value}; r2:{r2}; pearson:{pr}')
results.append({'mmd':mmd_value,'r2':r2,'pearson':pr})
df = pd.DataFrame(results)
df.mean(0)
Metadata
Release files for DensityFlow 1.1.26
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| densityflow-1.1.26.tar.gz | 49.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| densityflow-1.1.26-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 124.8 kB
Release files / densityflow-1.1.26.tar.gz
| Download URL | densityflow-1.1.26.tar.gz |
|---|---|
| Size | 49.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e5bd865ee7c2fc7ed21422ebf3e92ab24c8d1433b42a5cf4ea9ce051a5c4843e
|
|
BLAKE2b-256 checksum How to use checksums |
bf4c67f53a6c40c46890c77bce53839e0deba90507d446f72b93f3c851c2a989
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.18
|
Release files / densityflow-1.1.26-py3-none-any.whl
| Download URL | densityflow-1.1.26-py3-none-any.whl |
|---|---|
| Size | 74.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
18ed2d14422565c020869e7b30847222ab66185e8d923e626659c8acbd8bbae6
|
|
BLAKE2b-256 checksum How to use checksums |
f5298c815dbae655b6b49977d12de6aed3eb379e5aa59ac7322b6ecd1f495067
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.18
|