# Matrix factorization with Masking

**URL:** <https://discourse.edwardlib.org/t/matrix-factorization-with-masking/469>\
**Category:** General\
**Created:** [November 3, 2017, 3:00pm UTC](https://discourse.edwardlib.org/t/matrix-factorization-with-masking/469 "2017-11-03T15:00:03Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![esdu](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.edwardlib.org/esdu/32/163_2.png) [@esdu](https://discourse.edwardlib.org/u/esdu)\
**Post date:** [November 3, 2017, 3:00pm UTC](https://discourse.edwardlib.org/t/matrix-factorization-with-masking/469/1 "2017-11-03T15:00:03Z")

</div>

I’m trying to compute matrix factorization R = UV’, except there are certain entries in R that we don’t know (eg. R is a ratings matrix for user-movie recommendations), how do I specify I want those entries to be masked out?

My attempt so far:

```python
R_ = np.array([[1,3,3,4,5],
                  [1,2,4,3,5],
                  [5,3,2,5,1]])
mask_ = np.array([[1,1,1,1,1],
                  [1,0,0,0,0],
                  [1,1,1,1,1]])

n_users, n_items = R_.shape
latent_dim = 2

U = ed.models.Normal(loc=tf.zeros([n_users, latent_dim]), scale=tf.ones([n_users, latent_dim]), name="user_matrix")
V = ed.models.Normal(loc=tf.zeros([n_items, latent_dim]), scale=tf.ones([n_items, latent_dim]), name="item_matrix")
R = ed.models.Normal(loc=tf.matmul(U, V, transpose_b=True), scale=0.1 * tf.ones([n_users, n_items]))

mask = tf.placeholder(tf.bool, shape=mask_.shape)
R_masked = tf.boolean_mask(R, mask)

qU = ed.models.Normal(loc=tf.Variable(tf.random_normal([n_users, latent_dim])),
                      scale=tf.nn.softplus(tf.Variable(tf.random_normal([n_users, latent_dim]))))
qV = ed.models.Normal(loc=tf.Variable(tf.random_normal([n_items, latent_dim])),
                      scale=tf.nn.softplus(tf.Variable(tf.random_normal([n_items, latent_dim]))))

sess = ed.get_session()
tf.global_variables_initializer().run()
inference = ed.KLqp({U: qU, V: qV}, data={R_masked: R_[np.where(mask_)]})
# inference = ed.KLqp({U: qU, V: qV}, data={R: R_}) # <- btw this works, but it's not what I want.
inference.run(n_iter=1000, n_samples=5)

```

This runs but it doesn’t learn anything - any idea what I’m doing wrong? Thanks.

---

<div class="post-metadata">

**Author:** ![esdu](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.edwardlib.org/esdu/32/163_2.png) [@esdu](https://discourse.edwardlib.org/u/esdu)\
**Post date:** [November 3, 2017, 3:09pm UTC](https://discourse.edwardlib.org/t/matrix-factorization-with-masking/469/2 "2017-11-03T15:09:44Z")

</div>

Oh hold on, here’s an idea. I can just put very high variance on R, right?

```python
R = ed.models.Normal(loc=tf.matmul(U, V, transpose_b=True), scale=100 * (1-mask) + 0.1)

```

This seems to work. Please let me know if this isn’t right!
