RBF(Radial-Basis Function)网路之一:多元插值法

2023-10-09 17:32

本文主要是介绍RBF(Radial-Basis Function)网路之一:多元插值法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 插值:在离散数学的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。(来自百度百科)插值除了给定的离散数据点外,连续曲线的其他点都属于“插入”进来的,所以称插值。

在多维空间的插值法定义为:

给定N个不同的点集x\epsilon R^{m_{0}}|i=1,2,...N和一组相对应的N个实数集合d\epsilon R^{1}|i=1,2,...N,找到一个函数满足如下的条件:

F(x_{i})=d_{i}                                                                                                                                  (1)     插值和拟合的区别:

(1)共同点:两者都是寻求函数曲线(曲线)

(2)不同点:插值要求曲线(或曲面)过全部的离散数据点,而拟合是寻求全局最接近的结果,即要求拟合函数和数据点的最小二乘意义最小。

2插值的常用方法

(1)牛顿法

(2)逐次线性插值

(3)拉格朗日插值法

(4)等距节点插值

(5)Herminte法

(6)分段低次插值

(7)样条插值

本篇主要介绍的rbf插值法

3 rbf插值法

rbf插值法是由Powell 于1985年提出。其基本思想不是直接使用原数据点进行插值,而是使用每个点与中心点的距离,距离一般是欧几里得距离,也就是每个点离中心点的径向距离如下表示:

||\mathbf{x}-\mathbf{x}_{i}||)

其中已知的插值节点\mathbf{x}_{i}是中心点,\mathbf{x}_{i}\epsilon R^{m_{0}}|i=1,2,...N\mathbf{x}\epsilon R^{m_{0}}是等待插值的节点,m_{0}是插值节点的维度 。而RBF插值的基函数具有如下形式:

\varphi (||\mathbf{x}-\mathbf{x}_{i}||)| i=1,2,...,N,

此函数称为径向基函数,通常是非线性的,此函数常用的形式见下文。而RBF的插值函数有如下形式:

F(\mathbf{x})=\sum_{i=1}^{N}w_{i}\varphi (||\mathbf{x}-\mathbf{x}_{i}||)

其中w_{i}是插值矩阵。由于F(x_{i})=d_{i}我们可以得到如下变换式:

\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} d_{1}\\ d_{2}\\ ...\\ d_{N} \end{bmatrix}

其中记\varphi _{i,j}=\varphi (||\mathbf{x}_{i}-\mathbf{x}_{j}||)|i,j=1,2,...N

便于表示,我们有如下记号:

\mathbf{w}=\left [ w_{1} ,w_{1} ,... ,w_{1N} \right ]^{T}

\mathbf{d}=\left [ d_{1} ,d_{1} ,... ,d_{1N} \right ]^{T}

\mathbf{\phi }=\left \{ \varphi _{i,j}\right \}_{i=1}^{N} (左边是粗体),

其中\mathbf{d,w }均是N行1列的向量,称\mathbf{d}为要求的结果向量,称\mathbf{w}为线性权重向量,而\phi称为插值矩阵,它是N行N列,且是对称矩阵

由此,上述公式可简化为:

\mathbf{\phi }\mathbf{w}=\mathbf{d}

如果插值矩阵\phi是非奇异的,则其逆矩阵\phi ^{-1}存在,此时可求得线性权重向量

\mathbf{w}=\phi ^{-1}\mathbf{d}

插值向量是不是非奇异的,可以由Micchelli理论来解释。

Micchelli定理:

\mathbf{x}_{i}\epsilon R^{m_{0}}|i=1,2,...N是实数域R^{m_{0}}里互不相同的节点,则其插值矩阵\mathbf{\phi }=\left \{ \varphi _{i,j}\right \}_{i=1}^{N}是非奇异的。

满足Micchelli定理的径向基函数\varphi有如下:

(1)多二次函数

\varphi(r)=(r^{2}+c^{2})^{1/2},c>0,r\epsilon R

(2)逆多二次函数

\varphi(r)=\frac{1}{(r^{2}+c^{2})^{1/2}} ,c>0,r\epsilon R

(3)高斯函数

\varphi(r)=exp(-\frac{r^{2}}{2\sigma ^{2}}) ,\sigma >0,r\epsilon R

对于上述三种函数,如果插值节点是互不相同的,无论输入样本数N是多少,也无论输入样本的维度m_{0}是多少,它的插值矩阵\phi总是非奇异的。注意:此方法介绍的插值法是完全内插法,要求插值曲线过每一个插值节点。对于逆多二次函数和高斯函数,当r\rightarrow \infty时,\varphi(r)\rightarrow 0,插值矩阵是正定的,这两种函数被称为本地化函数,而多二次函数则r\rightarrow \infty时,\varphi(r)\rightarrow \infty,被称为非本地化函数,插值矩阵具有N-1个负的特征值和1个正的特征值,而且它还不是正定的

插值节点的计算公式如下:

4实现

(1)使用RBF进行一维插值

#rbf插值
import numpy as np
import matplotlib.pyplot as pltdef gen_data(x1,x2):y_sample = np.sin(np.pi*x1/2)+np.cos(np.pi*x1/2)y_all = np.sin(np.pi*x2/2)+np.cos(np.pi*x2/2)return y_sample, y_alldef kernel_interpolation(y_sample,x1,sig):gaussian_kernel = lambda x,c,h: np.exp(-(x-c)**2/(2*(h**2)))#使用高斯核函数num = len(y_sample)w = np.zeros(num)int_matrix = np.asmatrix(np.zeros((num,num)))#计算插值矩阵for i in range(num):int_matrix[i,:] = gaussian_kernel(x1,x1[i],sig)  w = int_matrix.I * np.asmatrix(y_sample).T  #计算权重矩阵    return wdef kernel_interpolation_rec(w,x1,x2,sig):#根据权重矩阵,进行插值gkernel = lambda x,xc,h: np.exp(-(x-xc)**2/(2*(h**2)))num = len(x2)y_rec = np.zeros(num)for i in range(num):for k in range(len(w)):y_rec[i] = y_rec[i] + w[k]*gkernel(x2[i],x1[k],sig)return y_recif __name__ == '__main__':snum = 20   # 插值节点数量ratio = 20  # 总数据点数量:snum*ratiosig = 1		# 核函数宽度xs = -8xe = 8x1 = np.linspace(xs,xe,snum)x2 = np.linspace(xs,xe,(snum-1)*ratio+1)y_sample, y_all = gen_data(x1,x2)plt.figure(1)plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签plt.rcParams['axes.unicode_minus']=False   #这两行需要手动设置w = kernel_interpolation(y_sample,x1,sig)   y_rec = kernel_interpolation_rec(w,x1,x2,sig)plt.plot(x2,y_rec,'k')plt.plot(x2,y_all,'r:')        plt.ylabel('y')plt.xlabel('x')for i in range(len(x1)):        plt.plot(x1[i],y_sample[i],'go',markerfacecolor='none')        plt.legend(labels=['插值曲线','原函数曲线','插值节点'],loc='lower left')plt.title('kernel interpolation:$y=sin(\pi x/2)+cos(\pi x/2)$')       plt.show()MSE = np.linalg.norm(y_all-y_rec, ord=2)**2/len(y_all)

MSE误差为0.00013145540771572465

(2)使用RBF进行二维插值

#rbf二维插值
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
#定义二维函数
def gen_data(x1,x2):y=20+x1**2-10*np.cos(2*np.pi*x1)+x2**2-10*np.cos(2*np.pi*x2) #插值函数return y
def kernel_interpolation(y_sample,x1,x2,sig):gaussian_kernel = lambda x1,x2,y1,y2,h:np.exp((-(x1-x2)**2-(y1-y2)**2)/(2*(h**2)))#计算二维空间欧式距离num = len(y_sample)w = np.zeros(num)int_matrix = np.asmatrix(np.zeros((num,num))) #插值矩阵for i in range(num):int_matrix[i,:] = gaussian_kernel(x1,x1[i],x2,x2[i],sig)  w = int_matrix.I * np.asmatrix(y_sample).T    #权重矩阵  return wdef kernel_interpolation_rec(w,x1,x2,y1,y2,sig):#进行插值gkernel = lambda x1,y1,x2,y2,h: np.exp((-(x1-y1)**2-(x2-y2)**2)/(2*(h**2)))num = len(y1)y_rec = np.zeros(num)for i in range(num):for k in range(len(w)):y_rec[i] = y_rec[i] + w[k]*gkernel(y1[i],x1[k],y2[i],x2[k],sig)return y_rec
if __name__ == '__main__':snum = 20  # 插值节点数量ratio = 20  # 总数据点数量:snum*ratiosig = 1		# 核函数宽度xs = -8xe = 8x1 = np.linspace(xs,xe,snum)x2=x1y1 = np.linspace(xs,xe,(snum-1)*ratio+1)y2=y1y_sample = gen_data(x1,x2)y_all=gen_data(y1,y2)w = kernel_interpolation(y_sample,x1,x2,sig) y_rec = kernel_interpolation_rec(w,x1,x2,y1,y2,sig)MSE = np.linalg.norm(y_all-y_rec, ord=2)**2/len(y_all)print(MSE)

参考资料:

1 Nerual networks and Learning Machines Third Edition ,.神经网络与机器学习 Simon Haykin第三版,第五章。

2 基于径向基函数(RBF)的函数插值.https://blog.csdn.net/xfijun/article/details/105670892

3 数值分析 第五版 李庆扬、王能超、易大义编

这篇关于RBF(Radial-Basis Function)网路之一:多元插值法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/174452

相关文章

【剖析】为什么说RBF神经网络的误差为0

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 机器学习中的模型非常的多,但如果要问有没有这样的一个模型,它的训练误差为0,那么就非RBF神经网络莫属了!下面我们来聊聊,为什么RBF神经网络的训练误差为0。 一、RBF神经网络是什么 知道RBF神经网络的人都知道,但不知道RBF神经网络的人还是不知道。所以简单提一下,RBF神经网络是一个什么东西。

智能优化算法改进策略之局部搜索算子(三)—二次插值法

1、原理介绍 多项式是逼近函数的一种常用工具。在寻求函数极小点的区间(即寻查区间)上,我们可以利用在若干点处的函数值来构成低次插值多项式,用它作为求极小点的函数的近似表达式,并用这个多项式的极小点作为原函数极小点的近似。低次多项式的极小点比较容易计算。常用的插值多项式为二次或三次,一般说来三次插值公式的收敛性好一些,但在导数不变计算时,三点二次插值也是一种常用的方法[1]。 3

「Debug R」报错unable to find an inherited method for function是如何产生的

在一个群里看到这样一条报错,截图如下: 报错信息 当然这种问题解决起来也很快,无非就是把报错信息复制出来放在搜索引擎上,只不过你要挑选合适的搜索引擎。 百度 谷歌 必应 解决方案就是用dplyr::select。 虽然报错解决了,但是我还想着要重复出这个报错。因为只有能重复出报错,才能证明你不是运气好才解

C++可调用对象与function

C++语言有几种可调用对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用运算符的类。 和其他对象一样,可调用的对象也有类类型。例如,每个lambda有它自己唯一的(未命名)类类型;函数及函数指针的类型则由其返回值类型和实参类型决定。 然而,两种不同类型的可调用对象却可能共享同一种调用形式。调用形式指明了调用返回的类型以及传递给调用的实参类型。一种调用形式对应一个函数

Python统计实战:一题搞定多元线性回归、共线性、相对重要性分析

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。 (以下练习题来源于《统计学—基于Python》。联系获取完整数据和Python源代码文件。) 练习题 为了分析影响不良贷款的因素,一家商业银行在所属的多家分行中随机抽取25家,得到的不良贷款、贷款余额、应收贷款、贷款项目个数、固定资产投资等有关数据如下(前3行

INVS利用gatearray实现post-mask的function ECO

随着现代IC的设计发展,设计的规模和复杂度逐步增加,对于验证完备性的挑战越来越大,加之TO的时间压力,芯片设计通常会出现下列的场景: 芯片回片一次点亮大部分的case都可以顺利通过小部分的功能需要修正 对于重要的特性三,用户可以选择gatearray的cell高效的完成这一个任务。闲言少叙,ICer GO! 由于·硬件设计天然的特性,大部分芯片都会有reversion的计划,有时候也被称

基本网路概念学习

TCP/IP 四层网络结构 L2 数据链路层 或者叫 主机网络层,负责模数-数模转换,最常用的是以太网,无线以太网等。 L3 网络层,主要有IP协议,网络层发送的数据称为数据报, IP数据报包含20字节(通常)的头部,记录信息包括版本号,首部长度,原地址,目的地址,协议类型等信息。 L4 传输层 负责包以发送时的顺序接收。为了这个目的,这一层有两个主要的协议 TCP 和 UDP。 L5 应

一个页面中需要多个window.onload = function(){}冲突问题解决

今天在写js作业的时候,没注意用到了几个 window.onload,发现打开测试的时候有冲突,导致没有效果出现。上网查阅了资料,发现解决办法。 如果在一个页面中有两个JavaScript 分别都用到了window.onload 一个是:window.οnlοad=function(a){...},另一个是:window.οnlοad=function(b){...} 就造成了一个JavaS

ES6新特性箭头函数(Arrow Function)

箭头函数是ECMAScript 6最受关注的更新内容之一。它引入了一种用「箭头」(=>)来定义函数的新语法,它…它碉堡了~。箭头函数与传统的JavaScript函数主要区别在于以下几点: 1.对 this 的关联。函数内置 this 的值,取决于箭头函数在哪儿定义,而非箭头函数执行的上下文环境。 2.new 不可用。箭头函数不能使用 new 关键字来实例化对象,不然会报错。 3.

【GNU笔记】内联函数与宏一样快 An Inline Function is As Fast As a Macro

内联函数与宏一样快 An Inline Function is As Fast As a Macro 通过声明内联函数,你可以指示 GCC 更快地调用该函数。GCC 可以实现这一点的一种方法是将该函数的代码集成到其调用者的代码中。这通过消除函数调用开销使执行速度更快;此外,如果任何实际参数值是常量,则它们的已知值可能允许在编译时进行简化,因此不需要包含所有内联函数的代码。对代码大小的影响是难以预