From 344f58da8de77f1d7ec52beaf681e50118cd95b6 Mon Sep 17 00:00:00 2001 From: relf Date: Mon, 22 Dec 2025 17:21:25 +0100 Subject: [PATCH 1/4] Bump version to 0.8.1 --- Cargo.toml | 2 +- algorithms/linfa-bayes/Cargo.toml | 2 +- algorithms/linfa-clustering/Cargo.toml | 4 ++-- algorithms/linfa-elasticnet/Cargo.toml | 2 +- algorithms/linfa-ensemble/Cargo.toml | 2 +- algorithms/linfa-ftrl/Cargo.toml | 4 ++-- algorithms/linfa-hierarchical/Cargo.toml | 2 +- algorithms/linfa-ica/Cargo.toml | 4 ++-- algorithms/linfa-kernel/Cargo.toml | 2 +- algorithms/linfa-lars/Cargo.toml | 4 ++-- algorithms/linfa-linear/Cargo.toml | 4 ++-- algorithms/linfa-logistic/Cargo.toml | 2 +- algorithms/linfa-nn/Cargo.toml | 4 ++-- algorithms/linfa-pls/Cargo.toml | 4 ++-- algorithms/linfa-preprocessing/Cargo.toml | 4 ++-- algorithms/linfa-reduction/Cargo.toml | 2 +- algorithms/linfa-svm/Cargo.toml | 2 +- algorithms/linfa-trees/Cargo.toml | 4 ++-- algorithms/linfa-tsne/Cargo.toml | 2 +- datasets/Cargo.toml | 2 +- 20 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 097a202dc..38e6654c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "linfa" -version = "0.8.0" +version = "0.8.1" authors = [ "Luca Palmieri ", "Lorenz Schmidt ", diff --git a/algorithms/linfa-bayes/Cargo.toml b/algorithms/linfa-bayes/Cargo.toml index 297c60610..a83a89bbb 100644 --- a/algorithms/linfa-bayes/Cargo.toml +++ b/algorithms/linfa-bayes/Cargo.toml @@ -25,7 +25,7 @@ ndarray = { version = "0.16", features = ["approx"] } ndarray-stats = "0.6" thiserror = "2.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] approx = "0.5" diff --git a/algorithms/linfa-clustering/Cargo.toml b/algorithms/linfa-clustering/Cargo.toml index 56e442398..c8728c89a 100644 --- a/algorithms/linfa-clustering/Cargo.toml +++ b/algorithms/linfa-clustering/Cargo.toml @@ -44,7 +44,7 @@ num-traits = "0.2" rand_xoshiro = "0.6" space = "0.19" thiserror = "2.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } linfa-nn = { version = "0.8.0", path = "../linfa-nn" } noisy_float = "0.2.0" @@ -57,7 +57,7 @@ criterion = "0.5" serde_json = "1" approx = "0.5" lax = "=0.17.0" -linfa = { version = "0.8.0", path = "../..", features = ["benchmarks"] } +linfa = { version = "0.8.1", path = "../..", features = ["benchmarks"] } [[bench]] name = "k_means" diff --git a/algorithms/linfa-elasticnet/Cargo.toml b/algorithms/linfa-elasticnet/Cargo.toml index 79577cf50..2e480e51c 100644 --- a/algorithms/linfa-elasticnet/Cargo.toml +++ b/algorithms/linfa-elasticnet/Cargo.toml @@ -37,7 +37,7 @@ num-traits = "0.2" approx = "0.5" thiserror = "2.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] linfa-datasets = { version = "0.8.0", path = "../../datasets", features = [ diff --git a/algorithms/linfa-ensemble/Cargo.toml b/algorithms/linfa-ensemble/Cargo.toml index 72122a113..580b34fb6 100644 --- a/algorithms/linfa-ensemble/Cargo.toml +++ b/algorithms/linfa-ensemble/Cargo.toml @@ -31,7 +31,7 @@ ndarray = { version = "0.16", features = ["rayon", "approx"] } ndarray-rand = "0.15" rand = "0.8.5" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } linfa-trees = { version = "0.8.0", path = "../linfa-trees" } [dev-dependencies] diff --git a/algorithms/linfa-ftrl/Cargo.toml b/algorithms/linfa-ftrl/Cargo.toml index 1e3845c87..895d30e39 100644 --- a/algorithms/linfa-ftrl/Cargo.toml +++ b/algorithms/linfa-ftrl/Cargo.toml @@ -32,7 +32,7 @@ thiserror = "2.0" rand = "0.8.5" rand_xoshiro = "0.6.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] criterion = "0.5" @@ -40,7 +40,7 @@ approx = "0.5" linfa-datasets = { version = "0.8.0", path = "../../datasets", features = [ "winequality", ] } -linfa = { version = "0.8.0", path = "../..", features = ["benchmarks"] } +linfa = { version = "0.8.1", path = "../..", features = ["benchmarks"] } [[bench]] name = "ftrl" diff --git a/algorithms/linfa-hierarchical/Cargo.toml b/algorithms/linfa-hierarchical/Cargo.toml index 67e345f88..2c45aae0b 100644 --- a/algorithms/linfa-hierarchical/Cargo.toml +++ b/algorithms/linfa-hierarchical/Cargo.toml @@ -24,7 +24,7 @@ ndarray = { version = "0.16" } kodama = "0.2" thiserror = "2" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } linfa-kernel = { version = "0.8.0", path = "../linfa-kernel" } [dev-dependencies] diff --git a/algorithms/linfa-ica/Cargo.toml b/algorithms/linfa-ica/Cargo.toml index f6ac6685a..b5ba1f43d 100644 --- a/algorithms/linfa-ica/Cargo.toml +++ b/algorithms/linfa-ica/Cargo.toml @@ -34,13 +34,13 @@ num-traits = "0.2" rand_xoshiro = "0.6" thiserror = "2.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] ndarray-npy = { version = "0.9", default-features = false } paste = "1.0" criterion = "0.5" -linfa = { version = "0.8.0", path = "../..", features = ["benchmarks"] } +linfa = { version = "0.8.1", path = "../..", features = ["benchmarks"] } [[bench]] name = "fast_ica" diff --git a/algorithms/linfa-kernel/Cargo.toml b/algorithms/linfa-kernel/Cargo.toml index dc4f112aa..6efbc3d5e 100644 --- a/algorithms/linfa-kernel/Cargo.toml +++ b/algorithms/linfa-kernel/Cargo.toml @@ -28,5 +28,5 @@ ndarray = "0.16" num-traits = "0.2" sprs = { version = "=0.11.2", default-features = false } -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } linfa-nn = { version = "0.8.0", path = "../linfa-nn" } diff --git a/algorithms/linfa-lars/Cargo.toml b/algorithms/linfa-lars/Cargo.toml index d651e9aab..1deeafe53 100644 --- a/algorithms/linfa-lars/Cargo.toml +++ b/algorithms/linfa-lars/Cargo.toml @@ -25,7 +25,7 @@ default-features = false features = ["std", "derive"] [dependencies] -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } linfa-linalg = { version = "0.2", default-features = false } linfa-preprocessing = { version = "0.8.0" , path = "../linfa-preprocessing"} ndarray = { version = "0.16", features = ["approx"] } @@ -39,4 +39,4 @@ linfa-datasets = { version = "0.8.0", path = "../../datasets", features = [ ] } approx = "0.5" ndarray-rand = "0.15" -rand_xoshiro = "0.6" \ No newline at end of file +rand_xoshiro = "0.6" diff --git a/algorithms/linfa-linear/Cargo.toml b/algorithms/linfa-linear/Cargo.toml index 08b2b435e..9f7b2ba51 100644 --- a/algorithms/linfa-linear/Cargo.toml +++ b/algorithms/linfa-linear/Cargo.toml @@ -37,7 +37,7 @@ argmin = { version = "0.11.0", default-features = false } argmin-math = { version = "0.5", features = ["ndarray_v0_16-nolinalg"] } thiserror = "2.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] linfa-datasets = { version = "0.8.0", path = "../../datasets", features = [ @@ -46,7 +46,7 @@ linfa-datasets = { version = "0.8.0", path = "../../datasets", features = [ approx = "0.5" criterion = "0.5" statrs = "0.18" -linfa = { version = "0.8.0", path = "../..", features = ["benchmarks"] } +linfa = { version = "0.8.1", path = "../..", features = ["benchmarks"] } [[bench]] name = "ols_bench" diff --git a/algorithms/linfa-logistic/Cargo.toml b/algorithms/linfa-logistic/Cargo.toml index 3e0f29935..2e4c01883 100644 --- a/algorithms/linfa-logistic/Cargo.toml +++ b/algorithms/linfa-logistic/Cargo.toml @@ -30,7 +30,7 @@ argmin = { version = "0.11.0", default-features = false } argmin-math = { version = "0.5", features = ["ndarray_v0_16-nolinalg"] } thiserror = "2.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] approx = "0.5" diff --git a/algorithms/linfa-nn/Cargo.toml b/algorithms/linfa-nn/Cargo.toml index bbf427882..a74cd0156 100644 --- a/algorithms/linfa-nn/Cargo.toml +++ b/algorithms/linfa-nn/Cargo.toml @@ -33,14 +33,14 @@ thiserror = "2.0" kdtree = "0.7.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] approx = "0.5" criterion = "0.5" rand_xoshiro = "0.6" ndarray-rand = "0.15" -linfa = { version = "0.8.0", path = "../..", features = ["benchmarks"] } +linfa = { version = "0.8.1", path = "../..", features = ["benchmarks"] } [[bench]] name = "nn" diff --git a/algorithms/linfa-pls/Cargo.toml b/algorithms/linfa-pls/Cargo.toml index 1a6735687..ff5752f4b 100644 --- a/algorithms/linfa-pls/Cargo.toml +++ b/algorithms/linfa-pls/Cargo.toml @@ -33,10 +33,10 @@ ndarray-rand = "0.15" num-traits = "0.2" paste = "1.0" thiserror = "2.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] -linfa = { version = "0.8.0", path = "../..", features = ["benchmarks"] } +linfa = { version = "0.8.1", path = "../..", features = ["benchmarks"] } linfa-datasets = { version = "0.8.0", path = "../../datasets", features = [ "linnerud", ] } diff --git a/algorithms/linfa-preprocessing/Cargo.toml b/algorithms/linfa-preprocessing/Cargo.toml index 05ec1ba4d..c5488f5c0 100644 --- a/algorithms/linfa-preprocessing/Cargo.toml +++ b/algorithms/linfa-preprocessing/Cargo.toml @@ -18,7 +18,7 @@ blas = ["ndarray-linalg", "linfa/ndarray-linalg"] serde = ["serde_crate", "ndarray/serde", "serde_regex"] [dependencies] -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } ndarray = { version = "0.16", features = ["approx"] } ndarray-linalg = { version = "0.17", optional = true } linfa-linalg = { version = "0.2", default-features = false } @@ -52,7 +52,7 @@ iai = "0.1" curl = "0.4.35" flate2 = "1.0.20" tar = "0.4.33" -linfa = { version = "0.8.0", path = "../..", features = ["benchmarks"] } +linfa = { version = "0.8.1", path = "../..", features = ["benchmarks"] } criterion = "0.5" statrs = "0.18" diff --git a/algorithms/linfa-reduction/Cargo.toml b/algorithms/linfa-reduction/Cargo.toml index dbee2308f..671703068 100644 --- a/algorithms/linfa-reduction/Cargo.toml +++ b/algorithms/linfa-reduction/Cargo.toml @@ -42,7 +42,7 @@ num-traits = "0.2" thiserror = "2.0" rand = { version = "0.8", features = ["small_rng"] } -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } linfa-kernel = { version = "0.8.0", path = "../linfa-kernel" } sprs = { version = "=0.11.2" } rand_xoshiro = "0.6.0" diff --git a/algorithms/linfa-svm/Cargo.toml b/algorithms/linfa-svm/Cargo.toml index cf8623d50..66583b8c7 100644 --- a/algorithms/linfa-svm/Cargo.toml +++ b/algorithms/linfa-svm/Cargo.toml @@ -29,7 +29,7 @@ ndarray-rand = "0.15" num-traits = "0.2" thiserror = "2.0" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } linfa-kernel = { version = "0.8.0", path = "../linfa-kernel" } [dev-dependencies] diff --git a/algorithms/linfa-trees/Cargo.toml b/algorithms/linfa-trees/Cargo.toml index b2cf64e1c..9ec19ab39 100644 --- a/algorithms/linfa-trees/Cargo.toml +++ b/algorithms/linfa-trees/Cargo.toml @@ -27,7 +27,7 @@ features = ["std", "derive"] ndarray = { version = "0.16", features = ["rayon", "approx"] } ndarray-rand = "0.15" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] rand = { version = "0.8", features = ["small_rng"] } @@ -36,7 +36,7 @@ approx = "0.5" linfa-datasets = { version = "0.8.0", path = "../../datasets/", features = [ "iris", ] } -linfa = { version = "0.8.0", path = "../..", features = ["benchmarks"] } +linfa = { version = "0.8.1", path = "../..", features = ["benchmarks"] } [[bench]] name = "decision_tree" diff --git a/algorithms/linfa-tsne/Cargo.toml b/algorithms/linfa-tsne/Cargo.toml index ee33a3304..36cff294d 100644 --- a/algorithms/linfa-tsne/Cargo.toml +++ b/algorithms/linfa-tsne/Cargo.toml @@ -20,7 +20,7 @@ ndarray-rand = "0.15" bhtsne = "0.4.0" pdqselect = "=0.1.1" -linfa = { version = "0.8.0", path = "../.." } +linfa = { version = "0.8.1", path = "../.." } [dev-dependencies] rand = "0.8" diff --git a/datasets/Cargo.toml b/datasets/Cargo.toml index 92faca4fa..2c988765c 100644 --- a/datasets/Cargo.toml +++ b/datasets/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0" repository = "https://github.com/rust-ml/linfa" [dependencies] -linfa = { version = "0.8.0", path = ".." } +linfa = { version = "0.8.1", path = ".." } ndarray = { version = "0.16" } ndarray-csv = "=0.5.3" csv = "1.1" From 787ff93cc8045b62f84bd782d66981bc3443868d Mon Sep 17 00:00:00 2001 From: relf Date: Mon, 22 Dec 2025 17:51:42 +0100 Subject: [PATCH 2/4] Update changelog --- CHANGELOG.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 305e7215e..7725b17d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,22 @@ +Version 0.8.1 - 2025-12-22 +========================== +New Algorithms +-------------- + * Least angle regression in a new `linfa-lars` crate by [@aswin-1111] + * Random Forest in `linfa-ensemble` by [@ladezai] + * AdaBoost in `linfa-ensemble` by [@rathideep22] + +Changes +------- + * fix ndarray version mismatch + * fix missing exponential in `linfa-ica` + Version 0.8.0 - 2025-09-30 ========================== New Algorithms -------------- - * Bernouilli naive bayes in [linfa-bayes] by [@wildart] - * Bootstrap aggregation (aka Bagging) in new ensemble methods crate [linfa-ensemble] by [@jk1015] + * Bernouilli naive bayes in `linfa-bayes` by [@wildart] + * Bootstrap aggregation (aka Bagging) in new ensemble methods crate `linfa-ensemble` by [@jk1015] Changes ------- From 4c5e30812f977ec67d67370a9aa212f51c2429f4 Mon Sep 17 00:00:00 2001 From: relf Date: Tue, 23 Dec 2025 11:14:04 +0100 Subject: [PATCH 3/4] Add 0.8.1 news --- CHANGELOG.md | 1 + docs/website/content/news/release_081.md | 35 +++++++++++++++ docs/website/templates/base.html | 55 +++++++++++++----------- 3 files changed, 65 insertions(+), 26 deletions(-) create mode 100644 docs/website/content/news/release_081.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 7725b17d4..f4952e9a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ New Algorithms Changes ------- + * add bootstrap-with-indices utilities for `Dataset` * fix ndarray version mismatch * fix missing exponential in `linfa-ica` diff --git a/docs/website/content/news/release_081.md b/docs/website/content/news/release_081.md new file mode 100644 index 000000000..80e8eea8d --- /dev/null +++ b/docs/website/content/news/release_081.md @@ -0,0 +1,35 @@ ++++ +title = "Release 0.8.1" +date = "2025-12-23" ++++ + +`linfa 0.8.1` adds random forest, and AdaBoost boosting algorithms in `linfa-ensemble` and least angle regression in a new `linfa-lars` crate. + + + +## Improvements and fixes + +* `linfa-ica`: fix missing exponential by @lmmx in https://github.com/rust-ml/linfa/pull/426 +* `linfa`: + * add bootstrap-with-indices utilities for `Dataset` + * fix ndarray 0.16/0.17 versions mismatch (0.17 not supported) + +## New algorithms + +### Least Angle regression + +Least Angle Regression (LARS) is an algorithm used in regression for high dimensional data. + +See [sklearn.linear_model](https://scikit-learn.org/stable/modules/linear_model.html#least-angle-regression) + +### Ensemble methods + +Ensemble methods combine the predictions of several base estimators built with a given learning algorithm in order to improve generalizability / robustness over a single estimator. + +#### Random Forest + +See [sklearn.ensemble forest](https://scikit-learn.org/stable/modules/ensemble.html#forest) + +#### AdaBoost + +See [sklearn.ensemble AdaBoost](https://scikit-learn.org/stable/modules/ensemble.html#adaboost) diff --git a/docs/website/templates/base.html b/docs/website/templates/base.html index eaf938a80..996187d16 100644 --- a/docs/website/templates/base.html +++ b/docs/website/templates/base.html @@ -9,31 +9,31 @@ Linfa Toolkit - - + +
-
- - -
+
+ + +
@@ -42,11 +42,14 @@ {% block content %} {% endblock %} -
+
+
-
+
+
- + + \ No newline at end of file From 3f5c20d286f8dd8e1883c3eaeca86f2f9437a805 Mon Sep 17 00:00:00 2001 From: relf Date: Tue, 23 Dec 2025 11:32:30 +0100 Subject: [PATCH 4/4] Update README --- README.md | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index c7c1cf7f6..37884454c 100644 --- a/README.md +++ b/README.md @@ -28,25 +28,26 @@ Where does `linfa` stand right now? [Are we learning yet?](http://www.arewelearn `linfa` currently provides sub-packages with the following algorithms: -| Name | Purpose | Status | Category | Notes | -| :--- | :--- | :---| :--- | :---| -| [bayes](algorithms/linfa-bayes/) | Naive Bayes | Tested | Supervised learning | Contains Bernouilli, Gaussian and Multinomial Naive Bayes | -| [clustering](algorithms/linfa-clustering/) | Data clustering | Tested / Benchmarked | Unsupervised learning | Clustering of unlabeled data; contains K-Means, Gaussian-Mixture-Model, DBSCAN and OPTICS | -| [ensemble](algorithms/linfa-ensemble/) | Ensemble methods | Tested | Supervised learning | Contains bagging | -| [elasticnet](algorithms/linfa-elasticnet/) | Elastic Net | Tested | Supervised learning | Linear regression with elastic net constraints | -| [ftrl](algorithms/linfa-ftrl/) | Follow The Regularized Leader - proximal | Tested / Benchmarked | Partial fit | Contains L1 and L2 regularization. Possible incremental update | -| [hierarchical](algorithms/linfa-hierarchical/) | Agglomerative hierarchical clustering | Tested | Unsupervised learning | Cluster and build hierarchy of clusters | -| [ica](algorithms/linfa-ica/) | Independent component analysis | Tested | Unsupervised learning | Contains FastICA implementation | -| [kernel](algorithms/linfa-kernel/) | Kernel methods for data transformation | Tested | Pre-processing | Maps feature vector into higher-dimensional space | -| [linear](algorithms/linfa-linear/) | Linear regression | Tested | Partial fit | Contains Ordinary Least Squares (OLS), Generalized Linear Models (GLM) | -| [logistic](algorithms/linfa-logistic/) | Logistic regression | Tested | Partial fit | Builds two-class logistic regression models | -| [nn](algorithms/linfa-nn/) | Nearest Neighbours & Distances | Tested / Benchmarked | Pre-processing | Spatial index structures and distance functions | -| [pls](algorithms/linfa-pls/) | Partial Least Squares | Tested | Supervised learning | Contains PLS estimators for dimensionality reduction and regression | -| [preprocessing](algorithms/linfa-preprocessing/) | Normalization & Vectorization| Tested / Benchmarked | Pre-processing | Contains data normalization/whitening and count vectorization/tf-idf | -| [reduction](algorithms/linfa-reduction/) | Dimensionality reduction | Tested | Pre-processing | Diffusion mapping, Principal Component Analysis (PCA), Random projections | -| [svm](algorithms/linfa-svm/) | Support Vector Machines | Tested | Supervised learning | Classification or regression analysis of labeled datasets | -| [trees](algorithms/linfa-trees/) | Decision trees | Tested / Benchmarked | Supervised learning | Linear decision trees | -| [tsne](algorithms/linfa-tsne/) | Dimensionality reduction | Tested | Unsupervised learning | Contains exact solution and Barnes-Hut approximation t-SNE | +| Name | Purpose | Status | Category | Notes | +| :----------------------------------------------- | :--------------------------------------- | :-------------------- | :-------------------- | :---------------------------------------------------------------------------------------- | +| [bayes](algorithms/linfa-bayes/) | Naive Bayes | Tested | Supervised learning | Contains Bernouilli, Gaussian and Multinomial Naive Bayes | +| [clustering](algorithms/linfa-clustering/) | Data clustering | Tested / Benchmarked | Unsupervised learning | Clustering of unlabeled data; contains K-Means, Gaussian-Mixture-Model, DBSCAN and OPTICS | +| [ensemble](algorithms/linfa-ensemble/) | Ensemble methods | Tested | Supervised learning | Contains bagging, random forest and AdaBoost | +| [elasticnet](algorithms/linfa-elasticnet/) | Elastic Net | Tested | Supervised learning | Linear regression with elastic net constraints | +| [ftrl](algorithms/linfa-ftrl/) | Follow The Regularized Leader - proximal | Tested / Benchmarked | Partial fit | Contains L1 and L2 regularization. Possible incremental update | +| [hierarchical](algorithms/linfa-hierarchical/) | Agglomerative hierarchical clustering | Tested | Unsupervised learning | Cluster and build hierarchy of clusters | +| [ica](algorithms/linfa-ica/) | Independent component analysis | Tested | Unsupervised learning | Contains FastICA implementation | +| [kernel](algorithms/linfa-kernel/) | Kernel methods for data transformation | Tested | Pre-processing | Maps feature vector into higher-dimensional space | +| [lars](algorithms/linfa-lars/) | Linear regression | Tested | Supervised learning | Contains Least Angle Regression (LARS) | +| [linear](algorithms/linfa-linear/) | Linear regression | Tested | Supervised learning | Contains Ordinary Least Squares (OLS), Generalized Linear Models (GLM) | +| [logistic](algorithms/linfa-logistic/) | Logistic regression | Tested | Partial fit | Builds two-class logistic regression models | +| [nn](algorithms/linfa-nn/) | Nearest Neighbours & Distances | Tested / Benchmarked | Pre-processing | Spatial index structures and distance functions | +| [pls](algorithms/linfa-pls/) | Partial Least Squares | Tested | Supervised learning | Contains PLS estimators for dimensionality reduction and regression | +| [preprocessing](algorithms/linfa-preprocessing/) | Normalization & Vectorization | Tested / Benchmarked | Pre-processing | Contains data normalization/whitening and count vectorization/tf-idf | +| [reduction](algorithms/linfa-reduction/) | Dimensionality reduction | Tested | Pre-processing | Diffusion mapping, Principal Component Analysis (PCA), Random projections | +| [svm](algorithms/linfa-svm/) | Support Vector Machines | Tested | Supervised learning | Classification or regression analysis of labeled datasets | +| [trees](algorithms/linfa-trees/) | Decision trees | Tested / Benchmarked | Supervised learning | Linear decision trees | +| [tsne](algorithms/linfa-tsne/) | Dimensionality reduction | Tested | Unsupervised learning | Contains exact solution and Barnes-Hut approximation t-SNE | We believe that only a significant community effort can nurture, build, and sustain a machine learning ecosystem in Rust - there is no other way forward. @@ -56,11 +57,11 @@ If this strikes a chord with you, please take a look at the [roadmap](https://gi Some algorithm crates need to use an external library for linear algebra routines. By default, we use a pure-Rust implementation. However, you can also choose an external BLAS/LAPACK backend library instead, by enabling the `blas` feature and a feature corresponding to your BLAS backend. Currently you can choose between the following BLAS/LAPACK backends: `openblas`, `netblas` or `intel-mkl`. -|Backend | Linux | Windows | macOS | -|:--------|:-----:|:-------:|:-----:| -|OpenBLAS |✔️ |- |- | -|Netlib |✔️ |- |- | -|Intel MKL|✔️ |✔️ |✔️ | +| Backend | Linux | Windows | macOS | +| :-------- | :---: | :-----: | :---: | +| OpenBLAS | ✔️ | - | - | +| Netlib | ✔️ | - | - | +| Intel MKL | ✔️ | ✔️ | ✔️ | Each BLAS backend has two features available. The feature allows you to choose between linking the BLAS library in your system or statically building the library. For example, the features for the `intel-mkl` backend are `intel-mkl-static` and `intel-mkl-system`.