01The window
Based in London
About me
I've just finished an MSc in Artificial Intelligence at King's College London, after a First-Class BSc in Computer Science at City, University of London.
I like the whole loop of an AI system: getting the data right, choosing a fair baseline, building the model and writing up honestly what worked and what didn't. Lately that means LLM agents that plan, write and check their own output.
02The orb lamp
Quantum autoencoders for ICU anomaly detection
MSc dissertation, King's College London, 2026
Can a quantum autoencoder catch anomalies in ICU waveforms as well as classical deep models? I built a fair comparison to find out.
54trainable parameters, level with a classical model of 72,838 on ECG
The lamp is a Bloch sphere. Click it to measure the qubit.
Problem
ICU monitors stream multichannel waveforms, and the anomalies that matter are rare. Quantum autoencoders are a proposed way to model this, but they are rarely compared fairly against classical deep models. I asked whether one can detect anomalies in ICU waveforms as well as two classical autoencoders.
Approach
Three models trained on normal windows only: an LSTM autoencoder, a temporal convolutional autoencoder and an amplitude-encoding quantum autoencoder, all on identical patient-level splits with one shared scoring module. The quantum model loads a 256-sample window into 8 qubits, compresses it to 5 and scores each window by how far its 3 discarded qubits are from |000⟩. It trains in PyTorch on an exact statevector engine, agrees with Classiq's simulator to within 6e-16 and was re-checked with a 4,096-shot swap test.
- 256-sample window
- amplitude encoding
- 8 qubits
- RY, RZ and a CNOT ring, three times
- 5 kept, 3 trash
- score = 1 − F
Result
The classical baselines lead overall. On MIT-BIH ECG the quantum model matched the TCN autoencoder, ROC-AUC 0.668 against 0.670, with 54 trainable parameters instead of 72,838. On MIMIC-IV it fell behind, 0.563 against 0.717, because amplitude encoding normalises each window as a whole and hides anomalies that only change one channel's scale.
Built with PyTorch, Classiq, NumPy and scikit-learn
03Three robots
Creative-Director
LLM agents, Python
A planner, a writer and a critic. The agents plan content from evidence, write it, check it and revise it, and every decision is traced.
18 / 18golden-set checks passing
The robots are the three agents. Watch the draft go back for a rewrite.
GitHub
Problem
Generation is the easy part. Deciding what to make is harder. I wanted a pipeline that plans content from evidence, then writes, critiques and revises it, with every decision traceable afterwards.
Approach
Planner, writer and critic agents run in sequence. The planner retrieves from a markdown knowledge base with TF-IDF, written from scratch, and must cite chunk IDs. The writer returns JSON validated with pydantic, and validation errors are fed back for a retry. The critic scores relevance, hook strength, audience fit and groundedness against the retrieved evidence, and can send a draft back up to twice. Prompts are versioned files and every decision is logged to a JSONL trace.
- brief
- planner and retrieval
- writer
- critic
- revise, up to 2 times
- result and trace
Result
A golden set checks schema validity, platform rules, citations, groundedness and a minimum rubric score after every prompt or model change. Current result: 18 of 18 checks passing.
Built with Python, the Anthropic SDK, pydantic and pytest
04The arcade cabinet
Pacman MDP agent
Reinforcement learning, King's College London
Every move, the agent builds a small MDP around itself and solves it with value iteration, even though its moves slip sideways one time in five.
0.15 splanning budget per move
The cabinet runs the same idea live: value iteration, solved again after every move. The blue glow is the value map. Press P to take over.
Problem
Pacman has to clear food and avoid ghosts when its moves do not always go where it intends.
Approach
Each move, the agent builds an MDP on a 9 × 9 window around Pacman and runs value iteration with a discount of 0.95 under a slip model: the intended move 80% of the time and each side 10%. Rewards pull it toward food by BFS distance, add a small step cost, penalise stopping and value capsules highly. Planning stops at a 0.15-second budget so play stays responsive.
- game state
- 9 × 9 local MDP
- value iteration
- greedy action
Result
A reactive agent that plans a fresh policy every move, instead of solving the whole board once and hoping nothing changes.
Built with Python and the UC Berkeley Pacman framework
You're playing
Arrow keys or WASD to move. Collect the dots and keep away from the red marker. Esc hands control back.
Score0 Best0
05The framed digit
A CNN, stress-tested
Computer vision, King's College London
A compact convolutional network reaches 99.67% on MNIST. Then I tested it away from its own test set, which is where it gets interesting.
99.67%on MNIST and on corrupted MNIST-C, but 28.7% on EMNIST digits
Problem
A high MNIST score says little on its own. I wanted to know how a compact CNN behaves away from its own test set.
Approach
Convolution blocks with batch normalisation and dropout, global average pooling and a 256-unit dense layer, trained for 40 epochs with AdamW at a learning rate of 1e-3 and weight decay of 1e-4. Then I measured the generalisation gap and tested on MNIST-C and EMNIST digits.
- 28 × 28 digit
- conv blocks
- global average pooling
- dense 256
- softmax
Result
99.67% test accuracy on MNIST with a 0.11-point gap to held-out training data, and 99.67% on MNIST-C. EMNIST digits dropped to 28.7%, which shows how much preprocessing differences matter.
Built with TensorFlow and Keras
06The bookshelf
Education and skills
The bookshelf
- MSc Artificial IntelligenceKing's College London, 2026
- BSc Computer Science, First ClassCity, University of London
Every skill below has its own book on the shelf. Point at a skill to find its book.
- PyTorch
- TensorFlow
- scikit-learn
- LLM agents
- RAG
- Evals
- Structured output
- Classiq
- Python
- Java
- C++
- Azure
- GCP
- Linux
07The pillar box
Contact
I'm looking for AI/ML roles in London. Post a message here, email me, or find me on LinkedIn, X and GitHub.