基于径向基函数(RBF)的函数插值
基于径向基函数的函数插值
- 1. 函数插值
- 2. RBF函数插值
- 代码实现
1. 函数插值
函数插值问题: 用形式简单的插值函数 f^(x)\hat f(x)f^(x) 近似原函数
(1)\qquad(1)(1) 设函数 y=f(x)y=f(x)y=f(x) 在某个区间上有定义,并且已知该区间上的一些数据点 {xi,yi}\{x_i,y_i\}{xi,yi} 严格满足 yi=f(xi),i=1,⋯,Ny_i=f(x_i),i=1,\cdots,Nyi=f(xi),i=1,⋯,N,这些数据点称为“控制节点”或“插值节点”
(2)\qquad(2)(2) 如果存在一个形式上比较简单(比如 nnn 次多项式)的函数 f^(x)\hat{f}(x)f^(x),使得 f^(xi)=yi,i=1,⋯,N\hat f(x_i)=y_i,i=1,\cdots,Nf^(xi)=yi,i=1,⋯,N 都成立,就称 f^(x)\hat{f}(x)f^(x) 为 f(x)f(x)f(x) 的插值函数。
\qquad典型的函数插值方法:拉格朗日插值和牛顿插值、HermiteHermiteHermite插值、样条插值等。
与“函数逼近”的主要区别:
插值函数 f^(x)\hat f(x)f^(x) 必须经过“插值节点”,也就是要满足 f^(xi)=yi,i=1,⋯,N\hat f(x_i)=y_i,i=1,\cdots,Nf^(xi)=yi,i=1,⋯,N
2. RBF函数插值
\qquad与拉格朗日插值之类的常规函数插值不同,基于核函数的函数插值“通过引入核函数”来刻画数据的局部化特征。
\qquad径向基函数 (Radial Basis Function,RBF)\text{(Radial\ Basis\ Function,RBF)}(Radial Basis Function,RBF) 就是一类特殊的基函数,最常用的就是“高斯基函数”,定义为:
φ(x)=e−x22σ2\qquad\qquad\qquad\varphi(x)=e^{-\frac{x^2}{2\sigma^2}}φ(x)=e−2σ2x2 (以一维情况为例)
\qquad
RBF函数插值: f^(x)=∑i=1Nwiφ(∥x−xi∥)\hat{f}(x)=\displaystyle\sum_{i=1}^Nw_i\varphi(\parallel x-x_i\parallel)f^(x)=i=1∑Nwiφ(∥x−xi∥)
\qquad假设有 NNN 个插值节点,也就是已知 {xj,yj}∣j=1N\{x_j,y_j\}\big |_{j=1}^N{xj,yj}∣∣j=1N,其中 f^(xj)=yj=f(xj)\hat{f}(x_j)=y_j=f(x_j)f^(xj)=yj=f(xj),如下图所示。
\qquad
图中,红色实线为真实函数曲线,绿色空心圆圈代表插值节点 (xj,yj)(x_j,y_j)(xj,yj),蓝色实心点为RBF插值所求得的权值 wjw_jwj
\qquad将 {xj,yj}∣j=1N\{x_j,y_j\}\big |_{j=1}^N{xj,yj}∣∣j=1N 带入方程 f^(x)=∑i=1Nwiφ(∥x−xi∥)\hat{f}(x)=\displaystyle\sum_{i=1}^Nw_i\varphi(\parallel x-x_i\parallel)f^(x)=i=1∑Nwiφ(∥x−xi∥),可得到:
[φ11φ12⋯φ1Nφ21φ22⋯φ2N⋮⋮⋮φ11φ12⋯φ1N]⏟Φ[w1w2⋮wN]⏟W=[y1y2⋮yN]⏟y\qquad\qquad\underbrace{\left[ \begin{matrix} \varphi_{11} & \varphi_{12} & \cdots & \varphi_{1N} \\ \varphi_{21} & \varphi_{22} & \cdots & \varphi_{2N} \\ \vdots & \vdots & &\vdots \\ \varphi_{11} & \varphi_{12} & \cdots & \varphi_{1N} \end{matrix} \right] }_{\Phi}\underbrace{ \left[ \begin{matrix} w_1 \\ w_2 \\ \vdots \\ w_N \end{matrix} \right]}_{\bold W}=\underbrace{\left[ \begin{matrix} y_1 \\ y_2 \\ \vdots \\ y_N \end{matrix} \right]}_{\bold y}Φ⎣⎡φ11φ21⋮φ11φ12φ22⋮φ12⋯⋯⋯φ1Nφ2N⋮φ1N⎦⎤W⎣⎡w1w2⋮wN⎦⎤=y⎣⎡y1y2⋮yN⎦⎤,其中 φji=φ(∥xj−xi∥)\varphi_{ji}=\varphi(\parallel x_j-x_i\parallel)φji=φ(∥xj−xi∥)
\qquad
\qquad其中,Φ=[φji]\Phi=[\varphi_{ji}]Φ=[φji] 为插值矩阵。因为 φji=φ(∥xj−xi∥)=φij\varphi_{ji}=\varphi(\parallel x_j-x_i\parallel)=\varphi_{ij}φji=φ(∥xj−xi∥)=φij,因此插值矩阵是对称的。对于高斯核函数而言,插值矩阵的对角线元素的值为 111。
\qquad将线性方程组记为 ΦW=y\Phi\bold W=\bold yΦW=y,该方程组的第 jjj 行为:
f^(xj)=yj=w1φ(∥xj−x1∥)+w2φ(∥xj−x2∥)+⋯+wNφ(∥xj−xN∥)\qquad\qquad\hat{f}(x_j)=y_j=w_1\varphi(\parallel x_j-x_1\parallel)+w_2\varphi(\parallel x_j-x_2\parallel)+\cdots+w_N\varphi(\parallel x_j-x_N\parallel)f^(xj)=yj=w1φ(∥xj−x1∥)+w2φ(∥xj−x2∥)+⋯+wNφ(∥xj−xN∥)
\qquad因此,可求出 RBF\text{RBF}RBF 插值的系数为:W=Φ−1y\bold W=\Phi^{-1}\bold yW=Φ−1y,其示意图如下图所示。
Micchelli定理可以保证采用高斯函数时,插值矩阵 Φ\PhiΦ 是可逆的(只要插值节点互不相同)。
\qquad
代码实现
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/3)y_all = np.sin(np.pi*x2/2)+np.cos(np.pi*x2/3)return y_sample, y_alldef kernel_interpolation(y_sample,x1,sig):gaussian_kernel = lambda x,c,h: np.exp(-(x-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,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 # control point数量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)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=['reconstruction','original','control point'],loc='lower left')plt.title('kernel interpolation:$y=sin(\pi x/2)+cos(\pi x/3)$') plt.show()
运行结果:
在相同区间、分别采用 8,12,16,208,12,16,208,12,16,20 个控制节点 (control point)\text{(control\ point)}(control point) 进行函数插值的结果
显然,插值节点过少,无法体现整个函数的特征;插值节点越多,函数插值的结果越精确
扩大插值区间范围,控制节点 (control point)\text{(control\ point)}(control point) 也需要增加数量,才能保持函数插值的准确性
\quad
另外,Scipy\text{Scipy}Scipy 的插值模块也提供了 RBF\text{RBF}RBF 插值,其实现代码如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import Rbff = lambda x: np.sin(np.pi*x/2)+np.cos(np.pi*x/3)
snum = 20 # control point数量
ratio = 20 # 总数据点数量:snum*ratio
xs = -8
xe = 8
x1 = np.linspace(xs,xe,snum) # control points
x2 = np.linspace(xs,xe,(snum-1)*ratio+1) # 作图总数据点
y1 = f(x1) # control points
rf = Rbf(x1, y1) # reconstructed Rbf function
y2 = rf(x2) # Rbf reconstruction
plt.plot(x2, y2, 'k-', x2, f(x2),'r-', x1, y1, 'go', markerfacecolor='none')
plt.legend(["Radial basis functions", "Orignal", "control point"],loc='best')
plt.show()
其运行结果如下:
\quad
此外,RBF\text{RBF}RBF函数插值还可以通过径向基函数网络来实现。
\quad
参考:函数插值的python实现——拉格朗日、牛顿插值
基于径向基函数(RBF)的函数插值相关推荐
- 基于径向基函数RBF神经网络的非线性函数拟合研究-含Matlab代码
目录 一.RBF神经网络基本原理 二.模型建立 三.RBF网络拟合结果分析 四.注意事项 五.参考文献 六.Matlab代码获取 一.RBF神经网络基本原理 1988年Broomhead和Lowe将径 ...
- python rbf神经网络_原创,基于径向基函数(RBF)神经网络RBF网络的举例应用!
function RBF_NN_Example() clc clear all % 创建训练样本 % 线性函数的训练 Mn_Train=100*[rand(1,5) rand(1,5)+0.5 r ...
- matlab rbf函数_基于径向基函数(RBF)的无网格伪谱法与程序实现(2)——微分矩阵...
参考资料 Gregory E. Fasshauer. Meshfree Approximation Methods with MATLAB. P.387 P401 数值实现 Matlab 2019a ...
- 径向基函数RBF三维网格变形
前言 之前写过径向基函数(RBF)神经网络做分类或者拟合.然后挖了个坑说在<Phase-Functioned Neural Networks for Character Control>里 ...
- 径向基函数模型matlab,径向基函数RBF.ppt
径向基函数RBF 2006-12-12 北京科技大学 付冬梅 * 例 建立一个径向基神经网络,对非线性函数y=sqrt(x)进行逼近,并作出网络的逼近误差曲线. 6-7 RBF网络的MATLAB函数及 ...
- 高斯径向基函数(RBF)神经网络
高斯径向基函数(RBF)神经网络 牛顿插值法-知乎 泰勒公式 径向基函数-wiki 径向基网络之bp训练 RBF网络逼近能力及其算法 线性/非线性,使用"多项式"逼近非线性,通过调 ...
- 径向基函数(rbf)神经网络 基础篇 奥利给 干就完了!
今天咱们就一起把径向基函数神经网络翻个底朝天,好好琢磨一下哈.老铁,走着. ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019112613170742.png? ...
- 机器学习算法-09-深度学习、BP神经网络、Hopfield神经网络、基于数学原理的神经网络、径向基函数RBF(B站一条会说666的咸鱼)
Deep Learning 深度学习的概念源于人工神经网络的研究,含多隐层的多层感知器就是有一种深度学些的结构 ,深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征的 ...
- 人工神经网络——径向基函数(RBF)神经网络
此博客排版不好,重新用Markdown写了一篇,同时附上了代码,戳这里 本文摘自:<模式识别与智能计算--matlab技术实现第三版>与<matlab神经网络43个案例分析> ...
最新文章
- java web程序示例_想要建立一些有趣的东西吗? 这是示例Web应用程序创意的列表。...
- JDK源码解析-Collection.iterator方法
- C++class类(II)
- Kettle, Solr
- 在SAP Smart Business workspace里创建KPI tile的错误消息分析
- 自然语言处理(2)-信息论基础
- 计算机科学中的逻辑学术,简述逻辑学在计算机科学中的应用
- Sharding-Jdbc实现读写分离、分库分表,妙!
- python协程--yield和yield from
- Python 语言程序设计(5-1)函数的定义与使用
- Web Service-第一篇什么是Web Service
- 【钢带厚度预测】基于matlab模拟退火遗传算法优化BP神经网络钢带厚度预测【含Matlab源码 1285期】
- css 实现一个尖角_纯CSS实现页面的尖角、小三角、不同方向尖角的方法小结
- linux中apache无法启动,Apache无法启动
- python上位机实现机械臂拾物
- MySQL报错:Data too long for column
- ubuntu清理系统垃圾与备份
- 解决active样式在ios手机上没有生效的问题
- 关于如何通过Swap函数交换两个变量的值
- 个人头像-----资源
热门文章
- 中望3D2022 建模
- 如何设置c#的字体风格FontStyle同时为Bold,Italic...
- 北上广深下调公积金贷款利率 每月少还上百元
- 校园助手APP--腾讯地图的集成使用(含街景)
- 关于github里面的个人邮箱设置
- VMware虚拟机安装Win11最详细过程以及遇到的这台电脑无法运行Windows11的问题
- (未完待续)浅谈微服务以及 常用中间件( zookeeper redis rabbitmq)
- pytorch版本SSD代码分析(2)——数据增强
- MYSQL的悲观锁for update
- C++火龙征战(打怪升级)小游戏