raphael-group / paste2

Probabilistic Alignment of Spatial Transcriptomics Experiments v.2
BSD 3-Clause "New" or "Revised" License
28 stars 2 forks source link

GlmpcaError: Numerical divergence (deviance no longer finite), try increasing the penalty to improve stability of optimization. #7

Open Li-ZhiD opened 3 months ago

Li-ZhiD commented 3 months ago

Hi,

I am interested in this tool for constructing 3D model of Stere-seq datasets. An error is raised when I run partial_pairwise_align. I'm not quite sure if the data is too large.

Thank you!

/mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/statsmodels/genmod/families/links.py:527: RuntimeWarning: overflow encountered in exp
  return np.exp(z)
/mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/glmpca.py:393: RuntimeWarning: invalid value encountered in divide
  U[:, k] += grads / infos
/mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/statsmodels/genmod/families/family.py:445: RuntimeWarning: invalid value encountered in divide
  endog_mu = self._clean(endog / mu)

---------------------------------------------------------------------------
GlmpcaError                               Traceback (most recent call last)
Cell In[27], line 1
----> 1 pi_AB = PASTE2.partial_pairwise_align(adata_st_lst[0], adata_st_lst[1], s=0.7)

File /mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/PASTE2.py:260, in partial_pairwise_align(sliceA, sliceB, s, alpha, armijo, dissimilarity, use_rep, G_init, a_distribution, b_distribution, norm, return_obj, verbose)
    258     M = pca_distance(sliceA, sliceB, 2000, 20)
    259 elif dissimilarity.lower() == 'glmpca':
--> 260     M = glmpca_distance(A_X, B_X, latent_dim=50, filter=True, verbose=verbose)
    261 else:
    262     print("ERROR")

File /mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/helper.py:82, in glmpca_distance(X, Y, latent_dim, filter, verbose)
     79     joint_matrix = joint_matrix[:, top_indices]
     81 print("Starting GLM-PCA...")
---> 82 res = glmpca(joint_matrix.T, latent_dim, penalty=1, verbose=verbose)
     83 #res = glmpca(joint_matrix.T, latent_dim, fam='nb', penalty=1, verbose=True)
     84 reduced_joint_matrix = res["factors"]

File /mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/glmpca.py:374, in glmpca(Y, L, fam, ctl, penalty, verbose, init, nb_theta, X, Z, sz)
    372 dev[t] = gf.dev_func(Y, rfunc(U, V))
    373 if not np.isfinite(dev[t]):
--> 374     raise GlmpcaError(
    375         "Numerical divergence (deviance no longer finite), try increasing the penalty to improve stability of optimization.")
    376 if t > 4 and np.abs(dev[t] - dev[t - 1]) / (0.1 + np.abs(dev[t - 1])) < ctl["eps"]:
    377     break

GlmpcaError: Numerical divergence (deviance no longer finite), try increasing the penalty to improve stability of optimization.
Li-ZhiD commented 3 months ago

After setting penalty=2, warning and error are raised:

[/mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/statsmodels/genmod/families/links.py:527](http://192.168.1.111:8899/mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/statsmodels/genmod/families/links.py#line=526): RuntimeWarning: overflow encountered in exp
  return np.exp(z)
[/mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/glmpca.py:388](http://192.168.1.111:8899/mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/glmpca.py#line=387): RuntimeWarning: invalid value encountered in divide
  V[:, k] += grads [/](http://192.168.1.111:8899/) infos
---------------------------------------------------------------------------
GlmpcaError                               Traceback (most recent call last)
Cell In[16], line 1
----> 1 pi_AB = PASTE2.partial_pairwise_align(adata_st_lst[0], adata_st_lst[1], s=0.7)

File /mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/PASTE2.py:260, in partial_pairwise_align(sliceA, sliceB, s, alpha, armijo, dissimilarity, use_rep, G_init, a_distribution, b_distribution, norm, return_obj, verbose)
    258     M = pca_distance(sliceA, sliceB, 2000, 20)
    259 elif dissimilarity.lower() == 'glmpca':
--> 260     M = glmpca_distance(A_X, B_X, latent_dim=50, filter=True, verbose=verbose)
    261 else:
    262     print("ERROR")

File /mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/helper.py:83, in glmpca_distance(X, Y, latent_dim, filter, verbose)
     81 print("Starting GLM-PCA...")
     82 #res = glmpca(joint_matrix.T, latent_dim, penalty=1, verbose=verbose)
---> 83 res = glmpca(joint_matrix.T, latent_dim, penalty=2, verbose=verbose)
     84 #res = glmpca(joint_matrix.T, latent_dim, fam='nb', penalty=1, verbose=True)
     85 reduced_joint_matrix = res["factors"]

File /mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/glmpca.py:374, in glmpca(Y, L, fam, ctl, penalty, verbose, init, nb_theta, X, Z, sz)
    372 dev[t] = gf.dev_func(Y, rfunc(U, V))
    373 if not np.isfinite(dev[t]):
--> 374     raise GlmpcaError(
    375         "Numerical divergence (deviance no longer finite), try increasing the penalty to improve stability of optimization.")
    376 if t > 4 and np.abs(dev[t] - dev[t - 1]) / (0.1 + np.abs(dev[t - 1])) < ctl["eps"]:
    377     break

GlmpcaError: Numerical divergence (deviance no longer finite), try increasing the penalty to improve stability of optimization.
Li-ZhiD commented 3 months ago

By using dissimilarity='pca'.

/mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/ot/lp/__init__.py:361: UserWarning: numItermax reached before optimality. Try to increase numItermax.
  result_code_string = check_result(result_code)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[12], line 1
----> 1 pi_AB = PASTE2.partial_pairwise_align(
      2     adata_st_lst[0],
      3     adata_st_lst[1],
      4     s=0.7,
      5     dissimilarity='pca'
      6 )

File /mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/PASTE2.py:292, in partial_pairwise_align(sliceA, sliceB, s, alpha, armijo, dissimilarity, use_rep, G_init, a_distribution, b_distribution, norm, return_obj, verbose)
    288     D_B *= M.max()
    289     """
    290     Code for normalizing distance matrix ends
    291     """
--> 292 pi, log = partial_fused_gromov_wasserstein(M, D_A, D_B, a, b, alpha=alpha, m=m, G0=G_init, loss_fun='square_loss', armijo=armijo, log=True, verbose=verbose)
    294 if return_obj:
    295     return pi, log['partial_fgw_cost']

File /mnt/data1/robot/software/miniconda3/envs/paste2/lib/python3.9/site-packages/paste2/PASTE2.py:142, in partial_fused_gromov_wasserstein(M, C1, C2, p, q, alpha, m, G0, loss_fun, armijo, log, verbose, numItermax, tol, stopThr, stopThr2)
    140 Gc, logemd = ot.lp.emd(p_extended, q_extended, gradF_emd, numItermax=1000000, log=True)
    141 if logemd['warning'] is not None:
--> 142     raise ValueError("Error in the EMD resolution: try to increase the"
    143                      " number of dummy points")
    145 G0 = Gc[:len(p), :len(q)]
    147 if cpt % 10 == 0:  # to speed up the computations

ValueError: Error in the EMD resolution: try to increase the number of dummy points