Agent Conversation: anthropic/claude-opus-4.6
Task: ml-dimensionality-reduction
Dimensionality Reduction: Nonlinear Embedding Method Design
Research Question
Design a novel nonlinear dimensionality reduction method that preserves data structure (both local neighborhoods and global relationships) better than existing methods when embedding high-dimensional data into 2D.
Background
Dimensionality reduction is fundamental to data analysis and visualization. PCA provides a fast linear baseline but cannot capture nonlinear manifold structure. Other methods trade off local and global structure preservation in different ways. This task evaluates dimensionality reduction methods by neighborhood preservation across diverse data types.
Task
Modify the CustomDimReduction class (lines 14-70) in custom_dimred.py to implement a novel nonlinear dimensionality reduction algorithm. Your implementation must:
- Accept high-dimensional data X of shape (n_samples, n_features) where n_samples <= 5000 and n_features ranges from 50 to 784.
- Return a 2D embedding of shape (n_samples, 2).
- Respect the
random_stateparameter for reproducibility. - Complete within a reasonable time (under 5 minutes per dataset on CPU).
You may use numpy, scipy, and scikit-learn utilities (already installed). The method is evaluated on three diverse datasets: MNIST (digit images), Fashion-MNIST (clothing images), and 20 Newsgroups (text, pre-processed to 50D via TF-IDF + SVD).
Interface
class CustomDimReduction:
def __init__(self, n_components: int = 2, random_state: int | None = None):
...
def fit_transform(self, X: NDArray[np.float64]) -> NDArray[np.float64]:
# X: (n_samples, n_features), returns: (n_samples, n_components)
...
Evaluation
Three metrics are computed on each dataset (k=7 neighbors):
- kNN accuracy: Classification accuracy of a 7-NN classifier in the 2D space (higher is better). Measures how well class structure is preserved.
- Trustworthiness: Whether points that are neighbors in the embedding are also neighbors in the original space (higher is better, max 1.0).
- Continuity: Whether points that are neighbors in the original space remain neighbors in the embedding (higher is better, max 1.0).
Success means improving on existing methods across all three datasets and all three metrics.
scikit-learn/bench/custom_dimred.py [EDITABLE — lines 15–59 only]
1: """Custom dimensionality reduction benchmark -- agent-editable template.
2:
3: The agent modifies `CustomDimReduction` to implement a novel nonlinear
4: dimensionality reduction method. The evaluation harness embeds three
5: datasets into 2D, then measures kNN accuracy, trustworthiness, and
6: continuity in the reduced space.
7: """
8:
9: import numpy as np
10: from numpy.typing import NDArray
11:
12: # =====================================================================
13: # EDITABLE: implement Tool Input
1{
2 "op": "replace",
3 "filename": "scikit-learn/bench/custom_dimred.py",
4 "start_line": 15,
5 "end_line": 59,
6 "content": "class CustomDimReduction:\n \"\"\"Neighborhood Rank-Aligned Embedding (NRAE).\n\n Two-phase nonlinear dimensionality reduction:\n Phase 1 - t-SNE for global structure initialization.\n Phase 2 - Novel Neighborhood Rank Alignment (NRA) refinement that\n directly optimizes k-nearest-neighbor set consistency between the\n original and embedded spaces using an asymmetric force model:\n * Affinity-weighted attraction for missing neighbors (high-D kNN\n not present in low-D kNN) to improve continuity.\n * Cauchy-kernel repulsion for false neighbors (low-D kNN not\n present in high-D kNN) to improve trustworthiness.\n * L2 tethering to initial embedding to preserve global structure.\n \"\"\"\n\n def __init__(self, n_components: int = 2, random_state: int | None = None):\n self.n_components = n_components\n self.random_state = random_state\n\n def fit_transform(self, X: NDArray[np.float64]) -> NDArray[np.float64]:\n from sklearn.manifold import TSNE\n from sklearn.neighbors import NearestNeighbors\n\n n = X.shape[0]\n k = 7 # neighborhood size matching evaluation\n\n # === Phase 1: t-SNE initialization ===\n tsne = TSNE(\n n_components=self.n_components, perplexity=30.0,\n learning_rate='auto', init='pca',\n random_state=self.random_state, n_iter=1000,\n )\n Y = tsne.fit_transform(X).astype(np.float64).copy()\n Y_init = Y.copy()\n\n # === Build high-D kNN structure (fixed) ===\n nn_model = NearestNeighbors(n_neighbors=k + 1)\n nn_model.fit(X)\n dists_h, idxs_h = nn_model.kneighbors(X)\n knn_h = idxs_h[:, 1:] # (n, k)\n dist_h = dists_h[:, 1:] # (n, k)\n\n # Gaussian affinity weights for attraction scaling\n sigma = np.median(dist_h) + 1e-10\n aff_vals = np.exp(-dist_h ** 2 / (2 * sigma ** 2))\n\n # Dense neighbor indicator and affinity matrix\n is_knn_h = np.zeros((n, n), dtype=bool)\n aff_mat = np.zeros((n, n), dtype=np.float64)\n ri = np.repeat(np.arange(n), k)\n ci = knn_h.ravel()\n is_knn_h[ri, ci] = True\n aff_mat[ri, ci] = aff_vals.ravel()\n\n # === Phase 2: NRA refinement ===\n # Initial step size from embedding scale\n Ysq = np.sum(Y ** 2, axis=1)\n D2 = np.maximum(Ysq[:, None] + Ysq[None, :] - 2 * Y @ Y.T, 0)\n np.fill_diagonal(D2, np.inf)\n nn_med = np.median(np.sqrt(np.min(D2, axis=1)))\n\n step = 0.05 * nn_med\n reg = 0.001\n best_Y, best_ov, stale = Y.copy(), 0.0, 0\n\n for t in range(250):\n Ysq = np.sum(Y ** 2, axis=1)\n D2 = np.maximum(Ysq[:, None] + Ysq[None, :] - 2 * Y @ Y.T, 0)\n np.fill_diagonal(D2, np.inf)\n kl = np.argpartition(D2, k, axis=1)[:, :k]\n np.fill_diagonal(D2, 0)\n\n is_knn_l = np.zeros((n, n), dtype=bool)\n is_knn_l[np.repeat(np.arange(n), k), kl.ravel()] = True\n\n ov = np.sum(is_knn_l & is_knn_h) / max(np.sum(is_knn_h), 1)\n if ov > best_ov:\n best_ov, best_Y, stale = ov, Y.copy(), 0\n else:\n stale += 1\n if stale >= 30 or ov > 0.999:\n break\n\n missing = is_knn_h & ~is_knn_l # attract (continuity)\n false = is_knn_l & ~is_knn_h # repel (trustworthiness)\n kernel = 1.0 / (1.0 + D2)\n\n C = missing.astype(np.float64) * aff_mat \\\n - false.astype(np.float64) * kernel\n grad = 2.0 * (np.sum(C, axis=1, keepdims=True) * Y - C @ Y) \\\n + 2.0 * reg * (Y - Y_init)\n\n gn = np.linalg.norm(grad, axis=1, keepdims=True) + 1e-12\n grad *= np.minimum(1.0, step / gn)\n Y -= grad\n Y -= Y.mean(axis=0)\n step *= 0.997\n\n return best_Y\n"
7}OK: Replaced lines 15..59 with 99 line(s) in scikit-learn/bench/custom_dimred.py. Editable range: 15–113.
[Current file: scikit-learn/bench/custom_dimred.py | editable: 15–113 | total: 347 lines]
15 class CustomDimReduction:
16 """Neighborhood Rank-Aligned Embedding (NRAE).
17
... (93 more lines) ...
111 step *= 0.997
112
113 return best_Y[Test #1] (2 tests remaining; call submit(n=N) to choose which test result to submit as final)
### mnist (scripts/mnist.sh)
Reduction timing (mnist):
TRAIN_METRICS dataset=mnist elapsed=44.06s
Results (mnist):
kNN accuracy=0.867667
Trustworthiness=0.962627
Continuity=0.965815
Time=44.06s
### fashion_mnist (scripts/fashion_mnist.sh)
Reduction timing (fashion_mnist):
TRAIN_METRICS dataset=fashion_mnist elapsed=42.45s
Results (fashion_mnist):
kNN accuracy=0.780333
Trustworthiness=0.980293
Continuity=0.983950
Time=42.45s
[Leaderboard] Results saved: {'knn_acc_mnist': 0.867667, 'trustworthiness_mnist': 0.962627, 'continuity_mnist': 0.965815, 'elapsed_mnist': 71, 'knn_acc_fashion_mnist': 0.780333, 'trustworthiness_fashion_mnist': 0.980293, 'continuity_fashion_mnist': 0.98395, 'elapsed_fashion_mnist': 71, 'knn_acc_newsgroups': 0.697716, 'trustworthiness_newsgroups': 0.936591, 'continuity_newsgroups': 0.921205, 'elapsed_newsgroups': 71}Tool Input
1{
2 "op": "replace",
3 "filename": "scikit-learn/bench/custom_dimred.py",
4 "start_line": 15,
5 "end_line": 113,
6 "content": "class CustomDimReduction:\n \"\"\"Multi-Scale Neighborhood Rank-Aligned Embedding (MS-NRAE).\n\n Two-phase nonlinear dimensionality reduction:\n Phase 1 - t-SNE for global structure initialization.\n Phase 2 - Multi-Scale Neighborhood Rank Alignment (MS-NRA) that\n directly optimizes k-NN consistency at multiple neighborhood scales:\n * Local (k=7): Affinity-weighted attraction for missing neighbors\n and Cauchy-kernel repulsion for false neighbors, directly\n targeting trustworthiness and continuity.\n * Global (k=15): Gentle bounded attraction for wider high-D\n neighbors to preserve cluster integrity and class separability.\n * L2 tethering to initial embedding for stability.\n \"\"\"\n\n def __init__(self, n_components: int = 2, random_state: int | None = None):\n self.n_components = n_components\n self.random_state = random_state\n\n def fit_transform(self, X: NDArray[np.float64]) -> NDArray[np.float64]:\n from sklearn.manifold import TSNE\n from sklearn.neighbors import NearestNeighbors\n\n n = X.shape[0]\n k_eval = 7 # evaluation neighborhood size\n k_wide = 15 # wider neighborhood for global structure\n w_wide = 0.2 # weight for wider-scale forces\n\n # === Phase 1: t-SNE initialization ===\n Y = TSNE(\n n_components=self.n_components, perplexity=30.0,\n learning_rate='auto', init='pca',\n random_state=self.random_state, n_iter=1000,\n ).fit_transform(X).astype(np.float64).copy()\n Y_init = Y.copy()\n\n # === Build multi-scale high-D kNN (fixed) ===\n nn_model = NearestNeighbors(n_neighbors=k_wide + 1)\n nn_model.fit(X)\n dists_h, idxs_h = nn_model.kneighbors(X)\n knn_h = idxs_h[:, 1:] # (n, k_wide)\n dist_h = dists_h[:, 1:]\n\n sigma = np.median(dist_h[:, :k_eval]) + 1e-10\n aff_all = np.exp(-dist_h ** 2 / (2 * sigma ** 2))\n\n # k=7 neighbor structures\n is_h7 = np.zeros((n, n), dtype=bool)\n aff7 = np.zeros((n, n), dtype=np.float64)\n ri7 = np.repeat(np.arange(n), k_eval)\n ci7 = knn_h[:, :k_eval].ravel()\n is_h7[ri7, ci7] = True\n aff7[ri7, ci7] = aff_all[:, :k_eval].ravel()\n\n # k=15 neighbor structures\n is_h15 = np.zeros((n, n), dtype=bool)\n aff15 = np.zeros((n, n), dtype=np.float64)\n ri15 = np.repeat(np.arange(n), k_wide)\n ci15 = knn_h[:, :k_wide].ravel()\n is_h15[ri15, ci15] = True\n aff15[ri15, ci15] = aff_all[:, :k_wide].ravel()\n\n # === Phase 2: Multi-Scale NRA refinement ===\n Ysq = np.sum(Y ** 2, axis=1)\n D2 = np.maximum(Ysq[:, None] + Ysq[None, :] - 2 * Y @ Y.T, 0)\n np.fill_diagonal(D2, np.inf)\n nn_med = np.median(np.sqrt(np.min(D2, axis=1)))\n\n step = 0.05 * nn_med\n reg = 0.001\n best_Y, best_ov, stale = Y.copy(), 0.0, 0\n\n for t in range(300):\n Ysq = np.sum(Y ** 2, axis=1)\n D2 = np.maximum(Ysq[:, None] + Ysq[None, :] - 2 * Y @ Y.T, 0)\n\n # kNN at both scales (inf diagonal excludes self)\n np.fill_diagonal(D2, np.inf)\n kl7 = np.argpartition(D2, k_eval, axis=1)[:, :k_eval]\n kl15 = np.argpartition(D2, k_wide, axis=1)[:, :k_wide]\n np.fill_diagonal(D2, 0)\n\n kernel = 1.0 / (1.0 + D2)\n\n # Low-D neighbor indicators\n is_l7 = np.zeros((n, n), dtype=bool)\n is_l7[np.repeat(np.arange(n), k_eval), kl7.ravel()] = True\n is_l15 = np.zeros((n, n), dtype=bool)\n is_l15[np.repeat(np.arange(n), k_wide), kl15.ravel()] = True\n\n # Track quality at evaluation k\n ov = np.sum(is_l7 & is_h7) / max(np.sum(is_h7), 1)\n if ov > best_ov:\n best_ov, best_Y, stale = ov, Y.copy(), 0\n else:\n stale += 1\n if stale >= 40 or ov > 0.999:\n break\n\n # --- Local correction (k=7) ---\n missing7 = is_h7 & ~is_l7 # attract (continuity)\n false7 = is_l7 & ~is_h7 # repel (trustworthiness)\n C = (missing7.astype(np.float64) * aff7\n - false7.astype(np.float64) * kernel)\n\n # --- Global structure (k=15, attraction only) ---\n missing15 = is_h15 & ~is_l15\n C += w_wide * missing15.astype(np.float64) * aff15 * kernel\n\n # Gradient with L2 regularization\n grad = 2.0 * (np.sum(C, axis=1, keepdims=True) * Y - C @ Y)\n grad += 2.0 * reg * (Y - Y_init)\n\n # Per-point step clipping\n gn = np.linalg.norm(grad, axis=1, keepdims=True) + 1e-12\n grad *= np.minimum(1.0, step / gn)\n Y -= grad\n Y -= Y.mean(axis=0)\n step *= 0.997\n\n return best_Y\n"
7}OK: Replaced lines 15..113 with 121 line(s) in scikit-learn/bench/custom_dimred.py. Editable range: 15–135.
[Current file: scikit-learn/bench/custom_dimred.py | editable: 15–135 | total: 369 lines]
15 class CustomDimReduction:
16 """Multi-Scale Neighborhood Rank-Aligned Embedding (MS-NRAE).
17
... (115 more lines) ...
133 step *= 0.997
134
135 return best_Y[Test #2] (1 test remaining; call submit(n=N) to choose which test result to submit as final)
### mnist (scripts/mnist.sh)
Reduction timing (mnist):
TRAIN_METRICS dataset=mnist elapsed=80.97s
Results (mnist):
kNN accuracy=0.867667
Trustworthiness=0.962627
Continuity=0.965815
Time=80.97s
### fashion_mnist (scripts/fashion_mnist.sh)
Reduction timing (fashion_mnist):
TRAIN_METRICS dataset=fashion_mnist elapsed=80.02s
Results (fashion_mnist):
kNN accuracy=0.780333
Trustworthiness=0.980293
Continuity=0.983950
Time=80.02s
[Leaderboard] Results saved: {'knn_acc_mnist': 0.867667, 'trustworthiness_mnist': 0.962627, 'continuity_mnist': 0.965815, 'elapsed_mnist': 108, 'knn_acc_fashion_mnist': 0.780333, 'trustworthiness_fashion_mnist': 0.980293, 'continuity_fashion_mnist': 0.98395, 'elapsed_fashion_mnist': 108, 'knn_acc_newsgroups': 0.698073, 'trustworthiness_newsgroups': 0.936602, 'continuity_newsgroups': 0.921328, 'elapsed_newsgroups': 108}Tool Input
1{
2 "op": "replace",
3 "filename": "scikit-learn/bench/custom_dimred.py",
4 "start_line": 15,
5 "end_line": 135,
6 "content": "class CustomDimReduction:\n \"\"\"Spectral-Adaptive t-SNE with Multi-Scale Neighborhood Rank Alignment.\n\n Novel three-phase nonlinear dimensionality reduction:\n Phase 1 - Multi-initialization: Generate t-SNE embeddings from both\n PCA and spectral Laplacian eigenvector initializations. The spectral\n initialization captures manifold topology that PCA (linear) misses.\n Phase 2 - Quality-based selection: Pick the embedding with highest\n k-NN neighborhood overlap with the original high-D space.\n Phase 3 - Multi-Scale NRA refinement: Directly optimize k-NN set\n consistency at local (k=7) and global (k=15) neighborhood scales\n using asymmetric affinity-weighted attraction and Cauchy repulsion.\n \"\"\"\n\n def __init__(self, n_components: int = 2, random_state: int | None = None):\n self.n_components = n_components\n self.random_state = random_state\n\n def fit_transform(self, X: NDArray[np.float64]) -> NDArray[np.float64]:\n from sklearn.manifold import TSNE, SpectralEmbedding\n from sklearn.neighbors import NearestNeighbors\n\n n = X.shape[0]\n k_eval, k_wide = 7, 15\n\n # === Build multi-scale high-D kNN (used for selection + NRA) ===\n nn_model = NearestNeighbors(n_neighbors=k_wide + 1)\n nn_model.fit(X)\n dists_h, idxs_h = nn_model.kneighbors(X)\n knn_h, dist_h = idxs_h[:, 1:], dists_h[:, 1:]\n\n sigma = np.median(dist_h[:, :k_eval]) + 1e-10\n aff_all = np.exp(-dist_h ** 2 / (2 * sigma ** 2))\n\n is_h7 = np.zeros((n, n), dtype=bool)\n aff7 = np.zeros((n, n), dtype=np.float64)\n ri7, ci7 = np.repeat(np.arange(n), k_eval), knn_h[:, :k_eval].ravel()\n is_h7[ri7, ci7] = True\n aff7[ri7, ci7] = aff_all[:, :k_eval].ravel()\n\n is_h15 = np.zeros((n, n), dtype=bool)\n aff15 = np.zeros((n, n), dtype=np.float64)\n ri15, ci15 = np.repeat(np.arange(n), k_wide), knn_h.ravel()\n is_h15[ri15, ci15] = True\n aff15[ri15, ci15] = aff_all.ravel()\n\n def nn_overlap(Y):\n \"\"\"Compute k=7 neighborhood overlap quality metric.\"\"\"\n Ysq = np.sum(Y ** 2, axis=1)\n D2 = np.maximum(Ysq[:, None] + Ysq[None, :] - 2 * Y @ Y.T, 0)\n np.fill_diagonal(D2, np.inf)\n kl = np.argpartition(D2, k_eval, axis=1)[:, :k_eval]\n il = np.zeros((n, n), dtype=bool)\n il[np.repeat(np.arange(n), k_eval), kl.ravel()] = True\n return np.sum(il & is_h7) / max(np.sum(is_h7), 1)\n\n # === Phase 1-2: Multi-Init t-SNE + Selection ===\n Y_best = TSNE(\n n_components=self.n_components, perplexity=30.0,\n learning_rate='auto', init='pca',\n random_state=self.random_state, n_iter=1000,\n ).fit_transform(X).astype(np.float64)\n q_best = nn_overlap(Y_best)\n\n # Spectral init: Laplacian eigenvectors capture manifold topology\n try:\n se = SpectralEmbedding(\n n_components=self.n_components, n_neighbors=15,\n random_state=self.random_state)\n Yse = se.fit_transform(X).astype(np.float64)\n if np.all(np.isfinite(Yse)):\n Yse /= (np.std(Yse[:, 0]) * 10000 + 1e-10)\n Y2 = TSNE(\n n_components=self.n_components, perplexity=30.0,\n learning_rate='auto', init=Yse.astype(np.float32),\n random_state=self.random_state, n_iter=1000,\n ).fit_transform(X).astype(np.float64)\n q2 = nn_overlap(Y2)\n if q2 > q_best:\n Y_best, q_best = Y2, q2\n except Exception:\n pass\n\n # === Phase 3: Multi-Scale NRA Refinement ===\n Y = Y_best.copy()\n Y_init = Y.copy()\n\n Ysq = np.sum(Y ** 2, axis=1)\n D2 = np.maximum(Ysq[:, None] + Ysq[None, :] - 2 * Y @ Y.T, 0)\n np.fill_diagonal(D2, np.inf)\n nn_med = np.median(np.sqrt(np.min(D2, axis=1)))\n\n step, reg = 0.1 * nn_med, 0.001\n best_Y, best_ov, stale = Y.copy(), q_best, 0\n\n for t in range(200):\n Ysq = np.sum(Y ** 2, axis=1)\n D2 = np.maximum(Ysq[:, None] + Ysq[None, :] - 2 * Y @ Y.T, 0)\n np.fill_diagonal(D2, np.inf)\n kl7 = np.argpartition(D2, k_eval, axis=1)[:, :k_eval]\n kl15 = np.argpartition(D2, k_wide, axis=1)[:, :k_wide]\n np.fill_diagonal(D2, 0)\n kernel = 1.0 / (1.0 + D2)\n\n il7 = np.zeros((n, n), dtype=bool)\n il7[np.repeat(np.arange(n), k_eval), kl7.ravel()] = True\n il15 = np.zeros((n, n), dtype=bool)\n il15[np.repeat(np.arange(n), k_wide), kl15.ravel()] = True\n\n ov = np.sum(il7 & is_h7) / max(np.sum(is_h7), 1)\n if ov > best_ov:\n best_ov, best_Y, stale = ov, Y.copy(), 0\n else:\n stale += 1\n if stale >= 40 or ov > 0.999:\n break\n\n # Local correction (k=7): attract missing, repel false\n C = ((is_h7 & ~il7).astype(np.float64) * aff7\n - (il7 & ~is_h7).astype(np.float64) * kernel)\n # Global structure (k=15): gentle bounded attraction\n C += 0.2 * (is_h15 & ~il15).astype(np.float64) * aff15 * kernel\n\n grad = 2.0 * (np.sum(C, axis=1, keepdims=True) * Y - C @ Y)\n grad += 2.0 * reg * (Y - Y_init)\n gn = np.linalg.norm(grad, axis=1, keepdims=True) + 1e-12\n grad *= np.minimum(1.0, step / gn)\n Y -= grad\n Y -= Y.mean(axis=0)\n step *= 0.997\n\n return best_Y\n"
7}OK: Replaced lines 15..135 with 132 line(s) in scikit-learn/bench/custom_dimred.py. Editable range: 15–146.
[Current file: scikit-learn/bench/custom_dimred.py | editable: 15–146 | total: 380 lines]
15 class CustomDimReduction:
16 """Spectral-Adaptive t-SNE with Multi-Scale Neighborhood Rank Alignment.
17
... (126 more lines) ...
144 step *= 0.997
145
146 return best_Y[Test #3] (0 tests remaining; call submit(n=N) to choose which test result to submit as final)
[NOTE] This was your last test. You MUST now call submit(n=X) to choose which test result to submit as your final answer.
### mnist (scripts/mnist.sh)
Reduction timing (mnist):
TRAIN_METRICS dataset=mnist elapsed=96.54s
Results (mnist):
kNN accuracy=0.867667
Trustworthiness=0.962627
Continuity=0.965815
Time=96.54s
### fashion_mnist (scripts/fashion_mnist.sh)
Reduction timing (fashion_mnist):
TRAIN_METRICS dataset=fashion_mnist elapsed=87.79s
Results (fashion_mnist):
kNN accuracy=0.780333
Trustworthiness=0.980293
Continuity=0.983950
Time=87.79s
### newsgroups (scripts/newsgroups.sh)
Reduction timing (newsgroups):
TRAIN_METRICS dataset=newsgroups elapsed=90.51s
Results (newsgroups):
kNN accuracy=0.698073
Trustworthiness=0.937397
Continuity=0.921617
Time=90.51s
[Leaderboard] Results saved: {'knn_acc_mnist': 0.867667, 'trustworthiness_mnist': 0.962627, 'continuity_mni
Tool Input
1{
2 "n": 3
3}[submit] Submitting result from test #3 as final.
### mnist (scripts/mnist.sh)
Reduction timing (mnist):
TRAIN_METRICS dataset=mnist elapsed=96.54s
Results (mnist):
kNN accuracy=0.867667
Trustworthiness=0.962627
Continuity=0.965815
Time=96.54s
### fashion_mnist (scripts/fashion_mnist.sh)
Reduction timing (fashion_mnist):
TRAIN_METRICS dataset=fashion_mnist elapsed=87.79s
Results (fashion_mnist):
kNN accuracy=0.780333
Trustworthiness=0.980293
Continuity=0.983950
Time=87.79s
### newsgroups (scripts/newsgroups.sh)
Reduction timing (newsgroups):
TRAIN_METRICS dataset=newsgroups elapsed=90.51s
Results (newsgroups):
kNN accuracy=0.698073
Trustworthiness=0.937397
Continuity=0.921617
Time=90.51s
[submit] Finalized test #3 as final.
[Leaderboard] Results saved: {'knn_acc_mnist': 0.867667, 'trustworthiness_mnist': 0.962627, 'continuity_mnist': 0.965815, 'elapsed_mnist': 124, 'knn_acc_fashion_mnist': 0.780333, 'trustworthiness_fashion_mnist': 0.980293, 'continuity_fas