From e1121669cd8cd89ecf0bf46e8e55aae62176f1d2 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Fri, 5 Apr 2024 20:04:51 +0100 Subject: [PATCH 01/30] Update SETUP.md Remove left-over reference to conda script that has been deleted. --- SETUP.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/SETUP.md b/SETUP.md index f06995e6e..814118a49 100644 --- a/SETUP.md +++ b/SETUP.md @@ -150,8 +150,6 @@ Currently, tests are done on **Python CPU** (the base environment), **Python GPU Another way is to build a docker image and use the functions inside a [docker container](#setup-guide-for-docker). -Another alternative is to run all the recommender utilities directly from a local copy of the source code. This requires installing all the necessary dependencies from Anaconda and PyPI. For instructions on how to do this, see [this guide](conda.md). - ## Setup for Making a Release The process of making a new release and publishing it to [PyPI](https://pypi.org/project/recommenders/) is as follows: From c1148e1a621deebc38987fe579a9c18601600bd6 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 8 Apr 2024 16:47:49 +0200 Subject: [PATCH 02/30] remove cast to array in similarity functions Signed-off-by: miguelgfierro --- recommenders/utils/python_utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/recommenders/utils/python_utils.py b/recommenders/utils/python_utils.py index 6efdedfed..9c831676d 100644 --- a/recommenders/utils/python_utils.py +++ b/recommenders/utils/python_utils.py @@ -62,7 +62,7 @@ def jaccard(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / (diag_rows + diag_cols - cooccurrence) - return np.array(result) + return result def lift(cooccurrence): @@ -85,7 +85,7 @@ def lift(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / (diag_rows * diag_cols) - return np.array(result) + return result def mutual_information(cooccurrence): @@ -106,7 +106,7 @@ def mutual_information(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = np.log2(cooccurrence.shape[0] * lift(cooccurrence)) - return np.array(result) + return result def lexicographers_mutual_information(cooccurrence): @@ -128,7 +128,7 @@ def lexicographers_mutual_information(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence * mutual_information(cooccurrence) - return np.array(result) + return result def cosine_similarity(cooccurrence): @@ -151,7 +151,7 @@ def cosine_similarity(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / np.sqrt(diag_rows * diag_cols) - return np.array(result) + return result def inclusion_index(cooccurrence): @@ -173,7 +173,7 @@ def inclusion_index(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / np.minimum(diag_rows, diag_cols) - return np.array(result) + return result def get_top_k_scored_items(scores, top_k, sort_top_k=False): From 0e11e49efe2d117226ae4ec611b687b6d9d1b138 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 8 Apr 2024 16:48:29 +0200 Subject: [PATCH 03/30] remove scipy limitation Signed-off-by: miguelgfierro --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c5fc49bb8..db4e1012b 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ "retrying>=1.3.4,<2", "scikit-learn>=1.2.0,<2", # requires scipy, and introduce breaking change affects feature_extraction.text.TfidfVectorizer.min_df "scikit-surprise>=1.1.3", - "scipy>=1.10.1,<1.11.0", # FIXME: We limit <1.11.0 until #1954 is fixed + "scipy>=1.10.1", "seaborn>=0.13.0,<1", # requires matplotlib, packaging "transformers>=4.27.0,<5", # requires packaging, pyyaml, requests, tqdm ] From 457b098571eca091aa308d840e4445eb47bb0393 Mon Sep 17 00:00:00 2001 From: Scott Graham <5720537+gramhagen@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:30:53 -0400 Subject: [PATCH 04/30] flattening matrix so dataframe can be built correctly Signed-off-by: Scott Graham <5720537+gramhagen@users.noreply.github.com> --- recommenders/models/sar/sar_singlenode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recommenders/models/sar/sar_singlenode.py b/recommenders/models/sar/sar_singlenode.py index 570e0d04a..c6b5ffcd5 100644 --- a/recommenders/models/sar/sar_singlenode.py +++ b/recommenders/models/sar/sar_singlenode.py @@ -593,7 +593,7 @@ def predict(self, test): { self.col_user: test[self.col_user].values, self.col_item: test[self.col_item].values, - self.col_prediction: test_scores[user_ids, item_ids], + self.col_prediction: test_scores[user_ids, item_ids].getA1(), } ) return df From b3e3a637aa44c6d994a1cf874a9d8b7785d15814 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Wed, 10 Apr 2024 22:37:05 +0200 Subject: [PATCH 05/30] Adding toarray() suggested by @gramhagen Signed-off-by: miguelgfierro --- recommenders/models/sar/sar_singlenode.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/recommenders/models/sar/sar_singlenode.py b/recommenders/models/sar/sar_singlenode.py index c6b5ffcd5..7be5bec70 100644 --- a/recommenders/models/sar/sar_singlenode.py +++ b/recommenders/models/sar/sar_singlenode.py @@ -354,11 +354,11 @@ def score(self, test, remove_seen=False): if self.normalize: counts = self.unity_user_affinity[user_ids, :].dot(self.item_similarity) user_min_scores = ( - np.tile(counts.min(axis=1)[:, np.newaxis], test_scores.shape[1]) + np.tile(counts.min(axis=1).toarray(), test_scores.shape[1]) * self.rating_min ) user_max_scores = ( - np.tile(counts.max(axis=1)[:, np.newaxis], test_scores.shape[1]) + np.tile(counts.max(axis=1).toarray(), test_scores.shape[1]) * self.rating_max ) test_scores = rescale( From 8d3b66c3ec88158cba366c443565af5ed3e33afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Dav=C3=B3?= Date: Thu, 11 Apr 2024 11:27:01 +0200 Subject: [PATCH 06/30] Added r-precision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: David Davó --- recommenders/evaluation/python_evaluation.py | 58 ++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/recommenders/evaluation/python_evaluation.py b/recommenders/evaluation/python_evaluation.py index e9adf621a..dff164ab4 100644 --- a/recommenders/evaluation/python_evaluation.py +++ b/recommenders/evaluation/python_evaluation.py @@ -541,6 +541,63 @@ def recall_at_k( return (df_hit_count["hit"] / df_hit_count["actual"]).sum() / n_users +def r_precision_at_k( + rating_true, + rating_pred, + col_user=DEFAULT_USER_COL, + col_item=DEFAULT_ITEM_COL, + col_prediction=DEFAULT_PREDICTION_COL, + relevancy_method="top_k", + k=DEFAULT_K, + threshold=DEFAULT_THRESHOLD, + **_, +): + """R-precision at K. + + R-precision can be defined as the precision@R for each user, where R is the + numer of relevant items for the query. Its also equivalent to the recall at + the R-th position. + + Note: + As R can be high, in this case, the k indicates the maximum possible R. + If every user has more than k true items, then r-precision@k is equal to + precision@k. You might need to raise the k value to get meaningful results. + + Args: + rating_true (pandas.DataFrame): True DataFrame + rating_pred (pandas.DataFrame): Predicted DataFrame + col_user (str): column name for user + col_item (str): column name for item + col_prediction (str): column name for prediction + relevancy_method (str): method for determining relevancy ['top_k', 'by_threshold', None]. None means that the + top k items are directly provided, so there is no need to compute the relevancy operation. + k (int): number of top k items per user + threshold (float): threshold of top items per user (optional) + + Returns: + float: recall at k (min=0, max=1). The maximum value is 1 even when fewer than + k items exist for a user in rating_true. + """ + df_hit, df_hit_count, n_users = merge_ranking_true_pred( + rating_true=rating_true, + rating_pred=rating_pred, + col_user=col_user, + col_item=col_item, + col_prediction=col_prediction, + relevancy_method=relevancy_method, + k=k, + threshold=threshold, + ) + + if df_hit.shape[0] == 0: + return 0.0 + + df_merged = df_hit.merge(df_hit_count[[col_user, 'actual']]) + df_merged = df_merged[df_merged['rank'] <= df_merged['actual']] + + return (df_merged.groupby(col_user).size() / df_hit_count.set_index(col_user)['actual']).mean() + + def ndcg_at_k( rating_true, rating_pred, @@ -824,6 +881,7 @@ def get_top_k_items( exp_var.__name__: exp_var, precision_at_k.__name__: precision_at_k, recall_at_k.__name__: recall_at_k, + r_precision_at_k.__name__: r_precision_at_k, ndcg_at_k.__name__: ndcg_at_k, map_at_k.__name__: map_at_k, map.__name__: map, From 3539525e73d177276d0d5f5b5d5ef72a6324dc6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Dav=C3=B3?= Date: Thu, 11 Apr 2024 11:36:07 +0200 Subject: [PATCH 07/30] Added r-precision tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: David Davó --- .../evaluation/test_python_evaluation.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/unit/recommenders/evaluation/test_python_evaluation.py b/tests/unit/recommenders/evaluation/test_python_evaluation.py index 4f0d4730b..e2f6dc149 100644 --- a/tests/unit/recommenders/evaluation/test_python_evaluation.py +++ b/tests/unit/recommenders/evaluation/test_python_evaluation.py @@ -25,6 +25,7 @@ exp_var, get_top_k_items, precision_at_k, + r_precision_at_k, recall_at_k, ndcg_at_k, map_at_k, @@ -366,6 +367,20 @@ def test_python_recall_at_k(rating_true, rating_pred, rating_nohit): assert recall_at_k(rating_true, rating_pred, k=10) == pytest.approx(0.37777, TOL) +def test_python_r_precision(rating_true, rating_pred, rating_nohit): + assert r_precision_at_k( + rating_true=rating_true, + rating_pred=rating_true, + col_prediction=DEFAULT_RATING_COL, + k=10, + ) == pytest.approx(1, TOL) + assert r_precision_at_k(rating_true, rating_nohit, k=5) == 0.0 + assert r_precision_at_k(rating_true, rating_pred, k=3) == pytest.approx(0.21111, TOL) + assert r_precision_at_k(rating_true, rating_pred, k=5) == pytest.approx(0.24444, TOL) + # Equivalent to precision + assert r_precision_at_k(rating_true, rating_pred, k=10) == pytest.approx(0.37777, TOL) + + def test_python_auc(rating_true_binary, rating_pred_binary): assert auc( rating_true=rating_true_binary, From 8b31eb5da06c546d12430c53430f8a085e279d20 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 15 Apr 2024 16:50:55 +0200 Subject: [PATCH 08/30] trying to substitude geta1 with ravel Signed-off-by: miguelgfierro --- recommenders/models/sar/sar_singlenode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recommenders/models/sar/sar_singlenode.py b/recommenders/models/sar/sar_singlenode.py index 7be5bec70..37f7a1830 100644 --- a/recommenders/models/sar/sar_singlenode.py +++ b/recommenders/models/sar/sar_singlenode.py @@ -593,7 +593,7 @@ def predict(self, test): { self.col_user: test[self.col_user].values, self.col_item: test[self.col_item].values, - self.col_prediction: test_scores[user_ids, item_ids].getA1(), + self.col_prediction: test_scores[user_ids, item_ids].ravel(), } ) return df From 2c00cccd4238c79968dfdd08ea2f909e3d7d3add Mon Sep 17 00:00:00 2001 From: Simon Zhao Date: Tue, 23 Apr 2024 10:27:38 +0800 Subject: [PATCH 09/30] Changed metric "result" to "result.toarray()" Signed-off-by: Simon Zhao --- recommenders/utils/python_utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/recommenders/utils/python_utils.py b/recommenders/utils/python_utils.py index 9c831676d..fd3d8aa60 100644 --- a/recommenders/utils/python_utils.py +++ b/recommenders/utils/python_utils.py @@ -62,7 +62,7 @@ def jaccard(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / (diag_rows + diag_cols - cooccurrence) - return result + return result.toarray() def lift(cooccurrence): @@ -85,7 +85,7 @@ def lift(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / (diag_rows * diag_cols) - return result + return result.toarray() def mutual_information(cooccurrence): @@ -106,7 +106,7 @@ def mutual_information(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = np.log2(cooccurrence.shape[0] * lift(cooccurrence)) - return result + return result.toarray() def lexicographers_mutual_information(cooccurrence): @@ -128,7 +128,7 @@ def lexicographers_mutual_information(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence * mutual_information(cooccurrence) - return result + return result.toarray() def cosine_similarity(cooccurrence): @@ -151,7 +151,7 @@ def cosine_similarity(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / np.sqrt(diag_rows * diag_cols) - return result + return result.toarray() def inclusion_index(cooccurrence): @@ -173,7 +173,7 @@ def inclusion_index(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / np.minimum(diag_rows, diag_cols) - return result + return result.toarray() def get_top_k_scored_items(scores, top_k, sort_top_k=False): From 0ec26573432e289a681f46dc01efcf34635682dd Mon Sep 17 00:00:00 2001 From: Simon Zhao Date: Tue, 23 Apr 2024 11:50:00 +0800 Subject: [PATCH 10/30] Revert recommenders/models/sar/sar_singlenode.py Signed-off-by: Simon Zhao --- recommenders/models/sar/sar_singlenode.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recommenders/models/sar/sar_singlenode.py b/recommenders/models/sar/sar_singlenode.py index 37f7a1830..570e0d04a 100644 --- a/recommenders/models/sar/sar_singlenode.py +++ b/recommenders/models/sar/sar_singlenode.py @@ -354,11 +354,11 @@ def score(self, test, remove_seen=False): if self.normalize: counts = self.unity_user_affinity[user_ids, :].dot(self.item_similarity) user_min_scores = ( - np.tile(counts.min(axis=1).toarray(), test_scores.shape[1]) + np.tile(counts.min(axis=1)[:, np.newaxis], test_scores.shape[1]) * self.rating_min ) user_max_scores = ( - np.tile(counts.max(axis=1).toarray(), test_scores.shape[1]) + np.tile(counts.max(axis=1)[:, np.newaxis], test_scores.shape[1]) * self.rating_max ) test_scores = rescale( @@ -593,7 +593,7 @@ def predict(self, test): { self.col_user: test[self.col_user].values, self.col_item: test[self.col_item].values, - self.col_prediction: test_scores[user_ids, item_ids].ravel(), + self.col_prediction: test_scores[user_ids, item_ids], } ) return df From 08d9923a3ecdcf6c8235f7808dc61f88cd1be8fb Mon Sep 17 00:00:00 2001 From: Simon Zhao Date: Tue, 23 Apr 2024 14:18:34 +0800 Subject: [PATCH 11/30] Use cooccurrence.toarray() Signed-off-by: Simon Zhao --- recommenders/utils/python_utils.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/recommenders/utils/python_utils.py b/recommenders/utils/python_utils.py index fd3d8aa60..4d58dd3f0 100644 --- a/recommenders/utils/python_utils.py +++ b/recommenders/utils/python_utils.py @@ -60,9 +60,9 @@ def jaccard(cooccurrence): diag_rows, diag_cols = _get_row_and_column_matrix(cooccurrence.diagonal()) with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence / (diag_rows + diag_cols - cooccurrence) + result = cooccurrence.toarray() / (diag_rows + diag_cols - cooccurrence) - return result.toarray() + return result def lift(cooccurrence): @@ -83,9 +83,9 @@ def lift(cooccurrence): diag_rows, diag_cols = _get_row_and_column_matrix(cooccurrence.diagonal()) with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence / (diag_rows * diag_cols) + result = cooccurrence.toarray() / (diag_rows * diag_cols) - return result.toarray() + return result def mutual_information(cooccurrence): @@ -106,7 +106,7 @@ def mutual_information(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = np.log2(cooccurrence.shape[0] * lift(cooccurrence)) - return result.toarray() + return result def lexicographers_mutual_information(cooccurrence): @@ -126,9 +126,9 @@ def lexicographers_mutual_information(cooccurrence): """ with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence * mutual_information(cooccurrence) + result = cooccurrence.toarray() * mutual_information(cooccurrence) - return result.toarray() + return result def cosine_similarity(cooccurrence): @@ -149,9 +149,9 @@ def cosine_similarity(cooccurrence): diag_rows, diag_cols = _get_row_and_column_matrix(cooccurrence.diagonal()) with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence / np.sqrt(diag_rows * diag_cols) + result = cooccurrence.toarray() / np.sqrt(diag_rows * diag_cols) - return result.toarray() + return result def inclusion_index(cooccurrence): @@ -171,9 +171,9 @@ def inclusion_index(cooccurrence): diag_rows, diag_cols = _get_row_and_column_matrix(cooccurrence.diagonal()) with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence / np.minimum(diag_rows, diag_cols) + result = cooccurrence.toarray() / np.minimum(diag_rows, diag_cols) - return result.toarray() + return result def get_top_k_scored_items(scores, top_k, sort_top_k=False): From 9b0b66ba0c48d3c4f6372d40aaf485fa0af175e0 Mon Sep 17 00:00:00 2001 From: Simon Zhao Date: Tue, 23 Apr 2024 20:26:53 +0800 Subject: [PATCH 12/30] return result if isinstance(result, np.ndarray) else result.toarray() Signed-off-by: Simon Zhao --- recommenders/utils/python_utils.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/recommenders/utils/python_utils.py b/recommenders/utils/python_utils.py index 4d58dd3f0..7409d6449 100644 --- a/recommenders/utils/python_utils.py +++ b/recommenders/utils/python_utils.py @@ -60,9 +60,9 @@ def jaccard(cooccurrence): diag_rows, diag_cols = _get_row_and_column_matrix(cooccurrence.diagonal()) with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence.toarray() / (diag_rows + diag_cols - cooccurrence) + result = cooccurrence / (diag_rows + diag_cols - cooccurrence) - return result + return result if isinstance(result, np.ndarray) else result.toarray() def lift(cooccurrence): @@ -83,9 +83,9 @@ def lift(cooccurrence): diag_rows, diag_cols = _get_row_and_column_matrix(cooccurrence.diagonal()) with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence.toarray() / (diag_rows * diag_cols) + result = cooccurrence / (diag_rows * diag_cols) - return result + return result if isinstance(result, np.ndarray) else result.toarray() def mutual_information(cooccurrence): @@ -106,7 +106,7 @@ def mutual_information(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = np.log2(cooccurrence.shape[0] * lift(cooccurrence)) - return result + return result if isinstance(result, np.ndarray) else result.toarray() def lexicographers_mutual_information(cooccurrence): @@ -126,9 +126,9 @@ def lexicographers_mutual_information(cooccurrence): """ with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence.toarray() * mutual_information(cooccurrence) + result = cooccurrence * mutual_information(cooccurrence) - return result + return result if isinstance(result, np.ndarray) else result.toarray() def cosine_similarity(cooccurrence): @@ -149,9 +149,9 @@ def cosine_similarity(cooccurrence): diag_rows, diag_cols = _get_row_and_column_matrix(cooccurrence.diagonal()) with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence.toarray() / np.sqrt(diag_rows * diag_cols) + result = cooccurrence / np.sqrt(diag_rows * diag_cols) - return result + return result if isinstance(result, np.ndarray) else result.toarray() def inclusion_index(cooccurrence): @@ -171,9 +171,9 @@ def inclusion_index(cooccurrence): diag_rows, diag_cols = _get_row_and_column_matrix(cooccurrence.diagonal()) with np.errstate(invalid="ignore", divide="ignore"): - result = cooccurrence.toarray() / np.minimum(diag_rows, diag_cols) + result = cooccurrence / np.minimum(diag_rows, diag_cols) - return result + return result if isinstance(result, np.ndarray) else result.toarray() def get_top_k_scored_items(scores, top_k, sort_top_k=False): From 7c51605a58b759a74690145829ead72f24bff45b Mon Sep 17 00:00:00 2001 From: Simon Zhao Date: Mon, 29 Apr 2024 22:29:11 +0800 Subject: [PATCH 13/30] Return numpy array instead of numpy matrix Signed-off-by: Simon Zhao --- recommenders/utils/python_utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/recommenders/utils/python_utils.py b/recommenders/utils/python_utils.py index 7409d6449..36fb3f815 100644 --- a/recommenders/utils/python_utils.py +++ b/recommenders/utils/python_utils.py @@ -62,7 +62,7 @@ def jaccard(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / (diag_rows + diag_cols - cooccurrence) - return result if isinstance(result, np.ndarray) else result.toarray() + return np.array(result) if isinstance(result, np.ndarray) else result.toarray() def lift(cooccurrence): @@ -85,7 +85,7 @@ def lift(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / (diag_rows * diag_cols) - return result if isinstance(result, np.ndarray) else result.toarray() + return np.array(result) if isinstance(result, np.ndarray) else result.toarray() def mutual_information(cooccurrence): @@ -106,7 +106,7 @@ def mutual_information(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = np.log2(cooccurrence.shape[0] * lift(cooccurrence)) - return result if isinstance(result, np.ndarray) else result.toarray() + return np.array(result) if isinstance(result, np.ndarray) else result.toarray() def lexicographers_mutual_information(cooccurrence): @@ -128,7 +128,7 @@ def lexicographers_mutual_information(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence * mutual_information(cooccurrence) - return result if isinstance(result, np.ndarray) else result.toarray() + return np.array(result) if isinstance(result, np.ndarray) else result.toarray() def cosine_similarity(cooccurrence): @@ -151,7 +151,7 @@ def cosine_similarity(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / np.sqrt(diag_rows * diag_cols) - return result if isinstance(result, np.ndarray) else result.toarray() + return np.array(result) if isinstance(result, np.ndarray) else result.toarray() def inclusion_index(cooccurrence): @@ -173,7 +173,7 @@ def inclusion_index(cooccurrence): with np.errstate(invalid="ignore", divide="ignore"): result = cooccurrence / np.minimum(diag_rows, diag_cols) - return result if isinstance(result, np.ndarray) else result.toarray() + return np.array(result) if isinstance(result, np.ndarray) else result.toarray() def get_top_k_scored_items(scores, top_k, sort_top_k=False): From c81d56b979cf0c009963eff4712a75afde39e696 Mon Sep 17 00:00:00 2001 From: Miguel Fierro <3491412+miguelgfierro@users.noreply.github.com> Date: Tue, 30 Apr 2024 06:47:49 +0200 Subject: [PATCH 14/30] Prepare for Release Recommenders 1.2.0 (#2092) * New release Recommenders 1.2.0 :boom::boom: * updated news Signed-off-by: miguelgfierro --------- Signed-off-by: miguelgfierro Co-authored-by: miguelgfierro --- NEWS.md | 9 +++++++++ README.md | 8 +++----- recommenders/__init__.py | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/NEWS.md b/NEWS.md index d417976c9..9d8b1aeb6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,12 +5,21 @@ Licensed under the MIT License. # What's New +## Update May 2, 2024 + +We have a new release [Recommenders 1.2.0](https://github.com/microsoft/recommenders/releases/tag/1.2.0)! + +So many changes since our last release. We have full tests on Python 3.8 to 3.11 (around 1800 tests), upgraded performance in many algorithms, reviewed notebooks, and many more improvements. + + ## Update October 10, 2023 We are pleased to announce that this repository (formerly known as Microsoft Recommenders, https://github.com/microsoft/recommenders), has joined the [Linux Foundation of AI and Data](https://lfaidata.foundation/) (LF AI & Data)! The new organization, `recommenders-team`, reflects this change. We hope this move makes it easy for anyone to contribute! Our objective continues to be building an ecosystem and a community to sustain open source innovations and collaborations in recommendation systems. +Now to access the repo, instead of going to https://github.com/microsoft/recommenders, you need to go to https://github.com/recommenders-team/recommenders. The old URL will still resolve to the new one, but we recommend that you update your bookmarks. + ## Update August 18, 2023 We moved to a new organization! Now to access the repo, instead of going to https://github.com/microsoft/recommenders, you need to go to https://github.com/recommenders-team/recommenders. The old URL will still resolve to the new one, but we recommend you to update your bookmarks. diff --git a/README.md b/README.md index 89ef90ecf..dccc06177 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,11 @@ Licensed under the MIT License. -## What's New (October, 2023) +## What's New (May, 2024) -We are pleased to announce that this repository (formerly known as Microsoft Recommenders, https://github.com/microsoft/recommenders), has joined the [Linux Foundation of AI and Data](https://lfaidata.foundation/) (LF AI & Data)! The new organization, `recommenders-team`, reflects this change. +We have a new release [Recommenders 1.2.0](https://github.com/microsoft/recommenders/releases/tag/1.2.0)! -We hope this move makes it easy for anyone to contribute! Our objective continues to be building an ecosystem and a community to sustain open source innovations and collaborations in recommendation systems. - -Now to access the repo, instead of going to https://github.com/microsoft/recommenders, you need to go to https://github.com/recommenders-team/recommenders. The old URL will still resolve to the new one, but we recommend that you update your bookmarks. +So many changes since our last release. We have full tests on Python 3.8 to 3.11 (around 1800 tests), upgraded performance in many algorithms, reviewed notebooks, and many more improvements. ## Introduction diff --git a/recommenders/__init__.py b/recommenders/__init__.py index e28bf197f..87998b029 100644 --- a/recommenders/__init__.py +++ b/recommenders/__init__.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. __title__ = "Recommenders" -__version__ = "1.1.1" +__version__ = "1.2.0" __author__ = "Recommenders contributors" __license__ = "MIT" __copyright__ = "Copyright 2018-present Recommenders contributors." From cb4e35978c2f3e1e30b7a519436ea280d7def388 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 30 Apr 2024 10:33:42 +0100 Subject: [PATCH 15/30] Add reference to scenarios to README.md There is no link to the scenarios page from the front page, so it is hard to find. Added reference. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index dccc06177..35f526d1a 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ Several utilities are provided in [recommenders](recommenders) to support common For a more detailed overview of the repository, please see the documents on the [wiki page](https://github.com/microsoft/recommenders/wiki/Documents-and-Presentations). +For some of the practical scenarios where recommendation systems have been applied, see [scenarios](scenarios). + ## Getting Started We recommend [conda](https://docs.conda.io/projects/conda/en/latest/glossary.html?highlight=environment#conda-environment) for environment management, and [VS Code](https://code.visualstudio.com/) for development. To install the recommenders package and run an example notebook on Linux/WSL: From c219da9932baf1bb0bd0172f66dd50b8721b65f3 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 13 May 2024 16:15:33 +0200 Subject: [PATCH 16/30] Badges Signed-off-by: miguelgfierro --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 35f526d1a..b1bf8e4e8 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,20 @@ Copyright (c) Recommenders contributors. Licensed under the MIT License. --> + + # Recommenders [![Documentation status](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment) - - +[![License](https://img.shields.io/github/license/recommenders-team/recommenders.svg)](https://github.com/recommenders-team/recommenders/blob/main/LICENSE) +[![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) +[![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/lightgbm) +[![Slack](https://img.shields.io/badge/slack-join-green.svg?style=flat)](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) ## What's New (May, 2024) -We have a new release [Recommenders 1.2.0](https://github.com/microsoft/recommenders/releases/tag/1.2.0)! +We have a new release [Recommenders 1.2.0](https://github.com/recommenders-team/recommenders/releases/tag/1.2.0)! So many changes since our last release. We have full tests on Python 3.8 to 3.11 (around 1800 tests), upgraded performance in many algorithms, reviewed notebooks, and many more improvements. From de2b6410c3fd8a4a851f0379f9770be0470401f0 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 13 May 2024 16:18:31 +0200 Subject: [PATCH 17/30] Badges v2 Signed-off-by: miguelgfierro --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b1bf8e4e8..0bebb55c2 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,6 @@ Copyright (c) Recommenders contributors. Licensed under the MIT License. --> - - -# Recommenders - [![Documentation status](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment) [![License](https://img.shields.io/github/license/recommenders-team/recommenders.svg)](https://github.com/recommenders-team/recommenders/blob/main/LICENSE) [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) @@ -14,6 +10,10 @@ Licensed under the MIT License. [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/lightgbm) [![Slack](https://img.shields.io/badge/slack-join-green.svg?style=flat)](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) + + +# Recommenders + ## What's New (May, 2024) We have a new release [Recommenders 1.2.0](https://github.com/recommenders-team/recommenders/releases/tag/1.2.0)! From ed52da32a0f43b59c2c407265bf8deb6d3fcbc08 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 13 May 2024 16:48:42 +0200 Subject: [PATCH 18/30] :bug: Signed-off-by: miguelgfierro --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0bebb55c2..8aca6107f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Licensed under the MIT License. [![License](https://img.shields.io/github/license/recommenders-team/recommenders.svg)](https://github.com/recommenders-team/recommenders/blob/main/LICENSE) [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) -[![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/lightgbm) +[![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) [![Slack](https://img.shields.io/badge/slack-join-green.svg?style=flat)](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) From bf7d393cf7cd42e2030afecb5c206778a0422a13 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Mon, 13 May 2024 17:02:13 +0200 Subject: [PATCH 19/30] join slack Signed-off-by: miguelgfierro --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8aca6107f..164beac77 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,17 @@ Copyright (c) Recommenders contributors. Licensed under the MIT License. --> + + +# Recommenders [![Documentation status](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment) [![License](https://img.shields.io/github/license/recommenders-team/recommenders.svg)](https://github.com/recommenders-team/recommenders/blob/main/LICENSE) [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) -[![Slack](https://img.shields.io/badge/slack-join-green.svg?style=flat)](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) +[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) - - -# Recommenders ## What's New (May, 2024) From 602486a69f73956df286c1f481fb7784d3a34eb1 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Tue, 14 May 2024 12:47:03 +0200 Subject: [PATCH 20/30] move slack badge down Signed-off-by: miguelgfierro --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 164beac77..ad83d8954 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ Licensed under the MIT License. [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) -[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) + +[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) ## What's New (May, 2024) From f2ce1f8b2fef6a24773f5ad1c75ae3804a324842 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Tue, 14 May 2024 12:48:24 +0200 Subject: [PATCH 21/30] move slack badge up Signed-off-by: miguelgfierro --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index ad83d8954..6f706b800 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Licensed under the MIT License. # Recommenders +[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) [![Documentation status](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment) [![License](https://img.shields.io/github/license/recommenders-team/recommenders.svg)](https://github.com/recommenders-team/recommenders/blob/main/LICENSE) @@ -12,8 +13,6 @@ Licensed under the MIT License. [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) -[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) - ## What's New (May, 2024) From 98f9c4d30527bc4ee304baec213184cfd49265ee Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Tue, 14 May 2024 12:49:19 +0200 Subject: [PATCH 22/30] move slack badge up up Signed-off-by: miguelgfierro --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f706b800..1f64055a1 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,10 @@ Licensed under the MIT License. --> -# Recommenders [](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) +# Recommenders + [![Documentation status](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment) [![License](https://img.shields.io/github/license/recommenders-team/recommenders.svg)](https://github.com/recommenders-team/recommenders/blob/main/LICENSE) [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) From 05bf12a4a91fe67bb1f2046dc05adfca2ec8c1fa Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Tue, 14 May 2024 12:51:59 +0200 Subject: [PATCH 23/30] move slack badge down with line Signed-off-by: miguelgfierro --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f64055a1..40726ea96 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ Licensed under the MIT License. --> -[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) # Recommenders @@ -14,6 +13,8 @@ Licensed under the MIT License. [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) +[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) +
## What's New (May, 2024) From 93e97a14a3e65723ff7bae3712708aa87897315e Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Tue, 14 May 2024 12:52:25 +0200 Subject: [PATCH 24/30] move slack badge down with line Signed-off-by: miguelgfierro --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 40726ea96..9ca5d369a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Licensed under the MIT License. [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) -[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) +[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F)
## What's New (May, 2024) From 15d633b08c8f26b056ef44aeb3dd4030093e30b1 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Tue, 14 May 2024 12:58:16 +0200 Subject: [PATCH 25/30] Trying without Recommenders Signed-off-by: miguelgfierro --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 9ca5d369a..81e77733c 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,6 @@ Licensed under the MIT License. -# Recommenders - [![Documentation status](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/recommenders-team/recommenders/actions/workflows/pages/pages-build-deployment) [![License](https://img.shields.io/github/license/recommenders-team/recommenders.svg)](https://github.com/recommenders-team/recommenders/blob/main/LICENSE) [![Black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) From dc00ae4986273fd2e2f9905f863a908f342ed07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Dav=C3=B3?= Date: Fri, 17 May 2024 09:20:00 +0200 Subject: [PATCH 26/30] =?UTF-8?q?Add=20David=20Dav=C3=B3=20as=20contributo?= =?UTF-8?q?r=20#2099?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: David Davó --- AUTHORS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 54664fe0c..d3bc2c3d6 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -72,6 +72,8 @@ To contributors: please add your name to the list when you submit a patch to the * **[Dan Ciborowski](https://github.com/dciborow)** * ALS operationalization notebook * SAR PySpark improvement +* **[David Davó](https://github.com/daviddavo)** + * Added R-Precision metric * **[Daniel Schneider](https://github.com/danielsc)** * FastAI notebook * **[Evgenia Chroni](https://github.com/EvgeniaChroni)** From df667a50d2254d1520ea5946b70c320032fb9399 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Fri, 17 May 2024 11:17:18 +0200 Subject: [PATCH 27/30] Slack CTA Signed-off-by: miguelgfierro --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 81e77733c..c1aee3416 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Licensed under the MIT License. [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) -[](https://lfaifoundation.slack.com/archives/C06D2GQ9K8F) +[](https://join.slack.com/t/lfaifoundation/shared_invite/zt-2iyl7zyya-g5rOO5K518CBoevyi28W6w)
## What's New (May, 2024) From 9659dcd54a4ab895ede26e9d75c3d02c6e7ff153 Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Fri, 17 May 2024 11:18:21 +0200 Subject: [PATCH 28/30] width Signed-off-by: miguelgfierro --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1aee3416..df5c67190 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Licensed under the MIT License. [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) -[](https://join.slack.com/t/lfaifoundation/shared_invite/zt-2iyl7zyya-g5rOO5K518CBoevyi28W6w) +[](https://join.slack.com/t/lfaifoundation/shared_invite/zt-2iyl7zyya-g5rOO5K518CBoevyi28W6w)
## What's New (May, 2024) From 0f7ad9eb33d82d0b65582d10b326cff846cdd6ce Mon Sep 17 00:00:00 2001 From: miguelgfierro Date: Fri, 17 May 2024 11:18:57 +0200 Subject: [PATCH 29/30] width 300 Signed-off-by: miguelgfierro --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index df5c67190..8b0a3015d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ Licensed under the MIT License. [![PyPI Version](https://img.shields.io/pypi/v/recommenders.svg?logo=pypi&logoColor=white)](https://pypi.org/project/recommenders) [![Python Versions](https://img.shields.io/pypi/pyversions/recommenders.svg?logo=python&logoColor=white)](https://pypi.org/project/recommenders) -[](https://join.slack.com/t/lfaifoundation/shared_invite/zt-2iyl7zyya-g5rOO5K518CBoevyi28W6w) +[](https://join.slack.com/t/lfaifoundation/shared_invite/zt-2iyl7zyya-g5rOO5K518CBoevyi28W6w) +
## What's New (May, 2024) From 7da391b8f054cb249a2cb6c95dbc83587b17e8ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Dav=C3=B3?= Date: Fri, 17 May 2024 17:30:43 +0200 Subject: [PATCH 30/30] Fixed contributors order MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: David Davó --- AUTHORS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index d3bc2c3d6..1816f73e2 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -72,10 +72,10 @@ To contributors: please add your name to the list when you submit a patch to the * **[Dan Ciborowski](https://github.com/dciborow)** * ALS operationalization notebook * SAR PySpark improvement -* **[David Davó](https://github.com/daviddavo)** - * Added R-Precision metric * **[Daniel Schneider](https://github.com/danielsc)** * FastAI notebook +* **[David Davó](https://github.com/daviddavo)** + * Added R-Precision metric * **[Evgenia Chroni](https://github.com/EvgeniaChroni)** * Multinomial VAE algorithm * Standard VAE algorithm