高斯采样的仿真(python实现)

  • 英文版的原文
    Introduction to Gaussian Processes - Part I
  • 中文翻译版的原文
    图文详解高斯过程(一)——含代码

要点摘录(二维高斯函数)

1.为什么要用到高斯采样

  • 高斯采样是一种非参数化方法,相对于一般的参数化方法,不但可以为黑箱建模还可以为不确定性建模。

2.使用高斯函数产生样值点

  • 函数表达式
    f ∼ N ( μ , Σ ) f \sim N(\bold{\mu},\bold{\Sigma}) fN(μ,Σ)
    其中 μ = ( μ 1 , μ 2 , . . . , μ n ) \bold{\mu} = (\mu_1,\mu_2,...,\mu_n) μ=(μ1,μ2,...,μn) Σ = [ σ 11 σ 12 ⋯ σ 1 n σ 21 σ 22 ⋯ σ 2 n ⋮ ⋮ ⋱ ⋮ σ n 1 σ n 2 ⋯ σ n n ] \bold{\Sigma}=\left[ \begin{matrix} \sigma_{11} & \sigma_{12} & \dotsb & \sigma_{1n}\\ \sigma_{21} & \sigma_{22} & \dotsb & \sigma_{2n}\\ \vdots & \vdots & \ddots & \vdots\\ \sigma_{n1} & \sigma_{n2} & \dotsb & \sigma_{nn} \end{matrix} \right] Σ=σ11σ21σn1σ12σ22σn2σ1nσ2nσnn

  • 产生样值点 y = f ( x ) \bold{y} = f(\bold{x}) y=f(x) x = [ x 1 , x 2 , . . . , x n ] T \bold{x} = [x_1,x_2,...,x_n]^T x=[x1,x2,...,xn]T 表示需要采样的点的位置, y = [ y 1 , y 2 , . . . , y n ] T \bold{y}=[y_1,y_2,...,y_n]^T y=[y1,y2,...,yn]T 表示采样得到的值。

  • 参数说明:
    number_dot 采样点数,sample_scale 采样区设定,number_sample 设定样本曲线数,sigma 设定 σ \sigma σ 的值。

  • 主要代码:

    • sample_locate = np.linspace(sample_scale[0],sample_scale[1],number_dot) 选取采样点。
    • sample = np.random.multivariate_normal(np.zeros(number_dot),np.eye(number_dot),number_sample) 完成采样。
  • 采样结果:

    • 采样点 3 个,样本曲线 6 条,采样区间 [0,1],均值为 0 ,协方差矩阵为单位阵。
高斯采样的仿真(python实现)_第1张图片
  • 采样点 30 个,样本曲线 6 条,采样区间 [0,1],均值为 0 ,协方差矩阵为单位阵。
高斯采样的仿真(python实现)_第2张图片

3.增加高斯核函数的高斯采样

  • 从上面可以看出来,采样的曲线变换十分不规则,可以说非常嘈杂。这是因为将协方差矩阵设置为单位阵(即任何两个 x 对应的抽样值 y 均没有关系)。而解决的方法就是将协方差矩阵和抽样点 x 之间的距离建立起关系,当 x 之间的距离越近就让 x 的值之间的相关性越大,这样就能保证曲线的变化相对平滑。

  • 度量距离的方法(采用高斯核函数):
    k ( x , x ′ ) = exp ⁡ ( − ( x − x ′ ) 2 2 σ 2 ) k(x,x') = \exp(\displaystyle\frac{-(x-x')^2}{2\sigma^2}) k(x,x)=exp(2σ2(xx)2)

  • 主要代码

    • 定义高斯核
    # 定义高斯核函数,这里用到一个比较巧妙的地方在于用了 ndarray 的 broadcast 机制没有用循环来计算
    # 在 train 的时候类似 tensor 的矩阵计算要快的多
    def gauss_kernal(sample_scale,sigma):
        tempa = sample_scale.reshape(-1, 1) # 这里是为了升维,否则会导致转置之后还是向量形式
        tempb = np.transpose(tempa)
        temp = tempa - tempb
        gauss = np.exp(- temp**2 / (2 * sigma**2))
        return gauss
    
    • sample = np.random.multivariate_normal(np.zeros(number_dot),gauss_kernal(sample_locate, sigma ),number_sample) 完成采样。
  • 采样结果

    • 采样点 3 个,样本曲线 6 条,采样区间 [0,1],均值为 0 , σ = 0.3 \sigma=0.3 σ=0.3
    高斯采样的仿真(python实现)_第3张图片
    • 采样点 100 个,样本曲线 6 条,采样区间 [0,1],均值为 0 , σ = 0.1 \sigma=0.1 σ=0.1
高斯采样的仿真(python实现)_第4张图片

你可能感兴趣的:(人工智能中的东西,信号,通信中的东西,python,机器学习,深度学习,人工智能,大数据)