| import numpy as np
|
| import joblib
|
| import os
|
| import sys
|
| from sklearn.ensemble import ExtraTreesRegressor
|
| from sklearn.model_selection import train_test_split
|
| from sklearn.metrics import mean_squared_error
|
|
|
|
|
| if not os.path.exists('models'):
|
| os.makedirs('models')
|
|
|
| def generate_comprehensive_training_data(n_samples=100000):
|
| """
|
| Generates a large, comprehensive dataset covering a wide range of b-values
|
| and physiological parameters to create a robust pre-trained model.
|
| """
|
| print(f"Generating {n_samples} synthetic samples for pre-training...")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| b_values = np.array([0, 10, 20, 30, 50, 80, 100, 150, 200, 400, 600, 800, 1000, 1500, 2000])
|
|
|
|
|
| D = np.random.uniform(0.0001, 0.004, n_samples)
|
| f = np.random.uniform(0.01, 0.4, n_samples)
|
| D_star = np.random.uniform(0.005, 0.1, n_samples)
|
| K = np.random.uniform(0, 2.5, n_samples)
|
|
|
| X = []
|
| Y = []
|
|
|
| for i in range(n_samples):
|
|
|
|
|
|
|
|
|
|
|
| exponent_diff = -b_values * D[i] + (1/6) * (b_values**2) * (D[i]**2) * K[i]
|
| term_diff = np.exp(exponent_diff)
|
|
|
|
|
| term_perf = np.exp(-b_values * D_star[i])
|
|
|
| signal = f[i] * term_perf + (1 - f[i]) * term_diff
|
|
|
|
|
|
|
| snr = np.random.uniform(20, 100)
|
| sigma = 1.0 / snr
|
| noise = np.random.normal(0, sigma, size=len(b_values))
|
|
|
| signal_noisy = signal + noise
|
|
|
|
|
| signal_noisy = np.sqrt(signal_noisy**2 + noise**2)
|
|
|
|
|
| signal_norm = signal_noisy / np.max(signal_noisy)
|
|
|
| X.append(signal_norm)
|
| Y.append([D[i], f[i], D_star[i], K[i]])
|
|
|
| return np.array(X), np.array(Y), b_values
|
|
|
| def train_and_save():
|
| X, Y, b_values = generate_comprehensive_training_data(n_samples=50000)
|
|
|
| print("Training ExtraTreesRegressor (Multi-output)...")
|
|
|
| model = ExtraTreesRegressor(
|
| n_estimators=50,
|
| max_depth=20,
|
| min_samples_leaf=5,
|
| min_samples_split=10,
|
| n_jobs=-1,
|
| random_state=42,
|
| verbose=1
|
| )
|
|
|
| model.fit(X, Y)
|
|
|
|
|
| preds = model.predict(X[:1000])
|
| mse = mean_squared_error(Y[:1000], preds)
|
| print(f"Training MSE: {mse:.6f}")
|
|
|
|
|
| model_path = 'models/ivim_dki_extratrees.joblib'
|
| joblib.dump(model, model_path, compress=3)
|
| print(f"Model saved to {model_path}")
|
|
|
|
|
| np.save('models/b_values_config.npy', b_values)
|
| print("Configuration saved.")
|
|
|
| if __name__ == "__main__":
|
| train_and_save()
|
|
|