Параметры. Подгонка под набор данных (dataset)
params.fit(&dataset);
Каждый алгоритм должен быть реализован для f32
и f64
типов с плавающей точкой. Это может быть достигнуто с помощью признака linfa::Float
, который по сути является просто комбинацией ndarray::NdFloat
и num_traits::Float
. Вы можете найти большинство констант (например, ноль, один, PI) в документации num_traits
. Вот небольшой пример функции, общей для Float
:
use linfa::Float;
fn div_capped<F: Float>(num: F) {
F::one() / (num + F::from(1e-5).unwrap())
}
Существует два разных признака для предсказаний: Predict
и PredictInplace
. PredictInplace
принимает ссылку на записи и записывает предсказание в целевой параметр. Это должно быть реализовано новыми алгоритмами, например:
impl<F: Float, D: Data<Elem = F>> PredictInplace<ArrayBase<D, Ix2>, Array1<F>> for Svm<F, F> {
fn predict_inplace(&self, data: &ArrayBase<D, Ix2>, targets: &mut Array1<F>) {
assert_eq!(data.n_rows(), targets.len(), "Количество точек данных должно соответствовать количеству выходных целей.");
for (data, target) in data.outer_iter().zip(targets.iter_mut()) {
*target = self.normal.dot(&data) - self.rho;
}
}
fn default_target(&self, data: &ArrayBase<D, Ix2>) -> Array1<F> {
Array1::zeros(data.nrows())
}
}
Эта реализация затем используется Predict
, чтобы предоставить следующие комбинации записей и целей:
Dataset
-> Dataset
;&Dataset
-> Array1
;Array2
-> Dataset
;&Array2
-> Array1
.И должна быть импортирована пользователем.
Если вы хотите реализовать Serialize
и Deserialize
для своих параметров, пожалуйста, сделайте это за флагом функции. Вы можете добавить в свой манифест Cargo:
[features]
serde = ["serde_crate", "ndarray/serde"]
[dependencies.serde_crate]
package = "serde"
optional = true
version = "1.0"
Который по существу переименовывает ящик serde
в serde_crate
и добавляет признак serde
. В вашей структуре параметров переместите определение макроса за признак serde
:
#[cfg(feature = "serde")]
use serde_crate::{Deserialize, Serialize};
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate")
)]
#[derive(Clone, Debug, PartialEq)]
pub struct HyperParams {
...
}
Когда вы хотите добавить набор данных в ящик linfa-datasets
, вам необходимо сделать следующее:
linfa-datasets/data/?.csv.gz
;linfa-datasets
;linfa-datasets/src/lib.rs
, которая будет носить имя вашего набора данных и загружать его как двоичный файл.Для последнего шага вы можете посмотреть на похожие реализации, например, набор данных Iris. Идея здесь состоит в том, чтобы поместить набор данных непосредственно в создаваемую библиотеку и проанализировать его из памяти. Очевидно, это возможно только для небольших наборов данных.
После добавления его в ящик linfa-datasets
вы можете включить соответствующую функцию в ваш файл Cargo.toml
:
linfa-datasets = { version = "0.3.0", path = "../datasets", features = ["winequality"] }
А затем использовать его в вашем примере или тестах следующим образом:
fn main() {
let (train, valid) = linfa_datasets::winequality()
.split_with_ratio(0.8);
/// ...
}
Когда вы хотите реализовать алгоритм, который требует ограничения Lapack, вы можете добавить ограничение признака к стандартному ограничению linfa::Float
, например, F: Float + Scalar + Lapack
. Если вы сделаете это, то сейчас столкнётесь с конфликтующими определениями функций num_traits::Float и cauchy::Scalar: первое определено для вещественных значений, а второе — для комплексных значений.
Если вы хотите избежать этого, вы можете использовать: Черты linfa::dataset::{WithLapack, WithoutLapack}
, которые в основном добавляют признак Lapack для блока, а затем снова удаляют его, чтобы избежать конфликтов.
Например:
let decomp = covariance.with_lapack().cholesky(UPLO::Lower)?;
let sol = decomp
.solve_triangular(UPLO::Lower, Diag::NonUnit, &Array::eye(n_features))?
.without_lapack();
Для проекта важно иметь в наличии бенчмарки, чтобы оценить пользу от изменений, связанных с производительностью. Чтобы упростить этот процесс, мы предоставляем некоторые рекомендации по написанию бенчмарков.
BenchmarkId
включите значения, используемые для параметризации бенчмарка. Например, если мы делаем Pls, у нас может быть что-то вроде Canonical-Nipals-5feats-1_000samples
.benchmarks
в ящике linfa для настройки групп бенчмарков и профилировщика. См. bench в linfa-pls в качестве примера этого. В большинстве случаев вы можете просто скопировать и вставить части конфигурации кода. Если требуются другие конфигурации, их всё равно легко настроить и объяснить в документации pprof и Criterion.Не стесняйтесь использовать bench pls в качестве руководства. Обратите внимание, что он использует функции config::set_default_benchmark_configs
и config::get_default_profiling_configs
для настройки бенчмаркинга и профилирования соответственно.
При запуске бенчмарков иногда вам потребуется профилировать выполнение кода. Предполагая, что вы выполнили шаг 9, чтобы добавить хук профилирования pprof для пакета linfa-ica, вы можете запустить следующее, чтобы получить результаты профилирования в виде flamegraph. Имейте в виду, что на момент написания этого профилирование не будет работать на компьютерах с Windows.
cargo bench -p linfa-ica --bench fast_ica -q -- --profile-time 30
Если вы заинтересованы в запуске обычного критерия bench для linfa-ica, то вы можете выполнить следующее:
cargo bench -p linfa-ica
Важно, чтобы у нас была согласованная методология отчётности о бенчмарках. Ниже приведён шаблон, который должен помочь рецензентам.
### Контекст
В списке пунктов опишите следующее:
1. Работа от батареи или при подключении к сети
2. Режим энергосбережения
3. Был ли компьютер бездействующим во время бенчмарка
4. Перегревался ли компьютер
5. Аппаратные характеристики
### Команда запуска бенчмарка
Результаты бенчмарка (формат кода)
[Прикреплённые Flamegraphs, если также были выполнены прогоны профиля]
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )