高斯扩散模型_使用python+sklearn实现对Mauna Loa CO2数据集进行高斯过程回归

本示例基于“用于机器学习的高斯过程”的第5.4.3节[RW2006],给出了一个基于对数边缘似然(log-marginal-likelihood.)梯度上升的复杂核工程和超参数优化的实例。本数据集的数据包括了1958年至2001年在夏威夷莫纳洛亚天文台(Mauna Loa Observatory)收集到的月平均大气二氧化碳(CO2)浓度(百万分之一体积(ppmv)),目的是模拟二氧化碳浓度随时间t的变化。 内核由几个特征组成,这些特征负责解释信号的不同属性:
  • 径向基函数核(RBF kernel)可以解释长期平稳上升的趋势。RBF核具有较大的长度范围(length-scale),它强制使该分量平滑,而不是强制使趋势上升,这就把选择权留给了GP。特定的长度范围(length-scale)和振幅(amplitude)是自由超参数。
  • 季节分量(seasonal component),用周期为1年的周期性 ExpSineSquared 内核来解释。控制其平滑度的周期分量(periodic component)的长度范围是一个自由参数。为了使衰减(decaying)远离精确的周期性,采用带RBF核的乘积,该RBF分量的长度范围控制衰减时间,其是另一个自由参数。
  • 较小的中期不规则性将由RationalQuadratic内核组件解释,其长度范围和alpha参数决定了长度范围的扩散性。 根据[RW2006]所述,与RBF内核组件相比,RationalQuadratic能更好地解释这些不规则现象,这可能是因为它可以容纳多个长度范围。
  • “噪声”,它了解释相关的噪声成分(例如本地天气现象)和WhiteKernel对白噪声(white noise)的影响。 相对振幅和RBF的长度标尺是自由参数。

减去目标均值后,最大化log-marginal-likelihood会产生以下内核,其LML为-83.214:

34.4**2 * RBF(length_scale=41.8)
+ 3.27**2 * RBF(length_scale=180) * ExpSineSquared(length_scale=1.44,
                                                   periodicity=1)
+ 0.446**2 * RationalQuadratic(alpha=17.7, length_scale=0.957)
+ 0.197**2 * RBF(length_scale=0.138) + WhiteKernel(noise_level=0.0336)

因此,大多数目标信号(34.4ppm)可以通过长期上升趋势(长度范围为41.8年)来解释。周期分量的振幅为3.27ppm,衰减时间为180年,长度范围为1.44。较长的衰减时间表明我们具有非常接近周期性的季节性成分。相关噪声的幅度为0.197ppm,长度范围为0.138年,白噪声贡献为0.197ppm,因此,总体噪声水平很小,这表明该模型可以很好地解释数据。图中还显示了该模型做出的预测非常可靠。

高斯扩散模型_使用python+sklearn实现对Mauna Loa CO2数据集进行高斯过程回归_第1张图片 sphx_glr_plot_gpr_co2_001

输出:

GPML kernel: 66**2 * RBF(length_scale=67) + 2.4**2 * RBF(length_scale=90) * ExpSineSquared(length_scale=1.3, periodicity=1) + 0.66**2 * RationalQuadratic(alpha=0.78, length_scale=1.2) + 0.18**2 * RBF(length_scale=0.134) + WhiteKernel(noise_level=0.0361)
Log-marginal-likelihood: -117.023

Learned kernel: 44.8**2 * RBF(length_scale=51.6) + 2.64**2 * RBF(length_scale=91.5) * ExpSineSquared(length_scale=1.48, periodicity=1) + 0.536**2 * RationalQuadratic(alpha=2.89, length_scale=0.968) + 0.188**2 * RBF(length_scale=0.122) + WhiteKernel(noise_level=0.0367)
Log-marginal-likelihood: -115.050
# 作者: Jan Hendrik Metzen 
#
# 许可证: BSD 3 clause


import numpy as np

from matplotlib import pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels \
    import RBF, WhiteKernel, RationalQuadratic, ExpSineSquared

print(__doc__)


def load_mauna_loa_atmospheric_co2():
    ml_data = fetch_openml(data_id=41187)
    months = []
    ppmv_sums = []
    counts = []

    y = ml_data.data[:, 0]
    m = ml_data.data[:, 1]
    month_float = y + (m - 1) / 12
    ppmvs = ml_data.target

    for month, ppmv in zip(month_float, ppmvs):
        if not months or month != months[-1]:
            months.append(month)
            ppmv_sums.append(ppmv)
            counts.append(1)
        else:
            # aggregate monthly sum to produce average
            ppmv_sums[-1] += ppmv
            counts[-1] += 1

    months = np.asarray(months).reshape(-1, 1)
    avg_ppmvs = np.asarray(ppmv_sums) / counts
    return months, avg_ppmvs


X, y = load_mauna_loa_atmospheric_co2()

k1 = 66.0**2 * RBF(length_scale=67.0)  # long term smooth rising trend
k2 = 2.4**2 * RBF(length_scale=90.0) \
    * ExpSineSquared(length_scale=1.3, periodicity=1.0)  # seasonal component
# medium term irregularity
k3 = 0.66**2 \
    * RationalQuadratic(length_scale=1.2, alpha=0.78)
k4 = 0.18**2 * RBF(length_scale=0.134) \
    + WhiteKernel(noise_level=0.19**2)  # noise terms
kernel_gpml = k1 + k2 + k3 + k4

gp = GaussianProcessRegressor(kernel=kernel_gpml, alpha=0,
                              optimizer=None, normalize_y=True)
gp.fit(X, y)

print("GPML kernel: %s" % gp.kernel_)
print("Log-marginal-likelihood: %.3f"
      % gp.log_marginal_likelihood(gp.kernel_.theta))

# 具有优化参数的Kernel
k1 = 50.0**2 * RBF(length_scale=50.0)  # long term smooth rising trend
k2 = 2.0**2 * RBF(length_scale=100.0) \
    * ExpSineSquared(length_scale=1.0, periodicity=1.0,
                     periodicity_bounds="fixed")  # seasonal component
# medium term irregularities
k3 = 0.5**2 * RationalQuadratic(length_scale=1.0, alpha=1.0)
k4 = 0.1**2 * RBF(length_scale=0.1) \
    + WhiteKernel(noise_level=0.1**2,
                  noise_level_bounds=(1e-3, np.inf))  # noise terms
kernel = k1 + k2 + k3 + k4

gp = GaussianProcessRegressor(kernel=kernel, alpha=0,
                              normalize_y=True)
gp.fit(X, y)

print("\nLearned kernel: %s" % gp.kernel_)
print("Log-marginal-likelihood: %.3f"
      % gp.log_marginal_likelihood(gp.kernel_.theta))

X_ = np.linspace(X.min(), X.max() + 30, 1000)[:, np.newaxis]
y_pred, y_std = gp.predict(X_, return_std=True)

# 图示
plt.scatter(X, y, c='k')
plt.plot(X_, y_pred)
plt.fill_between(X_[:, 0], y_pred - y_std, y_pred + y_std,
                 alpha=0.5, color='k')
plt.xlim(X_.min(), X_.max())
plt.xlabel("Year")
plt.ylabel(r"CO$_2$ in ppm")
plt.title(r"Atmospheric CO$_2$ concentration at Mauna Loa")
plt.tight_layout()
plt.show()

脚本的总运行时间: ( 0 分 5.806 秒)

估计的内存使用量: 37 MB

0c6868150cbc445d34cdd06bf01011b4.png下载python源代码: plot_gpr_co2.py

下载Jupyter notebook源代码: plot_gpr_co2.ipynb

Sphinx-Gallery生成的画廊 2c9643a5f846aaf7181bcc558d21f330.png ☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图: 高斯扩散模型_使用python+sklearn实现对Mauna Loa CO2数据集进行高斯过程回归_第2张图片 欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler,备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。) 高斯扩散模型_使用python+sklearn实现对Mauna Loa CO2数据集进行高斯过程回归_第3张图片

你可能感兴趣的:(高斯扩散模型)