径向基函数拟合(RBF Fitting)

本文介绍了径向基函数(RBF)的概念,它是高斯核函数的一种,用于二维平面上的点集拟合。通过计算插值权重,RBF能够高效地拟合复杂函数,如-y^2 + sin(3x) + 20cos(2x)。博客展示了RBF的强大拟合能力和与高斯混合模型的联系。
摘要由CSDN通过智能技术生成

最近读了几篇论文都用到了径向基函数拟合(RBF Fitting),感觉功能很强大,因此学习一下。

一、径向基函数

径向基函数跟高斯分布的概率密度函数类似,因此也叫高斯核函数,一般定义为:
φ ( x ) = e − ( x − c ) 2 2 σ 2 (1) \varphi(x)=e^{-\frac{(x-c)^2}{2\sigma^2}} \tag1 φ(x)=e2σ2(xc)2(1)
对于给定的 σ \sigma σ, 径向基函数的取值仅仅跟 x x x 离中心点 c c c的距离相关,当 c = 0 c=0 c=0时,图像如下所示:

在这里插入图片描述

二、径向基函数拟合

给定二维平面上的点集: P = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . ( x n , y n ) } P =\{(x_1,y_1),(x_2,y_2),...(x_n,y_n)\} P={(x1,y1),(x2,y2),...(xn,yn)}, 我们期望拟合一个函数:
f ( x ) = ∑ i = 1 n w i φ ( ∣ ∣ x − x i ∣ ∣ ) (2) f(x) = \sum^n_{i=1}w_i\varphi(||x-x_i||)\tag2 f(x)=i=1nwiφ(∣∣xxi∣∣)(2)
也就是说,针对 P P P中每一个点 ( x i , y i ) (x_i,y_i) (xi,yi),构造一个以 x i x_i xi为中心的径向基函数。给定任意横坐标 x x x, 其 y y y 值可以通过上式预测.

那么,如何计算这里的插值权重 w i w_i wi呢?

针对拟合任务,首先要保证拟合的值跟真实值尽可能接近。因此,针对任意点 P j ( x j , y j ) P_j(x_j,y_j) Pj(xj,yj), 我们期望完美拟合:

f ( x j ) = ∑ i = 1 n w i φ ( ∣ ∣ x j − x i ∣ ∣ ) = y j f(x_j) = \sum^n_{i=1}w_i\varphi(||x_j-x_i||)=y_j f(xj)=i=1nwiφ(∣∣xjxi∣∣)=yj
其中, φ ( ∣ ∣ x j − x i ∣ ∣ ) = e − ( x j − x i ) 2 2 σ 2 \varphi(||x_j-x_i||)=e^{-\frac{(x_j-x_i)^2}{2\sigma^2}} φ(∣∣xjxi∣∣)=e2σ2(xjxi)2。将 P P P中所有点代入公式(2), 并进一步写成矩阵乘法的形式:
[ φ 11 φ 12 . . . φ 1 n φ 21 φ 22 . . . φ 2 n . . . . φ n 1 φ n 2 . . . φ n n ] [ w 1 w 2 . w n ] = [ y 1 y 2 . y n ] (3) \begin{bmatrix} \varphi_{11} & \varphi_{12}&... & \varphi_{1n}\\ \varphi_{21} & \varphi_{22}&... & \varphi_{2n}\\ . & .& . & .\\ \varphi_{n1} & \varphi_{n2}&... & \varphi_{nn} \end{bmatrix} \begin{bmatrix} w_1 \\ w_2 \\ . \\ w_n \end{bmatrix}= \begin{bmatrix} y_1 \\ y_2 \\ . \\ y_n \end{bmatrix}\tag3 φ11φ21.φn1φ12φ22.φn2..........φ1nφ2n.φnn w1w2.wn = y1y2.yn (3)
其中, φ i j = φ ( ∣ ∣ x j − x i ∣ ∣ ) = φ j i \varphi_{ij} = \varphi(||x_j-x_i||)=\varphi_{ji} φij=φ(∣∣xjxi∣∣)=φji. 为此,权重参数可直接求解:
[ w 1 w 2 . w n ] = [ φ 11 φ 12 . . . φ 1 n φ 21 φ 22 . . . φ 2 n . . . . φ n 1 φ n 2 . . . φ n n ] − 1 [ y 1 y 2 . y n ] (4) \begin{bmatrix} w_1 \\ w_2 \\ . \\ w_n \end{bmatrix}= \begin{bmatrix} \varphi_{11} & \varphi_{12}&... & \varphi_{1n}\\ \varphi_{21} & \varphi_{22}&... & \varphi_{2n}\\ . & .& . & .\\ \varphi_{n1} & \varphi_{n2}&... & \varphi_{nn} \end{bmatrix}^{-1} \begin{bmatrix} y_1 \\ y_2 \\ . \\ y_n \end{bmatrix}\tag4 w1w2.wn = φ11φ21.φn1φ12φ22.φn2..........φ1nφ2n.φnn 1 y1y2.yn (4)

三、实际案例

给定函数:
y = − x 2 + s i n ( 3 x ) + 20 c o s ( 2 x ) y = -x^2+sin(3x)+20cos(2x) y=x2+sin(3x)+20cos(2x)
函数图像大致如下:
在这里插入图片描述

下面的圆圈是我们的均匀采样的20个顶点,我们期望通过这些采样点拟合出该函数。
在这里插入图片描述
拟合的结果如下所示,可以看出基本恢复了原始函数。
在这里插入图片描述
代码 (参考并修改:https://blog.csdn.net/xfijun/article/details/105670892):

import numpy as np
import matplotlib.pyplot as plt

# y = -x^2 + sin(3x)+20cos(2x)
def f(x):
    return -x*x + np.sin(3*x) + 20*np.cos(2*x)

# y = e^(-(x-xc)^2/2)
def gaussian(x,xc):
    return np.exp(-(x-xc)**2/(2*(1**2)))

# get w from y' = \sum w_i\phi |x'-xc|
def calculate_weights(x_sample,y_sample):
    num = len(y_sample)
    int_matrix = np.asmatrix(np.zeros((num,num)))
    for i in range(num):
        int_matrix[i,:] = gaussian(x_sample, x_sample[i])
    w = int_matrix.I * np.asmatrix(y_sample).T      
    return w

# y' = \sum w_i\phi |x'-xc|
def calculate_rbf_value(w,x_sample,x):
    num = len(x)
    y_= np.zeros(num)
    for i in range(num):
        for k in range(len(w)):
            y_[i] = y_[i] + w[k]*gaussian(x[i],x_sample[k])
    return y_

def draw_kernels(x_samples,w):
    for i in range(len(x_samples)):
        x = x_samples[i]
        x_ = np.linspace(x-2,x+2,100)
        y_ = []
        for a in x_:
            y_.append(w[i]*gaussian(a,x))
        y_ = np.array(y_).reshape(100,-1)
        plt.plot(x_,y_,'m:')

if __name__ == '__main__':
    sample_cnt = 20
    x_start, x_end = -8, 8

    x = np.linspace(x_start,x_end,500)
    y = f(x)
    x_sample = np.linspace(x_start,x_end,sample_cnt)
    y_sample = f(x_sample)
    w = calculate_weights(x_sample,y_sample)
    y_fit = calculate_rbf_value(w,x_sample,x)

    plt.figure(1)
    plt.plot(x,y_fit,'k')
    plt.plot(x,y,'r:')
    plt.ylabel('y')
    plt.xlabel('x')

    draw_kernels(x_sample,w)

    for i in range(len(x_sample)):
        plt.plot(x_sample[i],y_sample[i],'go',markerfacecolor='none')
    plt.legend(labels=['fitted','original','sample'],loc='lower left')
    plt.title('kernel interpolation:$y=sin(\pi x/2)+cos(\pi x/3)$')       
    plt.show()

下图绘制了这20个带权高斯核函数(径向基函数) w i φ ( ∣ ∣ x j − x i ∣ ∣ ) w_i\varphi(||x_j-x_i||) wiφ(∣∣xjxi∣∣)的图像,需要注意这里的权值可正可负且 ∑ w i ≠ 1 \sum w_i \neq 1 wi=1. 这跟高斯混合模型,广义重心坐标插值(MVC)等插值方式的显著区别。
在这里插入图片描述
y = − x 2 y = -x^2 y=x2 的拟合结果:
在这里插入图片描述

y = x y = x y=x 的拟合结果:
在这里插入图片描述

为什么拟合能力这么强呢?其实从某种角度可以认为是高斯混合模型吧.

参考博客:https://blog.csdn.net/xfijun/article/details/105670892

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Researcher-Du

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值