У меня есть 300 образцов данных о температуре и высоте, каждый размером 20x300. Каждый из этих образцов был создан с использованием различных характеристик. Эти 300 температурных профилей меняются в зависимости от высоты, что усложняет визуализацию данных и определение того, какой образец из 300 вызывает максимальное изменение, а какой номер образца соответствует минимальному отклонению от номинального температурного профиля. Кроме того, мне нужно идентифицировать образцы, демонстрирующие схожий характер или температурный профиль. Я попытался использовать анализ главных компонентов, чтобы уменьшить размерность до двух компонентов, но не уверен, как интерпретировать данные и движусь ли я в правильном направлении. В приведенном ниже примере кода я воспроизвел данные о температуре и высоте из 300 выборок.
импортировать numpy как np импортировать matplotlib.pyplot как plt """ Создайте 300 выборок данных для высоты и температуры """ # Определить количество строк и столбцов количество_строк, количество_столбцов = 20, 300 # Создайте массив высот в диапазоне от 100 км до 500 км. высоты = np.linspace(100, 500, num_rows) # Повторите значения высоты во всех столбцах height_array = np.tile(altitudes, (num_columns, 1)).T # Параметры для создания температурных профилей height_midpoint = (altitudes.min() + heights.max()) / 2 температура_амплитуда, температура_частота = 250, 0,02 # Создайте синусоидальную волну для представления температуры в зависимости от высоты температуры = температура_амплитуда * np.sin(частота_температуры * (высота — средняя точка высоты)) + 750 # Создать случайный шум для небольших изменений температуры макс_вариация = 50 шум = np.random.uniform(-max_variation, max_variation, (num_rows, num_columns)) # Добавьте шум к температурам, чтобы создать температурные профили temp_array = температура[:, np.newaxis] + шум """ Анализ главных компонентов""" из sklearn.decomposition импорт PCA run_number = np.arange(1, 301).reshape(300, 1) ПКА = ПКА(2) Principal_comComponents = pca.fit_transform(temperature_array.T) печать (temperature_array.shape) печать(principal_comComponents.shape) # Создайте фигуру с двумя подграфиками рис, axs = plt.subplots(1, 3, figsize=(12, 5)) # Первый сюжет # График зависимости температуры от высоты для всех 300 профилей для меня в диапазоне (num_columns): sc1 = axs[0].plot(temperature_array[:, i], height_array[:, i], label=f'Profile {i+1}', альфа=0,8) # Постройте профиль номинальной температуры отмеченными линиями номинальная_температура = температура_амплитуда * np.sin(температура_частота * (высота - высота_средняя точка)) + 750 axs[0].plot(nominal_temperature, heights, 'k', linewidth=2, label='Nominal Profile', linestyle='--') # Установите метки и заголовок сюжета axs[0].set_ylabel('Высота (км)') axs[0].set_xlabel('Температура (K)') axs[0].set_title('Профили температуры и высоты') # Второй сюжет sc2 = axs[1].scatter(основные_компоненты[:, 0], главные_компоненты[:, 1], c=run_number.T,edgecolor='none', альфа=0,5, cmap=plt.cm.get_cmap('Акцент')) axs[1].set_xlabel('компонент 1') axs[1].set_ylabel('компонент 2') fig.colorbar(sc2, ax=axs[1]) # Третий сюжет sc3 = axs[2].plot(np.cumsum(pca.explained_variance_ratio_)) axs[2].set_xlabel('количество компонентов') axs[2].set_ylabel('кумулятивная объясненная дисперсия') plt.tight_layout()
