半导体数据分析:GPR算法小白入门(一)

该文章已生成可运行项目,

前面我们一起学习了一些基本的数据分析概念和方法(特别是半导体数据分析应用中的需求),这次我们一起来了解一种新的算法GPR。需要说明的是GPR早在20世纪就有了理论基础,但是随着近期ai的兴起,基于其独特优势(尤其是不确定性估计)和 AI 优化需求的增长,最近又成了热门选择。

概念:

GPR(Gaussian Process Regression,高斯过程回归)是一种基于高斯过程的非参数机器学习算法,主要用于回归任务。它通过建模数据点的联合高斯分布来预测连续目标变量,广泛应用于机器学习、信号处理和统计建模等领域。

核心原理:

GPR 假设目标函数 ( f(x) ) 的值服从高斯过程(Gaussian Process, GP),即任意有限个输入点对应的函数值服从多元高斯分布。高斯过程由以下两个部分定义:

  1. 均值函数 ( m(x) ):描述函数的期望值,通常假设为 0(可以根据问题调整)。
  2. 协方差函数(或核函数)( k(x, x') ):描述数据点之间的相关性,常用的核函数包括径向基函数(RBF核)、指数核等。

GPR 的预测基于训练数据的条件分布,通过贝叶斯推理计算新输入点的预测值及其 uncertainty(不确定性)。

初步理解:

高斯过程回归(GPR)就像一个超级聪明的“曲线画手”,用来预测数据趋势。它不假设数据是直线还是某种固定形状,而是通过观察已有数据,画出一条最合适的曲线,还能告诉你这条曲线有多可信(用“置信区间”表示不确定性)。


想象你在玩“连点成线”的游戏,给你几个点,GPR 不仅帮你画一条平滑的线,还会说:“这条线在这儿很准,但那儿有点不确定,可能上下浮动一点。”它的核心特点是:

  • 灵活:适合各种复杂数据,不用提前猜形状。
  • 带不确定性:告诉你预测有多靠谱。
  • 适合小数据:数据少也能干活。

用在哪儿?
预测气温、股价、优化机器学习模型参数等,尤其适合数据少但需要高精度的场景。

废话不多说,为了理解GPR ,我们先上一段代码来生成一张图,用这张图,我们来直观理解什么是GPR。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF

# 设置中文字体,解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 1. 生成数据(减少噪声,增加点数)
np.random.seed(0)
X = np.linspace(-3, 3, 8).reshape(-1, 1)  # 增加到 8 个点,范围更广
y = X**2 + np.random.normal(0, 0.1, X.shape)  # 噪声从 0.2 降到 0.1

# 2. 创建 GPR 模型(显式设置噪声参数)
kernel = RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e2))  # 允许优化 length_scale
gpr = GaussianProcessRegressor(kernel=kernel, alpha=0.1, n_restarts_optimizer=10)  # 设置噪声,优化核

# 3. 训练模型
gpr.fit(X, y.ravel())

# 4. 预测更多点,画出曲线
X_test = np.linspace(-3, 3, 100).reshape(-1, 1)  # 测试点
y_pred, sigma = gpr.predict(X_test, return_std=True)  # 预测值和不确定性

# 5. 画图展示
plt.figure(figsize=(6, 4))
plt.scatter(X, y, c='red', label='数据点')  # 原始点
plt.plot(X_test, X_test**2, 'k--', label='真实曲线')  # 真实抛物线
plt.plot(X_test, y_pred, 'b-', label='GPR预测')  # GPR预测曲线
plt.fill_between(X_test.ravel(), y_pred - 1.96 * sigma, y_pred + 1.96 * sigma,
                 alpha=0.3, color='blue', label='可信区间')  # 不确定性区域
plt.xlabel('X')
plt.ylabel('y')
plt.title('GPR: 画曲线并告诉你可信度')
plt.legend()
plt.show()

# 打印数据点和优化后的核参数
print("X:", X.ravel())
print("y (with noise):", y.ravel())
print("True y (x^2):", X.ravel()**2)
print("Optimized kernel:", gpr.kernel_)

上述代码可以直接生成这样图:

在这张图中,我们看到了四个概念:数据点 真实取消 GPR预测 和可信区间。我们来看一下它们分别代表了什么意义:

1. 数据点(红点)含义:
这些是你的“已知信息”,就像你在纸上标记的几个点。比如在 demo 中,我们有 5 个点(x = -2, -1, 0, 1, 2),它们的 y 值是大致按抛物线(y = x²)来的,但有点“抖动”(噪声),模拟现实中不完美的数据。通俗来说:
红点是你实际测量的“线索”,比如测了 5 天的气温,或者实验中的 5 个结果。它们是 GPR 画曲线的起点。

2. 真实曲线(黑色虚线)含义:
这是数据的“真实规律”,也就是如果没有噪声,数据应该完全符合的曲线。在 demo 中,真实曲线是 y = x²,一个完美的抛物线。通俗来说:
黑色虚线是“正确答案”,就像你想知道的气温变化规律,但现实中你只能通过带噪声的红点去猜这个规律。真实曲线通常是未知的,我们用它来对比 GPR 的预测效果。

3. GPR 预测曲线(蓝色实线)含义:
这是 GPR(高斯过程回归)根据红点“猜”出来的曲线。它像一个聪明的画手,看了 5 个红点后,尽量画一条平滑的曲线来拟合数据,同时预测其他地方的趋势。通俗来说:
蓝色实线是 GPR 的“最佳猜测”,它试图把红点连起来,并且猜出没有红点的地方(比如 x = -3 或 x = 3)应该是什么样。它会尽量贴近真实曲线,但因为只有几个红点,它可能不完全准确。

4. 可信区间(蓝色阴影)含义:
这是 GPR 告诉你它的预测有多“靠谱”的范围。阴影区域覆盖了 95% 的可能性,意味着真实值大概率落在这个范围内。阴影窄的地方,GPR 很自信;阴影宽的地方,GPR 不太确定。通俗来说:
蓝色阴影就像 GPR 在说:“我预测的曲线是蓝线,但我不完全确定,真实曲线可能在这个阴影范围内晃悠。” 在红点附近,阴影窄(因为有数据支持,GPR 很确定);远离红点的地方,阴影宽(因为没数据,GPR 不敢打包票)。

好了 通过上面的图文解释,我们大致了解了什么是GPR 以及它能做些什么。那么 学习GPR需要一些什么样的数学基础呢?

想学习和理解高斯过程回归(GPR),我们不需要成为数学专家,但掌握一些基础的数学和统计概念会让学习过程更顺畅。

学习 GPR 需要的数学基础

GPR 涉及概率、统计和线性代数的一些概念,但我们可以从基础开始,逐步深入。以下是关键的数学知识点,以及它们在 GPR 中的作用:

1. 基础代数和函数(初高中数学水平)

  • 需要什么:
    • 理解函数的概念,比如 y = x²(抛物线)或 y = sin(x)。
    • 基本的代数运算:加减乘除、矩阵的概念(不需要深入)。
  • 在 GPR 中做什么:
    • GPR 用函数(比如核函数)描述数据点之间的关系,比如 demo 中的抛物线。
    • 矩阵运算用于计算预测值和可信区间(但工具库如 scikit-learn 帮你处理了这些)。
  • 通俗解释: 就像你在图上画点和曲线,GPR 自动帮你找一个“合适的函数”连起来。你只需要知道函数是大致什么形状(直线、曲线等),不用自己算。
  • 如何学习:
    • 如果你熟悉 y = mx + b(直线)或 y = x²(抛物线),就够用了。
    • 复习初高中数学的函数部分(比如 Khan Academy 的免费视频)。
    • 不需要深入矩阵运算,了解矩阵是个“表格”就行,代码会搞定复杂计算。

2. 概率与统计基础(入门级)

  • 需要什么:
    • 均值(平均值):数据点的“中心”。
    • 方差/标准差:数据点的“分散程度”。
    • 正态分布(高斯分布):类似“钟形曲线”,描述数据分布的形状。
    • 概率概念:比如“95% 概率”的意思。
  • 在 GPR 中做什么:
    • GPR 假设数据服从高斯分布(正态分布),用均值预测曲线,用方差计算可信区间(demo 中的蓝色阴影)。
    • 比如,demo 的可信区间是“均值 ± 1.96 × 标准差”,表示 95% 的概率范围。
  • 通俗解释: 就像你预测明天会下雨的概率,GPR 说:“我猜 y 值是这个数(均值),大概率在这个范围内(阴影)。” 你只需要懂“平均”和“分散”是什么。
  • 如何学习:
    • 看简单的统计学入门视频(比如 YouTube 上的 StatQuest,讲解正态分布)。
    • 理解均值(平均成绩)、标准差(成绩波动大小)就够。
    • 不用深入概率公式,记住正态分布是“钟形曲线”即可。

3. 核函数的基本概念(直观理解)

  • 需要什么:
    • 知道核函数是用来衡量“数据点之间的相似性”的工具。
    • 理解参数(如 demo 中的 length_scale)会影响曲线的“平滑度”。
  • 在 GPR 中做什么:
    • 核函数(比如 RBF)决定 GPR 画的曲线有多“平滑”或“波动”。比如 demo 中,length_scale=1.0 让曲线适度平滑。
  • 通俗解释: 核函数就像个“尺子”,量两个点有多“像”。点越近,曲线越相关。你不用懂数学公式,只要知道调参数能让曲线更平或更弯就行。
  • 如何学习:
    • 不需要学核函数的数学定义,跑 demo 代码,试着改 length_scale(比如 0.5 或 5),看图变化。
    • 如果想深入,查阅 scikit-learn 文档中 RBF 核的解释(简单直观)。

4. 贝叶斯思想(概念性理解)

  • 需要什么:
    • 了解贝叶斯方法是用“已有数据”更新“猜测”的过程。
    • 比如,GPR 用红点(数据)更新对曲线的猜测(预测和可信区间)。
  • 在 GPR 中做什么:
    • GPR 是贝叶斯方法,用数据点(红点)推测整个曲线(蓝色线)和不确定性(阴影)。
  • 通俗解释: 就像你根据朋友的几句话猜他的心情,GPR 根据几个点猜整条曲线,还告诉你猜得有多准。你不用懂贝叶斯公式,只需知道“数据多 → 猜得准”。
  • 如何学习:
    • 看贝叶斯定理的简单介绍(比如 3Blue1Brown 的 YouTube 视频)。
    • 重点理解“用新信息更新猜测”的概念,不用背公式。

数学小白如何轻松学 GPR

我们不需要一下子掌握所有数学,以下是适合小白的学习路径:

  1. 从 demo 入手:
    • 继续跑之前提供的代码(原始或改进版),改改参数(比如 length_scale 或 alpha),看图怎么变。
    • 比如,增加数据点(从 8 个改到 12 个),或调大噪声(0.1 改成 0.3),直观感受数学的影响。
  2. 补基础:
    • 函数:复习 Khan Academy 的“函数与图像”部分(1-2 小时)。
    • 统计:看 StatQuest 的“均值、方差、正态分布”视频(每段 5-10 分钟)。
    • 贝叶斯:看 3Blue1Brown 的“Bayes Theorem”视频(15 分钟)。
  3. 用工具跳过复杂计算:
    • GPR 的数学(矩阵运算、概率推导)都由 Python 库(如 scikit-learn)处理了。你只需要会跑代码,理解输入(红点)和输出(曲线、阴影)。
    • 比如,demo 代码的 gpr.fit 和 gpr.predict 自动完成矩阵运算和概率计算。
  4. 关注直观概念:
    • 记住 GPR 的核心:用数据点猜曲线,给出可信度。
    • 重点理解图里的红点(数据)、蓝色线(猜测)、阴影(可信度),数学细节可以慢慢学。

需要多深的数学?

  • 入门级(够用):初高中代数(函数、方程)、基本统计(均值、方差、正态分布)。能看懂 demo 图,跑代码调参数。
  • 进阶级(深入理解):线性代数(矩阵基础)、概率论(高斯分布、贝叶斯公式)。能看懂 GPR 的公式(如预测均值和方差)。
  • 专家级(开发新模型):多元高斯分布、核函数设计、优化算法。适合想深入研究 GPR 理论的人。

作为数学小白,入门级就够你使用 GPR 了!比如,跑 demo、调参数、看图,已经能解决很多实际问题(像预测气温或优化参数)。


推荐学习资源(适合小白)

  1. 函数和代数:
    • Khan Academy(免费):搜索“Functions”或“Algebra Basics”。
  2. 统计和概率:
    • StatQuest YouTube 频道:看“Mean, Variance, Standard Deviation”和“Normal Distribution”(短视频,超直观)。
  3. 贝叶斯思想:
    • 3Blue1Brown YouTube 视频:搜索“Bayes Theorem”,用动画解释概率更新。
  4. GPR 实践:
    • Scikit-learn 文档:搜索 GaussianProcessRegressor,看示例代码。
    • 跑之前的 demo,改数据点、噪声、核参数,观察图的变化。

下面我们用一个最简单的案例来复习一下这次我们学习的 :GPR:天气预测

GPR:天气预测

这次我们在代码中增加了一些便于理解的注释,我们可以根据这些注释来进行调参(ai界谓之:炼丹)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel, ExpSineSquared

# 1. 模拟气温数据(10 天,带线性趋势和周期性)
np.random.seed(0)  # 固定随机种子,让每次运行结果一样,方便对比
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)  # 10天的数据点(天数)
# y = 基础温度(20°C) + 线性趋势(每天升0.5°C) + 周期波动(每周7天循环,幅度2°C) + 随机噪声
y = 20 + 0.5 * X.ravel() + 2 * np.sin(X.ravel() * 2 * np.pi / 7) + np.random.normal(0, 0.2, 10)

# 【关键参数1:数据生成】
# - 基础温度(20):改成其他值(如15),整体温度会上/下移
# - 线性趋势(0.5):改大(如1.0),气温上升更快;改小(如0),更平坦
# - 周期幅度(2):改大(如4),波动更明显;改小(如1),波动更平滑
# - 周期长度(7):改成其他值(如3),模拟不同周期(如每天波动)
# - 噪声(0.2):改大(如0.5),红点更“乱”;改小(如0.1),红点更贴近趋势
# 试试:y = 15 + 1.0 * X.ravel() + 1 * np.sin(X.ravel() * 2 * np.pi / 3) + np.random.normal(0, 0.1, 10)

# 2. 定义 GPR 模型(组合核:RBF + 周期核)
kernel = ConstantKernel(1.0, (1e-3, 1e3)) * RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e2)) + \
         ExpSineSquared(length_scale=1.0, periodicity=7.0)
# ConstantKernel:控制曲线的“高度”(幅度),(1e-3, 1e3)允许自动调整
# RBF:控制曲线的“平滑度”,length_scale=1.0是初始猜测,bounds=(1e-2, 1e2)允许优化
# ExpSineSquared:捕捉周期性,periodicity=7.0模拟每周波动,length_scale控制周期强度
gpr = GaussianProcessRegressor(kernel=kernel, alpha=0.2, n_restarts_optimizer=10, random_state=0)
# alpha=0.2:假设数据有噪声,越大越认为数据“不靠谱”,曲线更平滑
# n_restarts_optimizer=10:多试几次优化,找到最好的核参数
# random_state=0:固定随机种子,结果可复现

# 【关键参数2:核函数和模型参数】
# - ConstantKernel(1.0, (1e-3, 1e3)):改范围(如(1e-2, 1e2)),影响曲线幅度
# - RBF(length_scale=1.0):改大(如5.0),曲线更平滑;改小(如0.5),更波动
# - ExpSineSquared(periodicity=7.0):改周期(如3.0),模拟不同波动频率
# - alpha=0.2:改大(如0.5),曲线更平滑但可能偏离红点;改小(如0.05),更贴红点但可能过拟合
# - n_restarts_optimizer=10:改大(如20),优化更彻底但计算慢;改小(如5),更快但可能不准
# 试试:kernel = ConstantKernel(1.0, (1e-2, 1e2)) * RBF(length_scale=2.0)(去掉周期核)
# 或者:alpha=0.5,n_restarts_optimizer=5

# 3. 训练模型
gpr.fit(X, y)  # 用红点(X, y)教 GPR 学数据的规律

# 4. 预测未来 3 天(第 11、12、13 天)
X_test = np.linspace(1, 13, 100).reshape(-1, 1)  # 从第1天到13天,画平滑曲线
y_pred, sigma = gpr.predict(X_test, return_std=True)  # 预测温度(y_pred)和不确定性(sigma)

# 【关键参数3:预测范围】
# - X_test:改范围(如np.linspace(1, 15, 100)),预测更远(如到15天),但不确定性会增加
# 试试:X_test = np.linspace(1, 15, 100).reshape(-1, 1)

# 5. 可视化
plt.figure(figsize=(8, 6))  # 创建一个8x6英寸的图
plt.scatter(X, y, c='red', label='Observed temperatures')  # 红点:观测到的气温
plt.plot(X_test, y_pred, 'b-', label='GPR prediction')  # 蓝线:GPR预测的曲线
plt.fill_between(X_test.ravel(), y_pred - 1.96 * sigma, y_pred + 1.96 * sigma, 
                 alpha=0.2, color='blue', label='95% confidence interval')  # 蓝色阴影:预测的可信范围
plt.xlabel('Day')  # x轴:天数
plt.ylabel('Temperature (°C)')  # y轴:温度
plt.title('Improved Temperature Prediction with GPR')  # 标题
plt.legend()  # 显示图例
plt.show()  # 展示图片

# 6. 打印数据和优化结果,帮助理解
print("X (days):", X.ravel())  # 打印天数
print("Observed y (temperatures):", y)  # 打印观测气温
print("Optimized kernel:", gpr.kernel_)  # 打印优化后的核参数,告诉你GPR“学”到了什么

运行结果后,是这样的结果:

我们发现,运行代码后,温度预测的可信区间(蓝色阴影)在未来几天(比如第 11-13 天)呈“喇叭状”,即随着时间增加,阴影越来越宽。这是因为 GPR(高斯过程回归)在远离训练数据点的地方不确定性增加。

为什么可信区间呈喇叭状?

GPR 就像一个“猜画师”,用已知的红点(第 1-10 天的气温)画预测曲线(蓝线)和可信区间(阴影)。在红点附近(第 1-10 天),它很有信心,阴影窄;但到未来(第 11-13 天),没有红点提供线索,它越来越不确定,阴影就变宽,像“喇叭”一样张开。数学原因(简单版):

  • GPR 的可信区间由标准差(sigma)决定,标准差反映预测的不确定性。
  • 在训练数据(红点)附近,GPR 有很多信息,标准差小,阴影窄。
  • 在远离训练数据的未来(第 11-13 天),GPR 缺乏信息,标准差变大,阴影变宽,形成喇叭状。
  • 核函数(比如 RBF 和 ExpSineSquared)决定了数据点的影响范围。如果核的 length_scale 较小,影响范围短,未来预测的不确定性会迅速增加。

如何避免或减小喇叭状可信区间?

要让可信区间不那么“喇叭状”,我们需要让 GPR 在未来预测时更“自信”,或者限制不确定性的增长。以下是几个简单方法,适合小白操作:

  1. 增加核函数的 length_scale:
    • 做什么:调大 RBF 核的 length_scale,让 GPR 认为数据点的“影响力”覆盖更远,未来预测更平滑,阴影变窄。
    • 通俗解释:给画师一支“粗画笔”,让它画得更稳,未来猜得更确定。
  2. 调整核函数的幅度(ConstantKernel):
    • 做什么:降低 ConstantKernel 的常数值,限制可信区间的宽度。
    • 通俗解释:告诉画师“别猜太离谱”,让阴影别张得太开。
  3. 添加更多训练数据:
    • 做什么:增加训练数据点(比如 14 天而非 10 天),让 GPR 有更多线索,未来预测更准。
    • 通俗解释:给画师更多“照片”,让他猜未来时更有底气。
  4. 限制预测范围:
    • 做什么:缩短预测时间(比如只预测到第 11 天,而不是第 13 天)。
    • 通俗解释:别让画师猜太远的未来,近一点的猜想更靠谱。

接下来我们根据上面的分析来更改天气预测demo的代码,重点调整 length_scale 和 ConstantKernel 来减小喇叭状可信区间:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, ConstantKernel, ExpSineSquared

# 1. 模拟气温数据(10 天,带线性趋势和周期性)
np.random.seed(0)  # 固定随机种子,结果可复现
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)  # 10 天数据
y = 20 + 0.5 * X.ravel() + 2 * np.sin(X.ravel() * 2 * np.pi / 7) + np.random.normal(0, 0.2, 10)  # 线性 + 周期 + 噪声

# 2. 定义 GPR 模型(调整核函数,减小喇叭状)
kernel = ConstantKernel(0.5, (1e-3, 1e1)) * RBF(length_scale=5.0, length_scale_bounds=(1e-1, 1e2)) + \
         ExpSineSquared(length_scale=1.0, periodicity=7.0, length_scale_bounds=(1e-1, 1e2))
# 改动说明:
# - ConstantKernel(0.5, (1e-3, 1e1)):降低常数(从 1.0 到 0.5),限制阴影宽度
# - RBF(length_scale=5.0):增大length_scale(从 1.0 到 5.0),让曲线更平滑,未来不确定性增长慢
# - ExpSineSquared:保持周期核,模拟每周波动
gpr = GaussianProcessRegressor(kernel=kernel, alpha=0.2, n_restarts_optimizer=10, random_state=0)
# alpha=0.2:保持噪声水平
# n_restarts_optimizer=10:多优化几次,确保核参数合适

# 3. 训练模型
gpr.fit(X, y)  # 用数据教 GPR 学规律

# 4. 预测未来 3 天(第 11、12、13 天)
X_test = np.linspace(1, 13, 100).reshape(-1, 1)  # 从第1天到13天
y_pred, sigma = gpr.predict(X_test, return_std=True)  # 预测温度和不确定性

# 5. 可视化
plt.figure(figsize=(8, 6))
plt.scatter(X, y, c='red', label='Observed temperatures')  # 红点:观测气温
plt.plot(X_test, y_pred, 'b-', label='GPR prediction')  # 蓝线:预测曲线
plt.fill_between(X_test.ravel(), y_pred - 1.96 * sigma, y_pred + 1.96 * sigma, 
                 alpha=0.2, color='blue', label='95% confidence interval')  # 阴影:可信区间
plt.xlabel('Day')
plt.ylabel('Temperature (°C)')
plt.title('Temperature Prediction with Reduced Confidence Interval Flare')
plt.legend()
plt.show()

# 6. 打印数据和核参数
print("X (days):", X.ravel())
print("Observed y (temperatures):", y)
print("Optimized kernel:", gpr.kernel_)

运行结果如下:

很明显,模型对于未来天气的预测收口变小了,明显小于第一次的预测。说明我们的炼丹起作用了,但是这个预测是否准确,目前还难以断定。我们今后来慢慢学习如何通过GPR更准确的预测数据趋势以及扩展它的应用场景。

好了 今天我们学习了GPR算法入门,就是简单了解概念,直观看一下demo。今后有时间我们继续。感谢你阅读本文!别忘了关注点赞收藏哦!

本文章已经生成可运行项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值