(L, num_vecs = 3, tol = 1e-6, maxiter = 5000)
| 160 | |
| 161 | # Function: SE |
| 162 | def spectral_embedding(L, num_vecs = 3, tol = 1e-6, maxiter = 5000): |
| 163 | n = L.shape[0] |
| 164 | if n <= 2: |
| 165 | return np.zeros((n, 1), dtype = float) |
| 166 | num_vecs = int(max(1, min(num_vecs, n - 1))) |
| 167 | k_req = min(num_vecs + 3, n - 1) |
| 168 | k_req = max(k_req, 2) |
| 169 | try: |
| 170 | vals, vecs = eigsh(L, k = k_req, which = 'SM', tol = tol, maxiter = maxiter) |
| 171 | except ArpackNoConvergence as e: |
| 172 | if e.eigenvectors is not None and e.eigenvalues is not None: |
| 173 | vals, vecs = e.eigenvalues, e.eigenvectors |
| 174 | else: |
| 175 | k_req2 = max(2, min(k_req - 1, n - 1)) |
| 176 | vals, vecs = eigsh(L, k = k_req2, which = 'SM', tol = tol, maxiter = maxiter) |
| 177 | idx = np.argsort(vals) |
| 178 | vals = vals[idx] |
| 179 | vecs = vecs[:, idx] |
| 180 | eps = 1e-10 |
| 181 | j = 0 |
| 182 | while j < len(vals) and vals[j] < eps: |
| 183 | j = j + 1 |
| 184 | if j >= len(vals): |
| 185 | j = 1 |
| 186 | end = min(j + num_vecs, vecs.shape[1]) |
| 187 | if end <= j: |
| 188 | end = min(j + 1, vecs.shape[1]) |
| 189 | return vecs[:, j:end].copy() |
| 190 | |
| 191 | ############################################################################ |
| 192 |
no outgoing calls
no test coverage detected