理解构建随机数据集用于生成多个函数的一个数学模型GRF(Gaussian Random Field,高斯随机场)

发布于:2024-12-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

这里举个论文中例子 

tips:f1和f2是论文中的用GRF采样的函数

详细解释GRF以及最后的代码解释

代码实现如下:

import numpy as np
import matplotlib.pyplot as plt

"""
五个函数,每个函数100个点表示
GRF 样本的形状: (100, 5)
"""


# 定义高斯核(RBF核)函数
def rbf_kernel(x1, x2, length_scale=0.2):
    return np.exp(-np.linalg.norm(x1 - x2) ** 2 / (2 * length_scale ** 2))


# 生成协方差矩阵K
def covariance_matrix(x, length_scale=0.2):
    n = len(x)
    K = np.zeros((n, n))
    for i in range(n):
        for j in range(n):  # Kij=kl(xi,xj)
            K[i, j] = rbf_kernel(x[i], x[j], length_scale)
    return K


# 高斯随机场采样
def sample_grf(x, num_samples=5, length_scale=0.2):
    K = covariance_matrix(x, length_scale)
    L = np.linalg.cholesky(K + 1e-6 * np.eye(len(x)))  # 稳定性调整
    samples = np.dot(L, np.random.randn(len(x), num_samples))  # 生成多元高斯分布样本
    return samples


"""
# 高斯过程采样的步骤
    给定一组离散的 x 点(例如,100个均匀分布在 [0,1] 区间内的点)。
    计算协方差矩阵 K,其中 Kij=kl(xi,xj)。
    通过多元高斯分布采样得到随机函数 f。
"""

# 参数设置,100个均匀分布在 [0,1] 区间内的点
num_points = 100  # 空间/时间点的数量。
x = np.linspace(0, 1, num_points).reshape(-1, 1)  # 定义 100 个等距点

num_samples = 5  # 采样的函数数量,也就是五个函数,每个函数100个点表示
length_scale = 0.2  # 高斯核的长度尺度

# 采样高斯随机场
# 输入采样点x,函数数量num_samples,l高斯核的长度尺度length_scale
grf_samples = sample_grf(x, num_samples, length_scale)

# 输出形状
print("GRF 样本的形状:", grf_samples.shape)

# 绘制结果
plt.figure(figsize=(8, 6))
for i in range(num_samples):
    plt.plot(x, grf_samples[:, i], label=f"Sample {i + 1}")
plt.title("Samples from Gaussian Random Field")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.legend()
plt.show()

输出如下: 

其中100个采样点和最终采样的5个函数分别为x和grf_samples变量 

 


网站公告

今日签到

点亮在社区的每一天
去签到