Machine learning · Generative models · Genomics
I build models that bridge AI and biology, from generative modeling to omics-driven discovery.
// the short version
I'm a machine-learning researcher with a PhD in AI for the life sciences. I focus on generative models and graph-based approaches, and the representation-learning problems underneath them, applied to how different omics interact in space and disease.
Right now I'm a postdoc in Jeroen de Ridder's lab at the Prinses Máxima Center, working on how well genomic AI models actually generalise. When a sequence-to-activity model scores well, has it learned regulatory grammar, or has it learned the assay it was trained on? Most of my time goes into evaluation that can tell those two apart: held-out scoring, perturbation and attribution analysis, and label-noise ceilings that show how much signal the data contains in the first place.
Before that, my PhD work was multi-omics integration: deep learning over large-scale single-cell and spatial data, and optimal transport when I needed to compare two conditions without pretending they already lived in the same coordinate system.
"Problems worthy of attack prove their worth by fighting back" · Piet Hein
34.5M parameters · CPU inference at ~140 MB
A masked transformer trained from scratch to draw ASCII art from a text prompt. Characters are the tokens rather than pixels: the model fills a 48×80 grid by iterative parallel unmasking. The write-up documents nine failures, including two published decoding techniques that did not survive contact with the domain.
R² 0.82 · Spearman ρ 0.33
A physics-informed graph attention network that predicts metabolite concentrations from gene expression. A metabolite-conditioned reader queries learned pathway representations from each metabolite's chemical structure, so it scores unseen metabolites zero-shot, with no metabolite-specific parameters.
A spatially aware model of ligand-receptor signaling in polycystic kidney disease (ADPKD), built to ask which cells are talking to each other, and where.
spVIPES separates the biological variation two conditions share from the variation each one keeps to itself. It is variational inference with a product-of-experts alignment, plus optimal transport so the two latent spaces can be compared without assuming they already line up.
140k cells · 59 datasets · iScience 2023
A single-cell atlas of the healthy mouse kidney. Eight studies integrated with scVI and scANVI, then scHPL to label cell populations automatically. The interesting part was the markers it turned up for cell types nobody had described well.
A model that pulls apart the transcriptional effects of spaceflight, separating radiation from microgravity, using NASA GeneLab data. Telling the two apart matters for predicting what a long mission does to the people on it.
// peer-reviewed papers & preprints
// things I built on weekends, with no particular plan
Reads public mood off the Twitter firehose in real time. Built during the pandemic, when the mood changed by the hour.
view repo ↗Works out which NGS library type you're looking at. Wrapped in a small Django app so it works for people who'd rather not open a terminal.
view repo ↗A tiny Python class for modeling DNA sequences. The kind of thing you write to understand something, not because it needs to exist.
view repo ↗Slowly working through NeetCode.io. Progress is uneven.
view repo ↗// query the source, get answers cited back to the line
This runs BM25 lexical retrieval over my public repositories. There is no language model in the loop, so it cannot invent an answer. Every result links back to the lines it came from, and you should check them.