MAKS_Enjoyer

regressor.py

Jul 10th, 2024
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.34 KB | Source Code | 0 0
  1. import csv
  2. import os
  3. from sklearn.linear_model import LinearRegression
  4. from sklearn.metrics import mean_squared_error, r2_score
  5. from sklearn.preprocessing import PolynomialFeatures
  6. import matplotlib.pyplot as plt
  7. import numpy as np
  8.  
  9. def read_csv_data(file_path):
  10.     """
  11.    Reads data from a CSV file and returns separate NumPy arrays for time and altitude.
  12.    """
  13.     range_dataa, altitude_dataa = [], []
  14.     with open(file_path, "r") as csvfile:
  15.         reader = csv.reader(csvfile)
  16.         for row in reader:
  17.             range_dataa.append(float(row[1]))
  18.             altitude_dataa.append(float(row[4]))
  19.     return np.array(range_dataa), np.array(altitude_dataa)
  20.  
  21. # Define output directory paths with better variable names
  22. output_dir = "Output_Files"
  23. altitude_range_dir = os.path.join(output_dir, f"Altitude_Range")
  24.  
  25. # Create directories if they don't exist
  26. os.makedirs(output_dir, exist_ok=True)
  27. os.makedirs(altitude_range_dir, exist_ok=True)
  28. with open(f"Output_Files\Altitude_Range\eqtns.txt", "x") as file:
  29.     file.write("")
  30.  
  31. for simulation_number in range(1, 61):
  32.     # Construct file paths with f-strings
  33.     data_file = f"Data Save File\Simulation{simulation_number} - Data Points.csv"
  34.     range_data, altitude_data = read_csv_data(data_file)
  35.  
  36.     # Reshape data for compatibility with sklearn (single feature needs reshaping)
  37.     altitude_data = altitude_data.reshape(-1, 1)  # Equivalent to x[:, np.newaxis]
  38.  
  39.     poly_degree = None
  40.     # Create polynomial features
  41.     if 0 <= simulation_number <= 43:
  42.         poly_degree = 4
  43.     elif 43 <= simulation_number <= 56:
  44.         poly_degree = 5
  45.     elif simulation_number >= 57:
  46.         poly_degree = 6
  47.  
  48.     polynomial_converter = PolynomialFeatures(degree=poly_degree)
  49.     x_poly = polynomial_converter.fit_transform(altitude_data)
  50.  
  51.     # Train linear regression model
  52.     model = LinearRegression()
  53.     model.fit(x_poly, range_data)
  54.     predicted_range = model.predict(x_poly)
  55.  
  56.     # Calculate root mean squared error (RMSE)
  57.     rmse = np.sqrt(mean_squared_error(range_data, predicted_range))
  58.  
  59.     # Calculate R-squared score
  60.     r2 = r2_score(range_data, predicted_range)
  61.  
  62.     # Sort data by altitude for plotting
  63.     sorted_data = sorted(zip(altitude_data.ravel(), predicted_range.ravel()))
  64.     sorted_altitude, sorted_predicted_range = zip(*sorted_data)
  65.  
  66.     # Create the plot
  67.     plt.figure(figsize=(12, 6))
  68.     plt.title(f'Rocket Trajectory Polynomial Regression - Altitude v/s Range Graph')
  69.     plt.xlabel('Range (m)')
  70.     plt.ylabel('Altitude (m)')
  71.     plt.plot(sorted_altitude, sorted_predicted_range, color='m', label=f'{poly_degree}th degree Fitted Polynomial (R² = {r2:.3f})')
  72.     plt.scatter(altitude_data.ravel(), range_data, s=20, label='Data Points')
  73.     plt.xlim([sorted_altitude[0] - 1, sorted_altitude[-1] + 1])
  74.     plt.legend()
  75.  
  76.     # Save plot with descriptive filename
  77.     plot_filename = f"{altitude_range_dir}/fig{simulation_number}.png"
  78.     plt.savefig(plot_filename)
  79.     plt.close()
  80.  
  81.     with open(f"Output_Files\Altitude_Range\eqtns.txt", "a") as file:
  82.         file.write(f"The RMSE value of the {poly_degree}th degree fitted polynomial at launch angle {simulation_number} is: \n{rmse}\n")
  83.         file.write(f"The R² value of the {poly_degree}th degree fitted polynomial at launch angle {simulation_number} is: \n{r2}\n\n")
  84.         file.close()
Advertisement
Add Comment
Please, Sign In to add comment