Timer unit: 1e-06 s

Total time: 472.926 s
File: <ipython-input-4-be84f0e0a4c8>
Function: ssvd_vanilla at line 14

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    14                                           def ssvd_vanilla(X,param=None):
    15         1          6.0      6.0      0.0      n, d = X.shape
    16         1          3.0      3.0      0.0      ttypu = 1;ttypv = 1 #threshold type for u,v
    17         1          2.0      2.0      0.0      gamu = 0;gamv = 0   #nonnegative parameter 
    18         1   37470685.0 37470685.0      7.9      u, s, v = np.linalg.svd(X)
    19         1         11.0     11.0      0.0      u0 = u[:,0]
    20         1          5.0      5.0      0.0      v = v.T; v0 = v[:,0]
    21         1          1.0      1.0      0.0      tol = 10**-4
    22         1          1.0      1.0      0.0      niter = 20
    23         1          2.0      2.0      0.0      ud = 1
    24         1          2.0      2.0      0.0      vd = 1
    25         1          2.0      2.0      0.0      iters = 0
    26         1       1586.0   1586.0      0.0      SST = np.sum(X**2)
    27         6         18.0      3.0      0.0      while (ud > tol or vd > tol):
    28         5         10.0      2.0      0.0          iters = iters + 1
    29                                                   
    30                                                   #Updating v
    31         5       2055.0    411.0      0.0          zv = np.matmul(X.T,u0)
    32         5        194.0     38.8      0.0          wv = abs(zv)**gamv     #data driven weight
    33         5        281.0     56.2      0.0          sigsq = (SST - np.sum(zv**2))/(n*d-d)
    34         5       5039.0   1007.8      0.0          tv = np.sort(np.append(abs(zv**wv),0))
    35         5     174106.0  34821.2      0.0          pv = sum(tv>0)
    36         5        313.0     62.6      0.0          Bv = np.ones((d+1,1))*np.Inf
    37     63130     197490.0      3.1      0.0          for i in range(0,pv):
    38     63125     177588.0      2.8      0.0              lvc = tv[d-i]
    39     63125    4156028.0     65.8      0.9              para = {'ttyp': ttypv, 'plambda': lvc/wv[wv!=0]}
    40     63125   12184464.0    193.0      2.6              temp2 = thresh(zv[wv!=0],para['ttyp'],para['plambda'])
    41     63125     170385.0      2.7      0.0              vc = temp2
    42     63125  416448161.0   6597.2     88.1              Bv[i] = sum(sum((X - u0[:,np.newaxis]*vc[:,np.newaxis].T)**2)/sigsq + i*np.log(n*d))
    43         5        242.0     48.4      0.0          Iv = np.argmin(Bv)+1
    44         5       4557.0    911.4      0.0          temp = np.sort(np.append(abs(zv* wv),0))
    45         5         30.0      6.0      0.0          lv = temp[d-Iv-1]
    46         5        257.0     51.4      0.0          para['plambda'] = np.multiply(lv, wv[wv!=0])
    47         5        899.0    179.8      0.0          temp2 = thresh(zv[wv!=0],para['ttyp'],para['plambda'])
    48         5         11.0      2.2      0.0          v1 = temp2
    49         5      12569.0   2513.8      0.0          v1 = v1/np.sqrt(sum(v1**2)) #v_new
    50                                           
    51                                                   #Updating u
    52         5       7834.0   1566.8      0.0          zu = np.matmul(X, v1)
    53         5         60.0     12.0      0.0          wu = abs(zu)**gamu
    54         5        111.0     22.2      0.0          sigsq = (SST - sum(zu**2))/(n*d-n)
    55         5        280.0     56.0      0.0          tu = np.sort(np.append(abs(zu**wu),0))
    56         5        860.0    172.0      0.0          pu = sum(tu>0)
    57         5        132.0     26.4      0.0          Bu = np.ones((n+1,1))*np.Inf
    58       285        856.0      3.0      0.0          for i in range(0,pu):
    59       280        721.0      2.6      0.0              luc = tu[n-i]
    60       280       4692.0     16.8      0.0              para = {'ttyp': ttypu, 'plambda': luc/wu[wu!=0]}
    61       280       8692.0     31.0      0.0              temp2 = thresh(zu[wu!=0],para['ttyp'],para['plambda'])
    62       280        588.0      2.1      0.0              uc = temp2
    63       280    1804202.0   6443.6      0.4              Bu[i] = sum(sum((X - uc[:,np.newaxis]*v1[:,np.newaxis].T)**2)/sigsq + i*np.log(n*d))
    64         5        141.0     28.2      0.0          Iu = np.argmin(Bu)+1
    65         5        418.0     83.6      0.0          temp = np.sort(np.append(abs(zu*wu),0))
    66         5         25.0      5.0      0.0          lu = temp[n-Iv-1]
    67         5         85.0     17.0      0.0          para['plambda'] = lu/wu[wu!=0]
    68         5         97.0     19.4      0.0          temp2 = thresh(zu[wu!=0],para['ttyp'],para['plambda'])
    69         5         10.0      2.0      0.0          u1 = temp2
    70         5        127.0     25.4      0.0          u1 = u1/np.sqrt(sum(u1**2)) #u_new
    71                                           
    72         5        236.0     47.2      0.0          ud = np.sqrt(np.sum((u0-u1)**2))
    73         5        334.0     66.8      0.0          vd = np.sqrt(np.sum((v0-v1)**2))
    74         5         13.0      2.6      0.0          if iters > niter:
    75                                                       print('Fail to converge! Increase the niter!')
    76                                                       break
    77         5         10.0      2.0      0.0          u0 = u1
    78         5         10.0      2.0      0.0          v0 = v1
    79         1          3.0      3.0      0.0      u = u1
    80         1      88810.0  88810.0      0.0      v = v1
    81         1          8.0      8.0      0.0      return u,s[0],v,iters