径向基函数插值

一、径向基函数的定义

如果 ∣ ∣ x 1 ∣ ∣ = ∣ ∣ x 2 ∣ ∣ ||x_1||=||x_2|| ∣∣x1∣∣=∣∣x2∣∣,那么 ϕ ( x 1 ) = ϕ ( x 2 ) \phi(x_1)=\phi(x_2) ϕ(x1)=ϕ(x2) 的函数 ϕ \phi ϕ 就是径向函数,即仅由 r = ∣ ∣ x ∣ ∣ r=||x|| r=∣∣x∣∣ 控制的函数(径向基函数是一个取值仅仅依赖于离原点距离的实值函数,或者还可以是到任意一点 c c c 的距离)。

给定一个一元函数 ϕ : R + → R \phi:R_+\rightarrow R ϕR+R,在定义域 x ∈ R d x\in R^d xRd 上,所有形如 ψ ( x ) = ϕ ( ∣ ∣ x − c ∣ ∣ ) \psi(x)=\phi(||x-c||) ψ(x)=ϕ(∣∣xc∣∣) 及其线性组合张成的函数空间称为由函数 ϕ \phi ϕ 导出的径向基函数空间

在一定的条件下,只要取 { x j } \{x_j\} {xj} 两两不同, { ϕ ( x − x j ) } \{\phi(x-x_j)\} {ϕ(xxj)} 就是线性无关的,从而形成径向基函数空间中某子空间的一组基。当 { x j } \{x_j\} {xj} 几乎充满 R R R 时, { x j } \{x_j\} {xj} 几乎充满 R R R 时, { ϕ ( x − x j ) } \{\phi(x-x_j)\} {ϕ(xxj)} 及其线性组合可以逼近几乎任何函数。

各类文献中常用的径向基函数有:

  1. Kriging 方法的 Gauss 分布函数: ϕ ( r ) = e − c 2 r 2 \phi(r)=e^{-c^2r^2} ϕ(r)=ec2r2
  2. Kriging 方法的 Markoff 分布函数: ϕ ( r ) = e − c ∣ r ∣ \phi(r)=e^{-c|r|} ϕ(r)=ecr,及其他概率分布函数;
  3. Hardy 的 Multi-Quadric 函数: ϕ ( r ) = ( c 2 + r 2 ) β \phi(r)=(c^2+r^2)^\beta ϕ(r)=(c2+r2)β(其中 β \beta β 是正的实数);
  4. Hardy 的逆 Multi-Quadric 函数: ϕ ( r ) = ( c 2 + r 2 ) − β \phi(r)=(c^2+r^2)^{-\beta} ϕ(r)=(c2+r2)β(其中 β \beta β 是正的实数);
  5. Duchon 的薄板样条: d d d 为偶数时, ϕ ( r ) = r 2 k − d log ⁡ r \phi(r)=r^{2k-d}\log r ϕ(r)=r2kdlogr d d d 为奇数时, ϕ ( r ) = r 2 k − d \phi(r)=r^{2k-d} ϕ(r)=r2kd

二、径向基函数插值

定义:径向基函数插值是对于给定的多元散乱数据 { x j , f j } j = 1 n , x j ∈ R n , f j ∈ R , j = 1 , ⋯   , n \{x_j,f_j\}^n_{j=1},x_j\in R^n,f_j\in R,j=1,\cdots,n {xj,fj}j=1n,xjRn,fjR,j=1,,n。选取径向函数 ϕ : R + → R \phi:R_+\rightarrow R ϕ:R+R 来构造函数系 { ϕ ( ∣ ∣ x − x j ∣ ∣ ) } j = 1 n \{\phi(||x-x_j||)\}_{j=1}^n {ϕ(∣∣xxj∣∣)}j=1n 并寻找形如 S ( x ) = ∑ j = 1 n λ j ϕ ( ∣ ∣ x − x j ∣ ∣ ) S(x)=\sum_{j=1}^n\lambda_j\phi(||x-x_j||) S(x)=j=1nλjϕ(∣∣xxj∣∣) 的插值函数 S ( x ) S(x) S(x),使其满足条件 S ( x j ) = f j , j = 1 , ⋯   , n S(x_j)=f_j,j=1,\cdots,n S(xj)=fj,j=1,,n

为了方便,我们定义
{ f T = ( f 1 , f 2 , ⋯   , f n ) ϕ T ( x ) = ( ϕ ( ∣ ∣ x − x 1 ∣ ∣ , ϕ ( ∣ ∣ x − x 2 ∣ ∣ , ⋯   , ϕ ( ∣ ∣ x − x n ∣ ∣ ) ) λ T = ( λ 1 , λ 2 , ⋯   , λ n ) A = ( ϕ ( ∣ ∣ x j − x k ∣ ∣ ) ) n × n \begin{cases} \pmb{f^T}=(f_1,f_2,\cdots,f_n)\\[2ex] \pmb{\phi^T}(x)=\Big(\phi(||x-x_1||,\phi(||x-x_2||,\cdots,\phi(||x-x_n||)\Big)\\[2ex] \pmb{\lambda^T}=(\lambda_1,\lambda_2,\cdots,\lambda_n)\\[2ex] \pmb{A}=\Big(\phi(||x_j-x_k||)\Big)_{n\times n} \end{cases} fT=(f1,f2,,fn)ϕT(x)=(ϕ(∣∣xx1∣∣,ϕ(∣∣xx2∣∣,,ϕ(∣∣xxn∣∣))λT=(λ1,λ2,,λn)A=(ϕ(∣∣xjxk∣∣))n×n

上述插值方程对任意两两不同的 x j x_j xj 的数据 { x j , f j } \{x_j,f_j\} {xj,fj} 有解的充要条件是:对任意两两不同的 x j x_j xj,对称矩阵 A \pmb A A 都非奇异。

定理:函数 ϕ : R + → R \phi:R_+\rightarrow R ϕ:R+R 是连续的, lim ⁡ r → ∞ ϕ ( r ) = 0 \lim_{r\rightarrow\infty}\phi(r)=0 limrϕ(r)=0,那么对于 n n n 元的径向基函数插值总是存在唯一解的充分条件是:矩阵 A \pmb A A 是正定矩阵。

上面提到的径向基函数中逆 Multi-Quadric 函数和 Gauss 函数在任意维空间上都是正定函数,因此插值是唯一的。

三、用高斯函数进行散乱数据的插值

对于数据量少的情况,径向基函数(尤其是高斯函数)插值的结果较令人满意,而且计算也比较简单。

令径向基函数插值方程为
S ( x ) = ∑ j = 1 n λ j ϕ ( ∣ ∣ x − x j ∣ ∣ ) S(x)=\sum_{j=1}^n\lambda_j\phi(||x-x_j||) S(x)=j=1nλjϕ(∣∣xxj∣∣)

将已知点 ( x j , f j ) , j = 1 , ⋯   , n (x_j,f_j),j=1,\cdots,n (xj,fj),j=1,,n 代入方程,可得:
[ λ 1 λ 2 ⋯ λ n ] [ ϕ ( ∣ ∣ x 1 − x 1 ∣ ∣ ) ϕ ( ∣ ∣ x 2 − x 1 ∣ ∣ ) ⋯ ϕ ( ∣ ∣ x n − x 1 ∣ ∣ ) ϕ ( ∣ ∣ x 1 − x 2 ∣ ∣ ) ϕ ( ∣ ∣ x 2 − x 2 ∣ ∣ ) ⋯ ϕ ( ∣ ∣ x n − x 2 ∣ ∣ ) ⋮ ⋮ ⋮ ϕ ( ∣ ∣ x 1 − x n ∣ ∣ ) ϕ ( ∣ ∣ x 2 − x n ∣ ∣ ) ⋯ ϕ ( ∣ ∣ x n − x n ∣ ∣ ) ] = [ f 1 f 2 ⋯ f n ] \left[ \begin{matrix} \lambda_1 & \lambda_2 & \cdots & \lambda_n\\ \end{matrix} \right] \left[ \begin{matrix} \phi(||x_1-x_1||) & \phi(||x_2-x_1||) & \cdots & \phi(||x_n-x_1||)\\ \phi(||x_1-x_2||) & \phi(||x_2-x_2||) & \cdots & \phi(||x_n-x_2||)\\ \vdots & \vdots & & \vdots\\ \phi(||x_1-x_n||) & \phi(||x_2-x_n||) & \cdots & \phi(||x_n-x_n||)\\ \end{matrix} \right]= \left[ \begin{matrix} f_1& f_2& \cdots& f_n\\ \end{matrix} \right] [λ1λ2λn] ϕ(∣∣x1x1∣∣)ϕ(∣∣x1x2∣∣)ϕ(∣∣x1xn∣∣)ϕ(∣∣x2x1∣∣)ϕ(∣∣x2x2∣∣)ϕ(∣∣x2xn∣∣)ϕ(∣∣xnx1∣∣)ϕ(∣∣xnx2∣∣)ϕ(∣∣xnxn∣∣) =[f1f2fn]

求解上述方程,可求出 λ 1 , λ 2 , ⋯   , λ n \lambda_1,\lambda_2,\cdots,\lambda_n λ1,λ2,,λn 的值,从而求出插值曲线方程。插值曲面方程类似,将 x x x 替换成向量 X X X 即可。

具体应用到高斯函数,设高斯函数插值方程为
S ( x ) = ∑ j = 1 n λ j e − α ∣ ∣ x − x j ∣ ∣ 2 α > 0 S(x)=\sum_{j=1}^n\lambda_je^{-\alpha||x-x_j||^2}\quad\alpha>0 S(x)=j=1nλjeα∣∣xxj2α>0

其中, α \alpha α 为形状调整参数,可根据散乱数据点分布特征选取,当数据点对应的函数值变化较大时, α \alpha α 可取的稍大些;数据点对应的函数值变化较小时, α \alpha α 可取得稍小些。

python 代码实现

import numpy as np
import matplotlib.pyplot as plt


def gen_data(x1, x2):
    # 用于生成插值节点和总数据点 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_all


def kernel_interpolation(y_sample, x1, sig):
    # 求解插值函数中高斯基函数的系数
    gaussian_kernel = lambda x, c, h: np.exp(-h*(x - x[c]) ** 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 = np.asmatrix(y_sample) * int_matrix.I
    w = w.T
    return w


def kernel_interpolation_rec(w, x1, x2, sig):
    gkernel = lambda x, xc, h: np.exp(-h*(x - xc) ** 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_rec


if __name__ == '__main__':
    snum = 20  # control point数量
    ratio = 20  # 总数据点数量:snum*ratio
    sig = 0.5  # 核函数宽度
    xs = -8
    xe = 8
    x1 = 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()

运行结果

在这里插入图片描述

Matlab 代码实现

clc;clear;

%% 参数
snum = 20;  % 插值节点个数
ratio = 20;  % 总数据点个数:(snum-1)*ratio + 1
sig = 0.5;  % 形状控制参数

xs = -8;  % 起点
xe = 8;  % 终点

%% 生成样本点
x1 = linspace(xs,xe,snum);  % 生成插值点坐标
x2 = linspace(xs,xe,(snum-1)*ratio + 1);
[y_sample,y_all] = gen_data(x1,x2);

figure('Name','RBF插值方法')

%% 计算基函数技术lambda
w = kernel_interpolation(y_sample,x1,sig);

%% 重构曲线
y_rec = kernel_interpolation_rec(w,x1,x2,sig);

%% 绘图
plot(x2,y_rec,'--',x2,y_all,':','LineWidth',2)
hold on
for i = 1:1:length(x1)
    scatter(x1(i),y_sample(i),70,'green')
end


title('$y=sin(\pi x/2)+cos(\pi x/3)$','Interpreter','latex')
xlabel('x')
ylabel('y')
legend('重构曲线','原始曲线','插值点','Location','southwest')

%% 生成插值节点和总数据点
function [y_sample,y_all] = gen_data(x1,x2)
y_sample = sin(pi * x1 / 2) + cos(pi * x1 / 3);
y_all = sin(pi * x2 / 2) + cos(pi * x2 / 3);
end


%% 求解插值函数中高斯基函数的系数
function w = kernel_interpolation(y_sample,x1,sig)
num = length(y_sample);
int_matrix = zeros(num,num);

for i = 1:1:num 
    int_matrix(i,:) = exp(-sig.*(x1-x1(i)).^2);
end

w = y_sample * inv(int_matrix);
end


%% 重构曲线
function y_rec = kernel_interpolation_rec(w,x1,x2,sig)
num = length(x2);
y_rec = zeros(1,num);

for i = 1:1:num
    for k = 1:1:length(w)
        y_rec(i) = y_rec(i) + w(k) .* exp(-sig.*(x2(i)-x1(k)).^2);
    end
end
end





运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/302385.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何修复 SQL Server 数据库中的恢复挂起状态?

当我们想与关系数据库交互时,SQL 就会出现并帮助用户与数据库进行交互。SQL 从高级语言中获取用户的输入,然后访问将代码转换为机器可理解的形式。SQL 确实会恢复数据库文件,但有时 SQL 服务器恢复暂挂阶段会进入帐户,这会停止恢复…

wordcloud,一个超酷的python库

一、简单介绍一下 词云图是文本挖掘中用来表征词频的数据可视化图像,通过它可以很直观地展现文本数据中地高频词,让读者能够从大量文本数据中快速抓住重点。如下图: wordcloud则是一个非常优秀的词云展示python库,它支持自定义词…

高通开发系列 - toolchain交叉编译器编译kernel以及生成boot镜像

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 背景概述分析过程generate_defconfig.sh脚本环境准备合并其他几个配置文件开始编译生成dtb镜像

JavaWeb——Spring事务管理

六、Spring事务管理 1. 注解 注解:Transactional 位置:业务(service)层的方法上、类上、接口上——一般在执行多条增删改方法上加 作用:将当前方法交给spring进行事务管理,方法执行前,开启事…

解决:已经安装open3d,还是报错No module named ‘open3d‘的问题

首先示例,我是如何安装又是如何被报错的过程。 报错过程: 网上普遍的安装指令就是下面这个: pip install open3d 我是直接python页面的终端安装的: 安装完,检查列表已安装文件是否有open3d, 输入指令 …

听GPT 讲Rust源代码--compiler(12)

File: rust/compiler/rustc_data_structures/src/graph/dominators/mod.rs 文件mod.rs位于Rust编译器源代码中的rustc_data_structures/src/graph/dominators目录下。这个文件的作用是实现支配树(dominator tree)的计算算法。 在编译器优化中&#xff0c…

Hotspot源码解析-第十五章-类加载器初始化前期准备

15.1 ClassLoader初始化 15.1.1 classLoader.cpp 15.1.1.1 classLoader_init void classLoader_init() {ClassLoader::initialize(); }void ClassLoader::initialize() {assert(_package_hash_table NULL, "should have been initialized by now.");EXCEPTION_MA…

Spring学习 Spring整合MyBatis

6.1.创建工程 6.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.ap…

3.9 EXERCISES

矩阵加法需要两个输入矩阵A和B&#xff0c;并产生一个输出矩阵C。输出矩阵C的每个元素都是输入矩阵A和B的相应元素的总和&#xff0c;即C[i][j] A[i][j] B[i][j]。为了简单起见&#xff0c;我们将只处理元素为单精度浮点数的平方矩阵。编写一个矩阵加法内核和主机stub函数&am…

C语言详解之一维数组二维数组以及变长数组

一周新的开始&#xff0c;今天的你学习了吗&#xff1f; 前言 今天打算把数组的相关知识知识复习一下&#xff0c;比如初始化&#xff0c;调用&#xff0c;以及他和指针的关系等等 数组是什么 数组是一种数据结构&#xff0c;它由相同类型的元素组成&#xff0c;并按照一定的…

Spring学习 Spring AOP

4.Spring AOP 4.1.为什么要学习AOP? 案例&#xff1a;有一个接口Service有一个addUser方法&#xff0c;在调用addUser(被调用时打印调用前的毫秒数与调用后的毫秒数&#xff09;&#xff0c;其实现为&#xff1a; Service public class UserServiceImpl implements UserServi…

机器学习 前馈神经网络

人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;是指一系列受生物学和神经科学启发的数学模型&#xff0e;这些模型主要是通过对人脑的神经元网络进行抽象&#xff0c;构建人工神经元&#xff0c;并按照一定拓扑结构来建立人工神经元之间的连接…

【Vue3】2-5 : 指令系统与事件方法及传参处理

本书目录&#xff1a;点击进入 一、标签属性中的使用 - 指令系统 1.1 那么模板语法是否可以在标签属性中进行使用呢? ▶ 当然可以&#xff1a;使用 指令系统 二、指令系统 2.1 v-bind 2.2 v-on 三、实战 3.1 methods 选项 3.2 $event语法 一、标签属性中的使用 - 指令…

服务发现Discovery

对于注册进eureka里面的微服务&#xff0c;可以通过服务发现来获得该服务的信息 1、 修改cloud-provider-payment8001的controller import com.my.springcloud.utils.RestResponse; import com.my.springcloud.entities.Payment; import com.my.springcloud.service.PaymentSe…

文档审阅批注的合并和对比

#创作灵感# 最近在改论文&#xff0c;Feedback返回的时候&#xff0c;把之前的批注都删了&#xff0c;这就增加了工作量&#xff0c;看起来不方便&#xff0c;所以就需要将删掉的批注全部复原。 那在原来的文档重新在修改一遍&#xff0c;工作量还是很大的&#xff0c;所以这里…

java中的语法糖,你了解多少?

什么是语法糖 语法糖是一种编程语言的特性&#xff0c;通常是一些简单的语法结构或函数调用&#xff0c;它可以通过隐藏底层的复杂性&#xff0c;并提供更高级别的抽象&#xff0c;从而使代码更加简洁、易读和易于理解。但它并不会改变代码的执行方式。 语法糖优势 1. 简化代…

Turn.js 实现翻书效果

接到了任务&#xff0c;要把孩子画的画放到网页上去&#xff0c;翻页效果还要逼真一点。搜索到了turn.js这个前端翻页组件&#xff0c;效果不错。先上图看效果。 网页实际效果&#xff1a;星月夜诗集 turn.js的官网地址&#xff1a;Turn.js: The page flip effect in HTML5 …

内存映射-进程通信

内存映射(mmap) 1. 创建内存映射区 实现进程间通信&#xff0c;还可以通过函数创建一块内存映射区&#xff0c;和管道不同的是管道对应的内存空间在内核中&#xff0c;而内存映射区对应的内存空间在进程的用户区&#xff08;用于加载动态库的那个区域&#xff09;&#xff0c…

1.4号io网络

1.多进程 引入目的&#xff1a;让多个任务实现并发执行 并发执行&#xff1a;同一时间只有一个进程执行&#xff0c;通过时间轮询调度多个进程&#xff0c;由于时间每个进程所用时间极短&#xff0c;所以宏观表现为多个进程同时进行。 并行执行&#xff1a;多个任务器执行多…

【Python】Graphviz的安装和使用

graphviz包可以用来决策树可视化&#xff0c;只安装包之后直接import使用会报错&#xff0c;因为graphviz是一个要单独安装的软件。 下载路径&#xff1a;Download | Graphviz 有不同的版本&#xff0c;我这里用的是最新版 9.0版本安装之后可以选自动添加到环境变量——系统…