Sparse Utility Matrices and Ordinary SVD

Ordinary classical SVD requires a complete matrix. A recommender utility matrix is sparse because most user-item pairs were never observed, not because the user assigned a numeric zero. This difference is why direct zero filling can dominate the signal.

Why zero-filling fails

Zero filling changes an observed-entry problem

into a dense approximation problem

where for every missing pair. That objective treats unobserved pairs as equally confident zeros, unlike matrix factorization or implicit-feedback weighting.

Worked example

This snippet zero-fills a sparse utility matrix and applies rank-1 SVD reconstruction to show how missing entries can be distorted by ordinary SVD.

import numpy as np
R = np.array([[5., 0., 0., 0.], [0., 0., 4., 0.], [0., 0., 5., 4.]])
U, s, Vt = np.linalg.svd(R, full_matrices=False)
R1 = (U[:, :1] * s[:1]) @ Vt[:1]
print("zero_filled_density", round(float((R > 0).mean()), 3))
print("rank1_reconstruction")
print(np.round(R1, 2))

Observed output:

zero_filled_density 0.333
rank1_reconstruction
[[0.   0.   0.   0.  ]
 [0.   0.   3.06 1.7 ]
 [0.   0.   5.52 3.06]]

The first user’s only positive rating disappears from the rank-1 reconstruction because the dense zero pattern overwhelms it. SVD versus matrix factorization is the canonical comparison page for this distinction.

Modeling choiceConsequence
Treat missing entries as zeroThe objective rewards reconstructing the many zeros.
Fit only observed entriesThe model focuses on known ratings or interactions.
Weight implicit feedback by confidenceMissing pairs remain low-confidence rather than hard negatives.

Caveats

Zero-filled SVD can still be a deliberate baseline, especially when zeros truly mean non-consumption after exposure. But most logs lack full exposure data, so treating unknown as negative injects position, popularity, and catalogue-size bias. Prefer observed-entry objectives or confidence-weighted losses, then evaluate top-k ranking behavior.

References