// rust/01-linear-regression.rs/*Linear regression implementation and best practices*/usestd::collections::HashMap;useserde::{Deserialize,Serialize};/// Linear regression model.pubstructLinearRegression{weights:Vec<f64>,bias:f64,learning_rate:f64,epochs:usize,regularization:f64,}#[derive(Debug, Clone, Serialize, Deserialize)]pubstructTrainingData{pubfeatures:Vec<Vec<f64>>,pubtargets:Vec<f64>,}#[derive(Debug, Clone, Serialize, Deserialize)]pubstructModelMetrics{pubmse:f64,pubrmse:f64,pubmae:f64,pubr2:f64,}implLinearRegression{pubfnnew(feature_count:usize,learning_rate:f64,epochs:usize,regularization:f64)->Self{Self{weights:vec![0.0;feature_count],bias:0.0,learning_rate,epochs,regularization,}}/// Train the linear regression model.pubfntrain(&mutself,data:&TrainingData)->Result<ModelMetrics,String>{ifdata.features.is_empty()||data.features.len()!=data.targets.len(){returnErr("Invalid training data".to_string());}letfeature_count=data.features[0].len();iffeature_count!=self.weights.len(){returnErr("Feature count mismatch".to_string());}// Gradient descent trainingforepochin0..self.epochs{let(weight_gradients,bias_gradient)=self.compute_gradients(data);// Update weights and biasfor(weight,gradient)inself.weights.iter_mut().zip(weight_gradients.iter()){*weight-=self.learning_rate*gradient;}self.bias-=self.learning_rate*bias_gradient;// Apply L2 regularizationforweightin&mutself.weights{*weight*=(1.0-self.learning_rate*self.regularization);}ifepoch%100==0{letmse=self.compute_mse(data);println!("Epoch {}: MSE = {:.6}",epoch,mse);}}Ok(self.compute_metrics(data))}/// Compute gradients for gradient descent.fncompute_gradients(&self,data:&TrainingData)->(Vec<f64>,f64){letmutweight_gradients=vec![0.0;self.weights.len()];letmutbias_gradient=0.0;letn=data.features.len()asf64;for(features,target)indata.features.iter().zip(data.targets.iter()){letprediction=self.predict_single(features);leterror=prediction-target;// Compute gradientsfor(i,feature)infeatures.iter().enumerate(){weight_gradients[i]+=error*feature;}bias_gradient+=error;}// Average gradientsforgradientin&mutweight_gradients{*gradient/=n;}bias_gradient/=n;(weight_gradients,bias_gradient)}/// Predict a single sample.fnpredict_single(&self,features:&[f64])->f64{letmutprediction=self.bias;for(weight,feature)inself.weights.iter().zip(features.iter()){prediction+=weight*feature;}prediction}/// Make predictions on new data.pubfnpredict(&self,features:&[Vec<f64>])->Vec<f64>{features.iter().map(|f|self.predict_single(f)).collect()}/// Compute mean squared error.fncompute_mse(&self,data:&TrainingData)->f64{letmutmse=0.0;for(features,target)indata.features.iter().zip(data.targets.iter()){letprediction=self.predict_single(features);leterror=prediction-target;mse+=error*error;}mse/data.features.len()asf64}/// Compute comprehensive metrics.fncompute_metrics(&self,data:&TrainingData)->ModelMetrics{letmutmse=0.0;letmutmae=0.0;letmuttarget_sum=0.0;letmuttarget_sum_sq=0.0;for(features,target)indata.features.iter().zip(data.targets.iter()){letprediction=self.predict_single(features);leterror=prediction-target;mse+=error*error;mae+=error.abs();target_sum+=target;target_sum_sq+=target*target;}letn=data.features.len()asf64;mse/=n;mae/=n;lettarget_mean=target_sum/n;lettarget_var=(target_sum_sq/n)-(target_mean*target_mean);letr2=1.0-(mse/target_var);ModelMetrics{mse,rmse:mse.sqrt(),mae,r2,}}/// Get model parameters.pubfnget_parameters(&self)->(Vec<f64>,f64){(self.weights.clone(),self.bias)}/// Set model parameters.pubfnset_parameters(&mutself,weights:Vec<f64>,bias:f64)->Result<(),String>{ifweights.len()!=self.weights.len(){returnErr("Weight count mismatch".to_string());}self.weights=weights;self.bias=bias;Ok(())}}/// Data preprocessing utilities.pubstructDataPreprocessor{feature_scalers:Vec<FeatureScaler>,target_scaler:Option<FeatureScaler>,}#[derive(Debug, Clone)]pubstructFeatureScaler{pubmean:f64,pubstd:f64,pubmin:f64,pubmax:f64,}implDataPreprocessor{pubfnnew()->Self{Self{feature_scalers:Vec::new(),target_scaler:None,}}/// Fit scalers to training data.pubfnfit(&mutself,data:&TrainingData,scale_target:bool){letfeature_count=data.features[0].len();self.feature_scalers.clear();// Fit feature scalersforiin0..feature_count{letvalues:Vec<f64>=data.features.iter().map(|f|f[i]).collect();letscaler=self.compute_scaler(&values);self.feature_scalers.push(scaler);}// Fit target scaler if requestedifscale_target{lettarget_scaler=self.compute_scaler(&data.targets);self.target_scaler=Some(target_scaler);}}/// Transform features using fitted scalers.pubfntransform_features(&self,features:&[Vec<f64>])->Vec<Vec<f64>>{features.iter().map(|f|self.transform_single_feature(f)).collect()}/// Transform targets using fitted scaler.pubfntransform_targets(&self,targets:&[f64])->Vec<f64>{ifletSome(scaler)=&self.target_scaler{targets.iter().map(|t|(t-scaler.mean)/scaler.std).collect()}else{targets.to_vec()}}/// Inverse transform targets.pubfninverse_transform_targets(&self,targets:&[f64])->Vec<f64>{ifletSome(scaler)=&self.target_scaler{targets.iter().map(|t|t*scaler.std+scaler.mean).collect()}else{targets.to_vec()}}/// Transform a single feature vector.fntransform_single_feature(&self,features:&[f64])->Vec<f64>{features.iter().enumerate().map(|(i,&value)|{letscaler=&self.feature_scalers[i];(value-scaler.mean)/scaler.std}).collect()}/// Compute scaler statistics.fncompute_scaler(&self,values:&[f64])->FeatureScaler{letmean=values.iter().sum::<f64>()/values.len()asf64;letvariance=values.iter().map(|v|(v-mean).powi(2)).sum::<f64>()/values.len()asf64;letstd=variance.sqrt();letmin=values.iter().cloned().fold(f64::INFINITY,f64::min);letmax=values.iter().cloned().fold(f64::NEG_INFINITY,f64::max);FeatureScaler{mean,std,min,max}}}#[cfg(test)]modtests{usesuper::*;#[test]fntest_linear_regression(){letmutmodel=LinearRegression::new(2,0.01,1000,0.001);letdata=TrainingData{features:vec![vec![1.0,2.0],vec![2.0,3.0],vec![3.0,4.0],vec![4.0,5.0],],targets:vec![3.0,5.0,7.0,9.0],};letmetrics=model.train(&data).unwrap();assert!(metrics.mse<1.0);assert!(metrics.r2>0.9);}#[test]fntest_data_preprocessor(){letmutpreprocessor=DataPreprocessor::new();letdata=TrainingData{features:vec![vec![1.0,10.0],vec![2.0,20.0],vec![3.0,30.0],],targets:vec![100.0,200.0,300.0],};preprocessor.fit(&data,true);lettransformed_features=preprocessor.transform_features(&data.features);assert_eq!(transformed_features.len(),3);}}
// rust/02-neural-network.rs/*Neural network implementation and best practices*/usestd::collections::HashMap;useserde::{Deserialize,Serialize};/// Neural network layer.pubstructLayer{weights:Vec<Vec<f64>>,biases:Vec<f64>,activation:ActivationFunction,}#[derive(Debug, Clone)]pubenumActivationFunction{ReLU,Sigmoid,Tanh,Linear,}implLayer{pubfnnew(input_size:usize,output_size:usize,activation:ActivationFunction)->Self{// Initialize weights with Xavier initializationletmutweights=Vec::new();for_in0..output_size{letmutrow=Vec::new();for_in0..input_size{letweight=fastrand::f64()*2.0-1.0;// Random between -1 and 1row.push(weight*(6.0/(input_size+output_size)asf64).sqrt());}weights.push(row);}// Initialize biases to zeroletbiases=vec![0.0;output_size];Self{weights,biases,activation,}}/// Forward pass through the layer.pubfnforward(&self,inputs:&[f64])->Vec<f64>{letmutoutputs=Vec::new();for(i,bias)inself.biases.iter().enumerate(){letmutsum=*bias;for(j,input)ininputs.iter().enumerate(){sum+=self.weights[i][j]*input;}outputs.push(self.activate(sum));}outputs}/// Backward pass through the layer.pubfnbackward(&mutself,inputs:&[f64],gradients:&[f64],learning_rate:f64)->Vec<f64>{letmutinput_gradients=vec![0.0;inputs.len()];for(i,gradient)ingradients.iter().enumerate(){// Update biasself.biases[i]-=learning_rate*gradient;// Update weights and compute input gradientsfor(j,input)ininputs.iter().enumerate(){self.weights[i][j]-=learning_rate*gradient*input;input_gradients[j]+=gradient*self.weights[i][j];}}input_gradients}/// Apply activation function.fnactivate(&self,x:f64)->f64{matchself.activation{ActivationFunction::ReLU=>x.max(0.0),ActivationFunction::Sigmoid=>1.0/(1.0+(-x).exp()),ActivationFunction::Tanh=>x.tanh(),ActivationFunction::Linear=>x,}}/// Compute activation derivative.fnactivate_derivative(&self,x:f64)->f64{matchself.activation{ActivationFunction::ReLU=>ifx>0.0{1.0}else{0.0},ActivationFunction::Sigmoid=>{letsigmoid=1.0/(1.0+(-x).exp());sigmoid*(1.0-sigmoid)}ActivationFunction::Tanh=>{lettanh=x.tanh();1.0-tanh*tanh}ActivationFunction::Linear=>1.0,}}}/// Multi-layer neural network.pubstructNeuralNetwork{layers:Vec<Layer>,learning_rate:f64,epochs:usize,}implNeuralNetwork{pubfnnew(layer_sizes:Vec<usize>,learning_rate:f64,epochs:usize)->Self{letmutlayers=Vec::new();foriin0..layer_sizes.len()-1{letactivation=ifi==layer_sizes.len()-2{ActivationFunction::Linear// Output layer}else{ActivationFunction::ReLU// Hidden layers};letlayer=Layer::new(layer_sizes[i],layer_sizes[i+1],activation);layers.push(layer);}Self{layers,learning_rate,epochs,}}/// Train the neural network.pubfntrain(&mutself,data:&TrainingData)->Result<ModelMetrics,String>{ifdata.features.is_empty()||data.features.len()!=data.targets.len(){returnErr("Invalid training data".to_string());}forepochin0..self.epochs{letmuttotal_loss=0.0;for(features,target)indata.features.iter().zip(data.targets.iter()){// Forward passletmutactivations=vec![features.clone()];forlayerin&self.layers{letoutput=layer.forward(activations.last().unwrap());activations.push(output);}// Compute lossletprediction=activations.last().unwrap()[0];leterror=prediction-target;total_loss+=error*error;// Backward passletmutgradients=vec![error];for(i,layer)inself.layers.iter_mut().enumerate().rev(){letlayer_input=&activations[i];gradients=layer.backward(layer_input,&gradients,self.learning_rate);}}letavg_loss=total_loss/data.features.len()asf64;ifepoch%100==0{println!("Epoch {}: Loss = {:.6}",epoch,avg_loss);}}Ok(self.compute_metrics(data))}/// Make predictions.pubfnpredict(&self,features:&[Vec<f64>])->Vec<f64>{features.iter().map(|f|self.predict_single(f)).collect()}/// Predict a single sample.fnpredict_single(&self,features:&[f64])->f64{letmutactivations=features.to_vec();forlayerin&self.layers{activations=layer.forward(&activations);}activations[0]}/// Compute model metrics.fncompute_metrics(&self,data:&TrainingData)->ModelMetrics{letmutmse=0.0;letmutmae=0.0;letmuttarget_sum=0.0;letmuttarget_sum_sq=0.0;for(features,target)indata.features.iter().zip(data.targets.iter()){letprediction=self.predict_single(features);leterror=prediction-target;mse+=error*error;mae+=error.abs();target_sum+=target;target_sum_sq+=target*target;}letn=data.features.len()asf64;mse/=n;mae/=n;lettarget_mean=target_sum/n;lettarget_var=(target_sum_sq/n)-(target_mean*target_mean);letr2=1.0-(mse/target_var);ModelMetrics{mse,rmse:mse.sqrt(),mae,r2,}}}/// Model persistence utilities.pubstructModelPersistence{model_path:String,}implModelPersistence{pubfnnew(model_path:String)->Self{Self{model_path}}/// Save model to file.pubfnsave_model(&self,model:&NeuralNetwork)->Result<(),String>{letserialized=serde_json::to_string_pretty(model).map_err(|e|format!("Failed to serialize model: {}",e))?;std::fs::write(&self.model_path,serialized).map_err(|e|format!("Failed to write model file: {}",e))?;Ok(())}/// Load model from file.pubfnload_model(&self)->Result<NeuralNetwork,String>{letcontent=std::fs::read_to_string(&self.model_path).map_err(|e|format!("Failed to read model file: {}",e))?;letmodel:NeuralNetwork=serde_json::from_str(&content).map_err(|e|format!("Failed to deserialize model: {}",e))?;Ok(model)}}#[cfg(test)]modtests{usesuper::*;#[test]fntest_neural_network(){letmutmodel=NeuralNetwork::new(vec![2,4,1],0.01,1000);letdata=TrainingData{features:vec![vec![0.0,0.0],vec![0.0,1.0],vec![1.0,0.0],vec![1.0,1.0],],targets:vec![0.0,1.0,1.0,0.0],};letmetrics=model.train(&data).unwrap();assert!(metrics.mse<1.0);}#[test]fntest_layer_forward(){letlayer=Layer::new(2,3,ActivationFunction::ReLU);letinputs=vec![1.0,2.0];letoutputs=layer.forward(&inputs);assert_eq!(outputs.len(),3);}}
// rust/03-model-evaluation.rs/*Model evaluation patterns and best practices*/usestd::collections::HashMap;useserde::{Deserialize,Serialize};/// Model evaluator for comprehensive evaluation.pubstructModelEvaluator{metrics:HashMap<String,f64>,predictions:Vec<f64>,targets:Vec<f64>,}implModelEvaluator{pubfnnew()->Self{Self{metrics:HashMap::new(),predictions:Vec::new(),targets:Vec::new(),}}/// Evaluate model performance.pubfnevaluate(&mutself,predictions:Vec<f64>,targets:Vec<f64>)->Result<(),String>{ifpredictions.len()!=targets.len(){returnErr("Predictions and targets length mismatch".to_string());}self.predictions=predictions;self.targets=targets;self.compute_regression_metrics();self.compute_classification_metrics();self.compute_advanced_metrics();Ok(())}/// Compute regression metrics.fncompute_regression_metrics(&mutself){letn=self.predictions.len()asf64;// Mean Squared Errorletmse:f64=self.predictions.iter().zip(self.targets.iter()).map(|(p,t)|(p-t).powi(2)).sum::<f64>()/n;// Root Mean Squared Errorletrmse=mse.sqrt();// Mean Absolute Errorletmae:f64=self.predictions.iter().zip(self.targets.iter()).map(|(p,t)|(p-t).abs()).sum::<f64>()/n;// R-squaredlettarget_mean:f64=self.targets.iter().sum::<f64>()/n;lettarget_variance:f64=self.targets.iter().map(|t|(t-target_mean).powi(2)).sum::<f64>()/n;letr2=1.0-(mse/target_variance);self.metrics.insert("mse".to_string(),mse);self.metrics.insert("rmse".to_string(),rmse);self.metrics.insert("mae".to_string(),mae);self.metrics.insert("r2".to_string(),r2);}/// Compute classification metrics.fncompute_classification_metrics(&mutself){letn=self.predictions.len()asf64;// Convert to binary predictions (threshold = 0.5)letbinary_predictions:Vec<bool>=self.predictions.iter().map(|p|*p>0.5).collect();letbinary_targets:Vec<bool>=self.targets.iter().map(|t|*t>0.5).collect();// Confusion matrixletmuttp=0;// True Positivesletmuttn=0;// True Negativesletmutfp=0;// False Positivesletmutfn=0;// False Negativesfor(pred,target)inbinary_predictions.iter().zip(binary_targets.iter()){match(*pred,*target){(true,true)=>tp+=1,(true,false)=>fp+=1,(false,true)=>fn+=1,(false,false)=>tn+=1,}}// Accuracyletaccuracy=(tp+tn)asf64/n;// Precisionletprecision=iftp+fp>0{tpasf64/(tp+fp)asf64}else{0.0};// Recallletrecall=iftp+fn>0{tpasf64/(tp+fn)asf64}else{0.0};// F1 Scoreletf1=ifprecision+recall>0.0{2.0*(precision*recall)/(precision+recall)}else{0.0};self.metrics.insert("accuracy".to_string(),accuracy);self.metrics.insert("precision".to_string(),precision);self.metrics.insert("recall".to_string(),recall);self.metrics.insert("f1_score".to_string(),f1);}/// Compute advanced metrics.fncompute_advanced_metrics(&mutself){letn=self.predictions.len()asf64;// Mean Absolute Percentage Errorletmape:f64=self.predictions.iter().zip(self.targets.iter()).map(|(p,t)|if*t!=0.0{((p-t).abs()/t.abs())*100.0}else{0.0}).sum::<f64>()/n;// Symmetric Mean Absolute Percentage Errorletsmape:f64=self.predictions.iter().zip(self.targets.iter()).map(|(p,t)|{letdenominator=(p.abs()+t.abs())/2.0;ifdenominator!=0.0{((p-t).abs()/denominator)*100.0}else{0.0}}).sum::<f64>()/n;// Mean Bias Errorletmbe:f64=self.predictions.iter().zip(self.targets.iter()).map(|(p,t)|p-t).sum::<f64>()/n;self.metrics.insert("mape".to_string(),mape);self.metrics.insert("smape".to_string(),smape);self.metrics.insert("mbe".to_string(),mbe);}/// Get all metrics.pubfnget_metrics(&self)->&HashMap<String,f64>{&self.metrics}/// Get a specific metric.pubfnget_metric(&self,name:&str)->Option<f64>{self.metrics.get(name).copied()}/// Generate evaluation report.pubfngenerate_report(&self)->String{letmutreport=String::new();report.push_str("# Model Evaluation Report\n\n");report.push_str("## Regression Metrics\n");ifletSome(mse)=self.metrics.get("mse"){report.push_str(&format!("- MSE: {:.6}\n",mse));}ifletSome(rmse)=self.metrics.get("rmse"){report.push_str(&format!("- RMSE: {:.6}\n",rmse));}ifletSome(mae)=self.metrics.get("mae"){report.push_str(&format!("- MAE: {:.6}\n",mae));}ifletSome(r2)=self.metrics.get("r2"){report.push_str(&format!("- R²: {:.6}\n",r2));}report.push_str("\n## Classification Metrics\n");ifletSome(accuracy)=self.metrics.get("accuracy"){report.push_str(&format!("- Accuracy: {:.6}\n",accuracy));}ifletSome(precision)=self.metrics.get("precision"){report.push_str(&format!("- Precision: {:.6}\n",precision));}ifletSome(recall)=self.metrics.get("recall"){report.push_str(&format!("- Recall: {:.6}\n",recall));}ifletSome(f1)=self.metrics.get("f1_score"){report.push_str(&format!("- F1 Score: {:.6}\n",f1));}report.push_str("\n## Advanced Metrics\n");ifletSome(mape)=self.metrics.get("mape"){report.push_str(&format!("- MAPE: {:.6}%\n",mape));}ifletSome(smape)=self.metrics.get("smape"){report.push_str(&format!("- SMAPE: {:.6}%\n",smape));}ifletSome(mbe)=self.metrics.get("mbe"){report.push_str(&format!("- MBE: {:.6}\n",mbe));}report}}/// Cross-validation evaluator.pubstructCrossValidator{k_folds:usize,random_seed:Option<u64>,}implCrossValidator{pubfnnew(k_folds:usize)->Self{Self{k_folds,random_seed:None,}}/// Set random seed for reproducibility.pubfnset_random_seed(&mutself,seed:u64){self.random_seed=Some(seed);}/// Perform k-fold cross-validation.pubfncross_validate<F,T>(&self,data:&TrainingData,train_fn:F)->Result<Vec<ModelMetrics>,String>whereF:Fn(&TrainingData)->Result<T,String>,T:std::fmt::Debug,{ifdata.features.len()<self.k_folds{returnErr("Not enough data for k-fold cross-validation".to_string());}letmutresults=Vec::new();letfold_size=data.features.len()/self.k_folds;forfoldin0..self.k_folds{let(train_data,test_data)=self.split_data(data,fold,fold_size);// Train model on training datalet_model=train_fn(&train_data)?;// Evaluate on test data (simplified for this example)letmetrics=ModelMetrics{mse:0.1,rmse:0.1.sqrt(),mae:0.1,r2:0.9,};results.push(metrics);}Ok(results)}/// Split data into train and test sets.fnsplit_data(&self,data:&TrainingData,fold:usize,fold_size:usize)->(TrainingData,TrainingData){letstart=fold*fold_size;letend=start+fold_size;letmuttrain_features=Vec::new();letmuttrain_targets=Vec::new();letmuttest_features=Vec::new();letmuttest_targets=Vec::new();for(i,(features,target))indata.features.iter().zip(data.targets.iter()).enumerate(){ifi>=start&&i<end{test_features.push(features.clone());test_targets.push(*target);}else{train_features.push(features.clone());train_targets.push(*target);}}(TrainingData{features:train_features,targets:train_targets,},TrainingData{features:test_features,targets:test_targets,},)}}#[cfg(test)]modtests{usesuper::*;#[test]fntest_model_evaluator(){letmutevaluator=ModelEvaluator::new();letpredictions=vec![1.0,2.0,3.0,4.0];lettargets=vec![1.1,2.1,2.9,4.1];evaluator.evaluate(predictions,targets).unwrap();letmse=evaluator.get_metric("mse");assert!(mse.is_some());assert!(mse.unwrap()<1.0);}#[test]fntest_cross_validator(){letvalidator=CrossValidator::new(3);letdata=TrainingData{features:vec![vec![1.0,2.0],vec![2.0,3.0],vec![3.0,4.0],vec![4.0,5.0],vec![5.0,6.0],vec![6.0,7.0],],targets:vec![3.0,5.0,7.0,9.0,11.0,13.0],};letresults=validator.cross_validate(&data,|_|Ok("dummy")).unwrap();assert_eq!(results.len(),3);}}
// 1. Linear regressionletmutmodel=LinearRegression::new(2,0.01,1000,0.001);letmetrics=model.train(&data)?;// 2. Neural networkletmutnn=NeuralNetwork::new(vec![2,4,1],0.01,1000);letmetrics=nn.train(&data)?;// 3. Model evaluationletmutevaluator=ModelEvaluator::new();evaluator.evaluate(predictions,targets)?;