Support for kmeans initialization with vmap
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 1k
- Forks
- 114
- Avg merge
- 19h 14m
- Merged PRs (30d)
- 1
Description
Hi there,
When I try to use vmap to vectorize a function that includes a kmeans initialization, I get the following error:
jax._src.errors.TracerArrayConversionError: The numpy.ndarray conversion method __array__() was called on the JAX Tracer object Traced<ShapedArray(float32[11396,7])>with<BatchTrace(level=1/0)>
And here's the code that produces the error:
hmm = GaussianHMM(latdim, obsdim)
data1 = jnp.array(data1)
data2 = jnp.array(data2)
data1_train = jnp.stack([jnp.concatenate([data1[:i], data1[i+1:]]) for i in range(len(data1))])
data2_train = jnp.stack([jnp.concatenate([data2[:i], data2[i+1:]]) for i in range(len(data2))])
base_params1, props1 = hmm.initialize(key=get_key(), method="kmeans", emissions=data1[:length,:,:])
params1, _ = hmm.fit_em(base_params1, props1, data1[:length,:,:], num_iters=100, verbose=False)
base_params2, props2 = hmm.initialize(key=get_key(), method="kmeans", emissions=data2[:length,:,:])
params2, _ = hmm.fit_em(base_params2, props2, data2[:length,:,:], num_iters=100, verbose=False)
def _fit_fold(train, test, params):
base_params, props = hmm.initialize(key=get_key(), method="kmeans", emissions=train[:length,:,:])
fit_params, _ = hmm.fit_em(base_params, props, train[:length,:,:], num_iters=100, verbose=False)
return (hmm.marginal_log_prob(fit_params, test) > hmm.marginal_log_prob(params, test)).astype(int)
correct1 = jnp.sum(vmap(_fit_fold, in_axes = [0,0,None])(data1_train,data1,params2))
The error traces back to scikit-learn and Kmeans. The problem seems to be that scikit-learn uses numpy functions and not jax functions. Would it be possible to update hmm.initialize so that it could be use in vectorized functions?
Thanks!
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with hmm.initialize and its method="kmeans" path, then trace the scikit-learn Kmeans call shown by the error. Reproduce the failure using the provided _fit_fold and vmap example. Done means kmeans initialization works inside the vectorized function without converting a JAX tracer through NumPy or scikit-learn.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- numpy, python, scikit-learn
- Domain
- machine-learning
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100