asgard-ai-platform/algo-rec-mf
Implement matrix factorization to decompose user-item interaction matrices into latent factor representations. Use this skill when the user needs scalable collaborative filtering, latent feature discovery, or dimensionality reduction for recommendation — even if they say 'SVD recommendations', 'latent factors', or 'factorize the rating matrix'.
npx skills add https://github.com/asgard-ai-platform/skills --skill algo-rec-mf
Matrix factorization decomposes the user-item interaction matrix R (m×n) into two low-rank matrices: U (m×k) and V (n×k), where k << min(m,n). Predicted rating: r̂ᵢⱼ = uᵢ · vⱼ. Trains in O(k × nnz × iterations) where nnz = non-zero entries.
Trigger conditions:
When NOT to use:
IRON LAW: Rank k Controls Bias-Variance Trade-Off
- Too LOW k: underfits, misses nuanced preferences (high bias)
- Too HIGH k: overfits to noise, poor generalization (high variance)
- Typical k: 20-200. Select via cross-validation on held-out ratings.
- Always add regularization (λ) to prevent overfitting.
Load sparse interaction matrix. Split into train/validation/test. Check minimum density.
Gate: Train matrix has sufficient entries per user and item.
ALS (Alternating Least Squares):
SGD alternative: Update u_i, v_j incrementally for each observed rating using gradient descent.
Compute RMSE on held-out validation set. Compare against baseline (global mean, user mean).
Gate: Validation RMSE significantly below baseline.
Return top-N predictions per user with predicted scores.
{
"recommendations": [{"user_id": "u1", "items": [{"item_id": "i5", "predicted_rating": 4.3}]}],
"metadata": {"rank_k": 50, "regularization": 0.01, "iterations": 20, "train_rmse": 0.82, "val_rmse": 0.91}
}
Input: 3×3 rating matrix R (0 = unobserved), k=1
R = [[5, 3, 0],
[4, 0, 2],
[0, 1, 1]]
Expected: After ALS with k=1 (one latent factor, λ=0.01, 50 iterations), approximate factorization:
U ≈ [[2.24], [1.84], [0.53]]
V ≈ [[2.23], [1.06], [0.98]]
R_hat ≈ [[4.99, 2.37, 2.20],
[4.10, 1.95, 1.80],
[1.18, 0.56, 0.52]]
Verify: R_hat ≈ R on observed entries (within 0.2 RMSE). U[0] >> U[2] correctly captures user 0's higher ratings.
| Input | Expected | Why |
|-------|----------|-----|
| User with 1 rating | Poor predictions for that user | Insufficient data to learn user factors |
| Highly popular item | Predicted near average | Dominant first latent factor captures popularity |
| All ratings = 5 | Trivial factorization | No variance to learn from |
references/optimization-comparison.mdreferences/implicit-mf.mdTake asgard-ai-platform/algo-rec-mf from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.