赞
踩
我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~
让我们来看看认证杯的A题!
完整内容可以在文章末尾领取!
问题A(MCM):太阳黑子预测
太阳黑子是太阳光球上的一种现象,呈现为暂时比周围区域更暗的斑点。这些斑点是由于磁通量浓集导致的表面温度降低,从而抑制了对流。太阳黑子通常出现在活跃区域,通常成对出现,具有相反的磁性。它们的数量随着大约11年的太阳周期而变化。每个太阳黑子或太阳黑子群可能持续几天到几个月,然后最终衰减。太阳黑子在太阳表面移动时会扩张和收缩,直径范围从16公里(10英里)[1]到160,000公里(100,000英里)。一些较大的太阳黑子甚至可以在没有望远镜的情况下从地球上看到[2]。它们在首次出现时可能以相对速度,或正确运动的方式,移动几百米每秒。
太阳周期通常持续约11年,其长度从略低于10年到略高于12年不等。周期内太阳黑子活动的最高点被称为太阳最大值,最低点被称为太阳最小值。这一周期也影响到其他太阳活动,并与太阳磁场变极性有关。
太阳黑子数目也在较长时期内发生变化。例如,在1900年到1958年的现代最大值时期,太阳黑子计数呈上升趋势;而在随后的60年中,趋势主要是下降的[3]。总体而言,太阳上次活跃到现代最大值状态是在8000多年前[4]。
由于太阳黑子与其他太阳活动的相关性,它们可用于帮助预测太空天气、电离层状态以及与短波无线电传播或卫星通信相关的条件。尽管已经使用基于时间序列分析、谱分析和神经网络的多个模型来预测太阳黑子活动,但通常结果不佳。这可能与大多数预测模型在数据层面上是现象学的事实有关。虽然我们通常知道太阳活动周期的长度,但该周期并不完全稳定,活动的最大强度随时间变化,峰值的时间和持续时间难以准确预测。
我们的任务是预测太阳黑子,并通常需要将结果以月度为基础进行平均。您和您的团队被要求开发合理的数学模型,以尽可能可信地预测太阳黑子。相关的观测数据可在许多天文台以及空间科学研究机构公开获取,包括历史太阳黑子数量、太阳黑子区域以及可能相关的其他指标的观测。
具体任务包括:
使用Prophet来解决太阳黑子周期性预测问题。
Prophet是由Facebook开发的开源时间序列预测工具,旨在简化时间序列数据的预测过程。Prophet特别适用于具有季节性和节假日效应的数据,例如销售数据、气象数据等。以下是Prophet的一些关键特点和使用方面的优势:
季节性和节假日模型: Prophet能够自动处理强烈的季节性和节假日效应,使其特别适用于包含这些特征的时间序列数据。用户可以通过添加自定义的节假日效应来提高模型的准确性。
处理缺失数据: Prophet能够有效处理数据中的缺失值,这对于实际应用中常见的问题是很有帮助的。
可解释性: Prophet生成可解释性强的模型,提供了有关趋势、季节性和节假日效应的详细信息。这使得用户能够理解模型是如何做出预测的。
快速建模: Prophet的使用相对简单,无需用户深入了解复杂的时间序列建模技术。这使得即便是不具备专业背景的用户也能够快速上手。
柔性趋势模型: Prophet采用了灵活的趋势模型,能够适应不同时间段内数据的变化。用户可以根据实际情况选择添加或移除趋势成分。
可视化工具: Prophet提供了用于可视化预测结果的丰富工具,包括趋势、季节性分量和不确定性界限的图表。
开源和灵活性: Prophet是一个开源工具,用户可以自由地使用和修改它,根据自己的需求进行扩展和调整。
Prophet的主要目标是通过提供简单而强大的时间序列预测工具,使更多的人能够有效地进行时间序列分析和预测。它的设计理念是使时间序列建模变得更加直观和易于理解,从而降低了入门门槛,使更广泛的用户能够从中受益。
安装Prophet: 首先,确保您已经安装了Prophet。您可以使用以下命令通过pip安装:
pip install prophet
导入必要的库: 在Python中导入所需的库和模块:
import pandas as pd
from fbprophet import Prophet
from fbprophet.diagnostics import cross_validation
from fbprophet.diagnostics import performance_metrics
from fbprophet.plot import plot_cross_validation_metric
import matplotlib.pyplot as plt
准备数据: 将历史太阳黑子活动数据准备成Prophet所需的格式,包括"ds"(日期时间戳)和"y"(目标值):
# 假设df是您的数据框,包含日期和太阳黑子计数
df = pd.read_csv("your_data.csv")
df.columns = ['ds', 'y']
创建并拟合Prophet模型: 使用Prophet创建模型并拟合训练数据:
model = Prophet()
model.fit(df)
生成未来时间点: 生成要进行预测的未来时间点:
future = model.make_future_dataframe(periods=365) # 365天的未来时间点
进行预测: 使用模型进行预测:
forecast = model.predict(future)
模型性能评估: 使用交叉验证来评估模型性能,计算均方根误差(RMSE):
df_cv = cross_validation(model, initial='730 days', period='180 days', horizon='365 days')
df_p = performance_metrics(df_cv)
print(df_p['rmse'].values[0])
这里,initial
是训练数据的历史天数,period
是每次滚动的天数,horizon
是要预测的未来天数。
可视化结果: 使用Prophet提供的可视化工具查看预测结果:
fig = model.plot(forecast)
plt.show()
当使用Prophet进行太阳最大值的发生时间和持续时间预测时,可以采用以下的建模思路:
数据加载和准备:
添加节假日效应:
创建并拟合Prophet模型:
yearly_seasonality
,以考虑年度季节性。生成未来时间点:
make_future_dataframe
函数生成未来一段时间的时间点,以进行预测。这段时间应包括太阳最大值的预测期。进行预测:
结果解释和可视化:
模型评估:
调整模型和参数:
生成论文或报告:
以下是基于上述思路的Python代码示例:
import pandas as pd from fbprophet import Prophet import matplotlib.pyplot as plt # 1. 数据加载 df = pd.read_csv("your_data.csv") df.columns = ['ds', 'y'] # 2. 添加节假日效应 # 根据实际情况,添加适当的自定义节假日效应 # 3. 创建并拟合Prophet模型 model = Prophet(yearly_seasonality=True, holidays=holidays) # 根据需要调整参数 model.fit(df) # 4. 生成未来时间点 future = model.make_future_dataframe(periods=365) # 365天的未来时间点 # 5. 进行预测 forecast = model.predict(future) # 6. 结果解释和可视化 fig = model.plot_components(forecast) # 可视化趋势、季节性等组件 plt.show() # 7. 模型评估 # 进行交叉验证等评估方法 # 8. 调整模型和参数 # 根据评估结果,调整模型和参数 # 9. 生成论文或报告 # 在报告中解释模型的预测结果,包括太阳最大值的发生时间和持续时间的估计
上述代码假设了一些数据的特性,例如数据中包含了 ‘ds’(日期时间戳)和 ‘y’(太阳黑子计数)。
建模太阳黑子数量和面积的预测问题可以分为以下步骤,其中我们分别使用Prophet模型来预测数量和面积:
yearly_seasonality
为True,以考虑年度季节性。make_future_dataframe
函数生成未来时间点。plot_components
函数查看趋势、季节性等组件。模型的可行性是指模型在解决问题上的适用性和有效性。对于太阳黑子数量和面积的预测问题,Prophet模型具有一些特性和优势,从而提高了其可行性:
处理季节性和周期性: Prophet模型专门设计用于处理具有季节性和周期性的时间序列数据。由于太阳黑子数量和面积与太阳活动周期相关,Prophet的内置季节性分析有助于更好地捕捉这些周期性变化。
考虑特殊日期和节假日效应: 通过允许用户自定义节假日效应,Prophet模型可以灵活地应对特殊日期对太阳黑子活动的影响。这对于太阳活动周期中的特殊事件(如太阳风暴)的预测具有重要意义。
处理缺失数据和异常值: Prophet能够处理数据中的缺失值,并且对于一些异常值也具有一定的鲁棒性。这在实际数据中很常见,因为观测太阳黑子可能受到观测设备或其他因素的影响。
可解释性: Prophet生成的预测结果包括趋势、季节性和其他组件,这有助于对模型的预测结果进行解释。这对于太阳活动研究者和预测应用中的决策制定者来说是一个重要的优势。
灵活性: Prophet模型可以相对容易地调整和优化。用户可以根据问题的特定要求调整参数、添加节假日效应或其他特殊事件,以提高模型性能。
import pandas as pd from fbprophet import Prophet from fbprophet.diagnostics import cross_validation, performance_metrics from fbprophet.plot import plot_cross_validation_metric, plot_components import matplotlib.pyplot as plt # 1. 数据加载和准备 df = pd.read_csv("your_data.csv") df.columns = ['ds', 'y_count', 'y_area'] # 2. 创建并拟合Prophet模型(数量) model_count = Prophet(yearly_seasonality=True) model_count.fit(df[['ds', 'y_count']]) # 3. 生成未来时间点(数量) future_count = model_count.make_future_dataframe(periods=365) # 365天的未来时间点 # 4. 进行预测(数量) forecast_count = model_count.predict(future_count) # 5. 创建并拟合Prophet模型(面积) model_area = Prophet(yearly_seasonality=True) model_area.fit(df[['ds', 'y_area']]) # 6. 生成未来时间点(面积) future_area = model_area.make_future_dataframe(periods=365) # 365天的未来时间点 # 7. 进行预测(面积) forecast_area = model_area.predict(future_area) # 8. 结果解释和可视化(数量) fig_count = model_count.plot(forecast_count) plt.title('Sunspot Count Forecast') plt.show() # 结果解释和可视化(面积) fig_area = model_area.plot(forecast_area) plt.title('Sunspot Area Forecast') plt.show() # 9. 交叉验证和性能评估 df_cv_count = cross_validation(model_count, initial='730 days', period='180 days', horizon='365 days') df_cv_area = cross_validation(model_area, initial='730 days', #见完整版
更多内容可以点击下方名片详细了解,让小鹿学长带你冲刺认证杯夺奖之路!
敬请期待我们的努力所做出的工作!记得关注 鹿鹿学长 呀
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。