2023年认证杯小美赛(A题):太阳黑子预测 | 建模解析,鹿鹿学长带队指引全文章代码思路

我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~
让我们来看看认证杯的A题!
在这里插入图片描述
完整内容可以在文章末尾领取!

题目重述

问题A(MCM):太阳黑子预测

太阳黑子是太阳光球上的一种现象,呈现为暂时比周围区域更暗的斑点。这些斑点是由于磁通量浓集导致的表面温度降低,从而抑制了对流。太阳黑子通常出现在活跃区域,通常成对出现,具有相反的磁性。它们的数量随着大约11年的太阳周期而变化。每个太阳黑子或太阳黑子群可能持续几天到几个月,然后最终衰减。太阳黑子在太阳表面移动时会扩张和收缩,直径范围从16公里(10英里)[1]到160,000公里(100,000英里)。一些较大的太阳黑子甚至可以在没有望远镜的情况下从地球上看到[2]。它们在首次出现时可能以相对速度,或正确运动的方式,移动几百米每秒。

太阳周期通常持续约11年,其长度从略低于10年到略高于12年不等。周期内太阳黑子活动的最高点被称为太阳最大值,最低点被称为太阳最小值。这一周期也影响到其他太阳活动,并与太阳磁场变极性有关。

太阳黑子数目也在较长时期内发生变化。例如,在1900年到1958年的现代最大值时期,太阳黑子计数呈上升趋势;而在随后的60年中,趋势主要是下降的[3]。总体而言,太阳上次活跃到现代最大值状态是在8000多年前[4]。

由于太阳黑子与其他太阳活动的相关性,它们可用于帮助预测太空天气、电离层状态以及与短波无线电传播或卫星通信相关的条件。尽管已经使用基于时间序列分析、谱分析和神经网络的多个模型来预测太阳黑子活动,但通常结果不佳。这可能与大多数预测模型在数据层面上是现象学的事实有关。虽然我们通常知道太阳活动周期的长度,但该周期并不完全稳定,活动的最大强度随时间变化,峰值的时间和持续时间难以准确预测。

我们的任务是预测太阳黑子,并通常需要将结果以月度为基础进行平均。您和您的团队被要求开发合理的数学模型,以尽可能可信地预测太阳黑子。相关的观测数据可在许多天文台以及空间科学研究机构公开获取,包括历史太阳黑子数量、太阳黑子区域以及可能相关的其他指标的观测。

具体任务包括

  1. 请预测当前太阳周期和下一个太阳周期的开始和结束时间;
  2. 请预测下一个太阳周期太阳最大值的发生时间和持续时间;
  3. 预测当前太阳周期和下一个太阳周期的太阳黑子数量和面积,并在您的论文中解释模型的可靠性。

问题一

使用Prophet来解决太阳黑子周期性预测问题。
Prophet是由Facebook开发的开源时间序列预测工具,旨在简化时间序列数据的预测过程。Prophet特别适用于具有季节性和节假日效应的数据,例如销售数据、气象数据等。以下是Prophet的一些关键特点和使用方面的优势:

  1. 季节性和节假日模型: Prophet能够自动处理强烈的季节性和节假日效应,使其特别适用于包含这些特征的时间序列数据。用户可以通过添加自定义的节假日效应来提高模型的准确性。

  2. 处理缺失数据: Prophet能够有效处理数据中的缺失值,这对于实际应用中常见的问题是很有帮助的。

  3. 可解释性: Prophet生成可解释性强的模型,提供了有关趋势、季节性和节假日效应的详细信息。这使得用户能够理解模型是如何做出预测的。

  4. 快速建模: Prophet的使用相对简单,无需用户深入了解复杂的时间序列建模技术。这使得即便是不具备专业背景的用户也能够快速上手。

  5. 柔性趋势模型: Prophet采用了灵活的趋势模型,能够适应不同时间段内数据的变化。用户可以根据实际情况选择添加或移除趋势成分。

  6. 可视化工具: Prophet提供了用于可视化预测结果的丰富工具,包括趋势、季节性分量和不确定性界限的图表。

  7. 开源和灵活性: Prophet是一个开源工具,用户可以自由地使用和修改它,根据自己的需求进行扩展和调整。

Prophet的主要目标是通过提供简单而强大的时间序列预测工具,使更多的人能够有效地进行时间序列分析和预测。它的设计理念是使时间序列建模变得更加直观和易于理解,从而降低了入门门槛,使更广泛的用户能够从中受益。

建模思路

  1. 安装Prophet: 首先,确保您已经安装了Prophet。您可以使用以下命令通过pip安装:

    pip install prophet
    
  2. 导入必要的库: 在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
    
  3. 准备数据: 将历史太阳黑子活动数据准备成Prophet所需的格式,包括"ds"(日期时间戳)和"y"(目标值):

    # 假设df是您的数据框,包含日期和太阳黑子计数
    df = pd.read_csv("your_data.csv")
    df.columns = ['ds', 'y']
    
  4. 创建并拟合Prophet模型: 使用Prophet创建模型并拟合训练数据:

    model = Prophet()
    model.fit(df)
    
  5. 生成未来时间点: 生成要进行预测的未来时间点:

    future = model.make_future_dataframe(periods=365)  # 365天的未来时间点
    
  6. 进行预测: 使用模型进行预测:

    forecast = model.predict(future)
    
  7. 模型性能评估: 使用交叉验证来评估模型性能,计算均方根误差(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是要预测的未来天数。

  8. 可视化结果: 使用Prophet提供的可视化工具查看预测结果:

    fig = model.plot(forecast)
    plt.show()
    

问题二

当使用Prophet进行太阳最大值的发生时间和持续时间预测时,可以采用以下的建模思路:

  1. 数据加载和准备:

    • 将历史太阳黑子计数数据加载到Pandas数据框中,确保数据包含日期时间戳(‘ds’)和目标值(‘y’,太阳黑子计数)。
    • 探索性数据分析(EDA):可视化历史数据,了解太阳黑子计数的趋势、季节性和其他特征。
  2. 添加节假日效应:

    • 根据太阳最大值的周期性,添加适当的节假日效应。太阳周期通常与11年的Schwabe周期相关,可以通过在模型中添加自定义节假日来捕捉这一特征。
  3. 创建并拟合Prophet模型:

    • 初始化Prophet模型,根据需要设置一些参数,例如yearly_seasonality,以考虑年度季节性。
    • 使用历史数据拟合模型。
  4. 生成未来时间点:

    • 使用make_future_dataframe函数生成未来一段时间的时间点,以进行预测。这段时间应包括太阳最大值的预测期。
  5. 进行预测:

    • 使用拟合好的模型进行未来太阳黑子计数的预测。Prophet会为每个时间点提供预测值,包括太阳最大值的发生时间和预测的太阳黑子计数。
  6. 结果解释和可视化:

    • 分析Prophet生成的预测结果,关注太阳最大值的发生时间和持续时间。
    • 使用可视化工具将预测结果可视化,包括历史数据、预测值和不确定性界限。
  7. 模型评估:

    • 对模型进行评估,使用交叉验证等技术来检验太阳最大值的预测准确性。
  8. 调整模型和参数:

    • 根据模型评估的结果,调整模型的参数以及添加或修改节假日效应,以提高预测准确性。
  9. 生成论文或报告:

    • 在报告或论文中解释模型的预测结果,包括发生时间和持续时间的估计。讨论模型的可靠性、优势和可能的局限性。

以下是基于上述思路的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模型来预测数量和面积:

1. 数据收集和准备:

  • 收集包含太阳黑子数量和面积的历史数据,确保数据包含日期时间戳(‘ds’)、太阳黑子数量(‘y_count’)和太阳黑子面积(‘y_area’)。
  • 探索性数据分析(EDA):可视化历史数据,了解太阳黑子数量和面积的趋势、季节性和其他特征。

2. 特征工程:

  • 如果存在其他相关特征(例如太阳辐射、太阳活动指数等),考虑将这些特征添加到模型中以提高预测性能。

3. 创建并拟合Prophet模型(数量):

  • 使用Prophet初始化模型,设置yearly_seasonality为True,以考虑年度季节性。
  • 根据需要,添加任何自定义节假日效应,如与太阳活动周期相关的特殊日期。
  • 拟合模型使用历史太阳黑子数量数据。

4. 生成未来时间点(数量):

  • 使用make_future_dataframe函数生成未来时间点。

5. 进行数量的预测:

  • 使用拟合好的数量模型进行太阳黑子数量的预测。

6. 创建并拟合Prophet模型(面积):

  • 重复步骤3-5,但这次使用太阳黑子面积数据。

7. 结果解释和可视化:

  • 分析Prophet生成的预测结果,关注太阳周期的黑子数量和面积。
  • 使用可视化工具将历史数据、预测值和不确定性界限可视化。
  • 可以使用plot_components函数查看趋势、季节性等组件。

8. 模型评估:

  • 使用交叉验证等技术对两个模型进行评估。
  • 关注太阳黑子数量和面积的预测准确性。

9. 生成论文或报告:

  • 在报告或论文中解释模型的预测结果,包括太阳周期的黑子数量和面积的估计。
  • 讨论模型的可靠性、优势和可能的局限性。

10. 总结:

  • 总结两个模型的预测结果,提及模型在预测太阳黑子数量和面积方面的性能和可靠性。
  • 强调模型在太阳活动周期预测方面的潜在应用和贡献。

模型的可行性

模型的可行性是指模型在解决问题上的适用性和有效性。对于太阳黑子数量和面积的预测问题,Prophet模型具有一些特性和优势,从而提高了其可行性:

  1. 处理季节性和周期性: Prophet模型专门设计用于处理具有季节性和周期性的时间序列数据。由于太阳黑子数量和面积与太阳活动周期相关,Prophet的内置季节性分析有助于更好地捕捉这些周期性变化。

  2. 考虑特殊日期和节假日效应: 通过允许用户自定义节假日效应,Prophet模型可以灵活地应对特殊日期对太阳黑子活动的影响。这对于太阳活动周期中的特殊事件(如太阳风暴)的预测具有重要意义。

  3. 处理缺失数据和异常值: Prophet能够处理数据中的缺失值,并且对于一些异常值也具有一定的鲁棒性。这在实际数据中很常见,因为观测太阳黑子可能受到观测设备或其他因素的影响。

  4. 可解释性: Prophet生成的预测结果包括趋势、季节性和其他组件,这有助于对模型的预测结果进行解释。这对于太阳活动研究者和预测应用中的决策制定者来说是一个重要的优势。

  5. 灵活性: 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', #见完整版

更多内容可以点击下方名片详细了解,让小鹿学长带你冲刺认证杯夺奖之路!
敬请期待我们的努力所做出的工作!记得关注 鹿鹿学长

  • 35
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值