Skip to content

Commit 8a708f6

Browse files
authored
Merge pull request #22 from quadbio/feat/equal_weight
Implement simple kernel with equal weight for all neighbors
2 parents b95cae7 + 253c46d commit 8a708f6

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

src/cellmapper/cellmapper.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ def compute_neighbors(
244244

245245
def compute_mappping_matrix(
246246
self,
247-
method: Literal["jaccard", "gaussian", "scarches", "inverse_distance", "random", "hnoca"] = "gaussian",
247+
method: Literal["jaccard", "gaussian", "scarches", "inverse_distance", "random", "hnoca", "equal"] = "gaussian",
248248
) -> None:
249249
"""
250250
Compute the mapping matrix for label transfer.
@@ -255,11 +255,12 @@ def compute_mappping_matrix(
255255
Method to use for computing the mapping matrix. Options include:
256256
257257
- "jaccard": Jaccard similarity. Inspired by GLUE :cite:`cao2022multi`
258-
- "gaussian": Gaussian kernel with adaptive bandwidth. Loosely inspired by MAGIC :cite:`van2018recovering`
258+
- "gaussian": Gaussian kernel with (global) bandwith equal to the mean distance.
259259
- "scarches": scArches kernel. Inspired by scArches :cite:`lotfollahi2022mapping`
260260
- "inverse_distance": Inverse distance kernel.
261261
- "random": Random kernel, useful for testing.
262262
- "hnoca": HNOCA kernel. Inspired by HNOCA-tools :cite:`he2024integrated`
263+
- "equal": All neighbors are equally weighted (1/n_neighbors).
263264
264265
Returns
265266
-------
@@ -290,7 +291,7 @@ def compute_mappping_matrix(
290291
jaccard.data /= 2 * n_neighbors - jaccard.data
291292
jaccard.data = jaccard.data**2
292293
self.mapping_matrix = jaccard
293-
elif method in ["gaussian", "scarches", "inverse_distance", "random"]:
294+
elif method in ["gaussian", "scarches", "inverse_distance", "random", "equal"]:
294295
self.mapping_matrix = self.knn.yx.knn_graph_connectivities(kernel=method)
295296
else:
296297
raise NotImplementedError(f"Method '{method}' is not implemented.")

src/cellmapper/knn.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,10 @@ def _compute_kernel_values(
199199
# Apply Gaussian kernel to valid entries
200200
connectivities[valid_mask] = np.exp(-(finite_distances**2) / (2 * sigma**2))
201201

202+
elif kernel == "equal":
203+
# Set connectivities to 1 for valid entries
204+
connectivities[valid_mask] = 1.0
205+
202206
elif kernel == "scarches":
203207
# Calculate sigma using only finite distances
204208
sigma = np.std(finite_distances)
@@ -218,7 +222,7 @@ def _compute_kernel_values(
218222

219223
else:
220224
raise ValueError(
221-
f"Unknown kernel: {kernel}. Supported kernels are: 'gaussian', 'scarches', 'random', 'inverse_distance'."
225+
f"Unknown kernel: {kernel}. Supported kernels are: 'gaussian', 'scarches', 'random', 'inverse_distance', 'equal'."
222226
)
223227

224228
return connectivities

tests/test_cellmapper.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ def test_expression_transfer(self, cmap, expected_expression_transfer_metrics):
3333
cmap.evaluate_expression_transfer(layer_key="X", method="pearson")
3434
assert_metrics_close(cmap.expression_transfer_metrics, expected_expression_transfer_metrics)
3535

36-
@pytest.mark.parametrize("method", ["gaussian", "scarches", "random", "inverse_distance", "jaccard", "hnoca"])
36+
@pytest.mark.parametrize(
37+
"method", ["gaussian", "scarches", "random", "inverse_distance", "jaccard", "hnoca", "equal"]
38+
)
3739
def test_compute_mapping_matrix_all_methods(self, cmap, method):
3840
cmap.compute_mappping_matrix(method=method)
3941
assert cmap.mapping_matrix is not None

0 commit comments

Comments
 (0)