ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SMILE 径向基函数(RBF)完全指南:从基础理论到插值与 RBF 网络实战

SMILE 径向基函数(RBF)完全指南:从基础理论到插值与 RBF 网络实战 人工智能机器学习深度学习NLP大模型模型推理服务数据可视化【免费下载链接】smileStatistical Machine Intelligence Learning Engine项目地址https://gitcode.com/gh_mirrors/smi/smile点击查看免费下载SMILEStatistical Machine Intelligence Learning Engine在smile.math.rbf包中提供了一套完整的径向基函数Radial Basis Function, RBF内核实现广泛用于 RBF 网络、散乱数据插值以及无网格数值方法。本文以该包为骨架系统讲解 RBF 的数学定义、RadialBasisFunction接口、六种内置基函数的公式与性质、尺度参数r₀的选取策略并结合仓库源码给出可运行的 Java 示例帮助读者在插值与神经网络场景中正确选型和调参。什么是径向基函数RBF径向基函数是一类取值只依赖于到某个固定中心点c距离的实值函数φ(x, c) φ( ‖x − c‖ )通常采用欧氏距离作为范数。径向基函数之和可以逼近任意函数y(x) Σᵢ wᵢ φ( ‖x − cᵢ‖ )其中中心点cᵢ通常从训练数据中选取权重wᵢ通过线性最小二乘求解。由于近似式对权重是线性的拟合过程既快又有完善的数值方法支撑。在 SMILE 的源码注释中见 RadialBasisFunction.java还特别指出该近似过程可以解释为一种简单的神经网络且已被用于时间序列预测、非线性系统的混沌控制以及计算机图形学中的 3D 重建如分层 RBF等场景。同时若采用概率度量probability metric对某些径向函数可以避免求解权重时出现的病态矩阵问题。RadialBasisFunction 接口smile.math.rbf包中所有类都实现RadialBasisFunction接口。该接口本身是空接口继承了smile.util.function.Function因此具备Serializable序列化能力以及两个核心方法public interface RadialBasisFunction extends Function { // Inherits: double f(double r) // Inherits: default double apply(double r) }每个 RBF 都可以作为关于距离r的一元函数直接调用RadialBasisFunction rbf new GaussianRadialBasis(1.0); double v rbf.f(2.5); // evaluate at distance r 2.5 double v2 rbf.apply(2.5); // same result — Scala / lambda friendly测试用例 RadialBasisFunctionTest.java 明确验证了f()与apply()返回值一致且所有 RBF 类都通过Function间接实现了java.io.Serializable这意味着它们可以被安全地序列化保存和传输。六种内置径向基函数smile.math.rbf包共提供 7 个类见 rbf 目录接口RadialBasisFunction加上 6 个具体实现。下面逐一介绍。Gaussian高斯φ(r) exp( −r² / (2 r₀²) )属性值φ(0)1值域(0, 1]单调性递减尾部快速衰减到 0高斯核是最流行的 RBF。对于光滑函数只要r₀选择得当可以获得非常高的插值精度但它对尺度参数很敏感。源码实现见 GaussianRadialBasis.javaf(r)先将r除以r₀再计算exp(-0.5·(r/r₀)²)。其 Javadoc 也提醒高斯基函数的插值精度对r₀极其敏感因此常因此被回避但对于光滑函数且r₀最优时可实现非常高的精度并且高斯核会在远离数据处快速把函数外推为 0。GaussianRadialBasis rbf new GaussianRadialBasis(1.0); // r₀ 1.0 double v rbf.f(0.0); // 1.0 double v2 rbf.f(2.0); // exp(-2) ≈ 0.135 // 查询尺度 double r0 rbf.scale(); // 1.0尺度效应r₀越小 → 核越尖锐、影响越局部r₀越大 → 核越平滑、影响越全局。GaussianRadialBasis sharp new GaussianRadialBasis(0.5); GaussianRadialBasis smooth new GaussianRadialBasis(2.0); // sharp.f(1.0) smooth.f(1.0)这一性质同样被测试覆盖testGaussianScaleEffect断言r₀0.5时在固定r0处的取值小于r₀2.0见 RadialBasisFunctionTest.java。Multiquadric多二次φ(r) sqrt( r² r₀² )属性值φ(0)r₀值域[r₀, ∞)单调性递增尾部无界增长多二次函数通常对r₀的选择不如其他 RBF 敏感。与衰减型 RBF 不同它随距离增长——插值时需要多项式修正项以保证系统适定性well-conditioned。实现见 MultiquadricRadialBasis.java其中构造函数缓存了r₀²以提升性能。MultiquadricRadialBasis rbf new MultiquadricRadialBasis(1.0); double v rbf.f(3.0); // sqrt(9 1) sqrt(10) ≈ 3.162 double r0 rbf.scale(); // 1.0Inverse Multiquadric逆多二次φ(r) 1 / sqrt( r² r₀² )属性值φ(0)1/r₀值域(0, 1/r₀]单调性递减尾部衰减到 0逆多二次在适定性方面与多二次表现类似但有上界且衰减到零性质更接近高斯。其 Javadoc 指出尽管听起来奇怪逆多二次的结果与多二次相当、有时更好因为真正重要的是光滑性以及函数傅里叶变换的某些性质而且逆多二次会把函数外推到远距离处为零。实现见 InverseMultiquadricRadialBasis.java。InverseMultiquadricRadialBasis rbf new InverseMultiquadricRadialBasis(1.0); double v rbf.f(0.0); // 1/sqrt(01) 1.0 double v2 rbf.f(3.0); // 1/sqrt(10) ≈ 0.316 // 与多二次的精确倒数关系 // imq.f(r) 1.0 / mq.f(r) (相同 r₀)这个倒数关系不是口头说法——测试testMultiquadricInverseRelationship对r ∈ [0, 5]逐点断言1/mq.f(r) imq.f(r)见 RadialBasisFunctionTest.java。Inverse Quadratic逆二次φ(r) 1 / ( 1 (r/r₀)² )属性值φ(0)1值域(0, 1]单调性递减尾部代数衰减比高斯重逆二次是完全单调函数completely monotone保证了正定性因而是合法的正定核positive-definite kernel。相比高斯它的尾部更重在需要捕捉长程相关时很有优势。值得注意的是φ(r₀) 1/(11) 0.5即距离恰好等于尺度时取值精确为 0.5测试testInverseQuadraticKnownValue对此做了断言。实现见 InverseQuadraticRadialBasis.java。InverseQuadraticRadialBasis rbf new InverseQuadraticRadialBasis(2.0); double v rbf.f(0.0); // 1.0 double v2 rbf.f(2.0); // 0.5 (at r r₀) double v3 rbf.f(6.0); // 1/(19) 0.1Thin Plate Spline薄板样条φ(r) r² log(r / r₀), φ(0) 0属性值φ(0)0极限值r r₀时符号负r r₀时符号正φ(r₀)0尾部以r² log r增长薄板样条源于弹性薄板弯曲的能量最小化问题——它在加权 Sobolev 意义下产生最光滑的插值函数。当r₀ 1时它与二阶PolyharmonicSpline完全等价。实现见 ThinPlateRadialBasis.java源码通过r 0.0 ? 0.0 : ...显式处理了φ(0)的极限值避免出现 NaN。ThinPlateRadialBasis rbf new ThinPlateRadialBasis(1.0); double v1 rbf.f(0.0); // 0.0 (not NaN) double v2 rbf.f(0.5); // negative (r r₀) double v3 rbf.f(1.0); // 0.0 (at r r₀) double v4 rbf.f(Math.E); // e² ≈ 7.389 (φ(e) e²·log(e/1) e²·1)Polyharmonic Spline多调和样条这是薄板样条以整数阶k参数化的推广实现见 PolyharmonicSpline.javak 为奇数φ(r) rᵏ k 为偶数φ(r) rᵏ log(r), φ(0) 0阶数公式常用名1r线性样条2r² log r薄板样条r₀ 13r³三次样条4r⁴ log r双调和样条5r⁵—高阶样条产生更光滑的插值但需要在基中加入更多多项式项以保持适定性。源码注释引用 Hardy1971的多二次地形插值工作与 Duchon1977的 Sobolev 空间极小化理论作为背景。PolyharmonicSpline linear new PolyharmonicSpline(1); // φ(r) r PolyharmonicSpline tps new PolyharmonicSpline(2); // φ(r) r² log r (默认) PolyharmonicSpline cubic new PolyharmonicSpline(3); // φ(r) r³ PolyharmonicSpline biharm new PolyharmonicSpline(4); // φ(r) r⁴ log r int k tps.order(); // 2 // k2 与 ThinPlateRadialBasis(1.0) 精确等价 double r 2.5; double v1 new PolyharmonicSpline(2).f(r); double v2 new ThinPlateRadialBasis(1.0).f(r); // v1 v2 // k3 是标准三次 RBF double v3 new PolyharmonicSpline(3).f(3.0); // 27.0k2与ThinPlateRadialBasis(1.0)的等价性同样被测试逐点验证testPolyharmonicOrder2EqualsThinPlate见 RadialBasisFunctionTest.java。注意PolyharmonicSpline的默认无参构造使用k2且构造函数要求k为正整数否则抛出IllegalArgumentException。汇总对比表类公式φ(0)尾部有界GaussianRadialBasisexp(−r²/2r₀²)1快速衰减✓ (0,1]InverseMultiquadricRadialBasis1/√(r²r₀²)1慢速衰减✓ (0,1]InverseQuadraticRadialBasis1/(1(r/r₀)²)1代数衰减✓ (0,1]MultiquadricRadialBasis√(r²r₀²)r₀增长✗ThinPlateRadialBasisr² log(r/r₀)0增长✗PolyharmonicSplinerᵏ或rᵏ log r0增长✗尺度参数r₀的 API 约定所有基于尺度的 RBF 都暴露scale()方法GaussianRadialBasis rbf1 new GaussianRadialBasis(2.0); MultiquadricRadialBasis rbf2 new MultiquadricRadialBasis(2.0); InverseMultiquadricRadialBasis rbf3 new InverseMultiquadricRadialBasis(2.0); InverseQuadraticRadialBasis rbf4 new InverseQuadraticRadialBasis(2.0); ThinPlateRadialBasis rbf5 new ThinPlateRadialBasis(2.0); rbf1.scale(); // 2.0所有构造函数都校验r₀ 0否则抛出IllegalArgumentException例如 GaussianRadialBasis.java 中的if (scale 0) throw new IllegalArgumentException(scale is not positive: scale)。测试testGaussianInvalidScale、testMultiquadricInvalidScale等对0.0与负值均断言抛出该异常。所有类也提供默认无参构造r₀ 1// 以下均使用 r₀ 1.0 GaussianRadialBasis g new GaussianRadialBasis(); MultiquadricRadialBasis m new MultiquadricRadialBasis(); InverseMultiquadricRadialBasis i new InverseMultiquadricRadialBasis(); InverseQuadraticRadialBasis q new InverseQuadraticRadialBasis(); ThinPlateRadialBasis t new ThinPlateRadialBasis(); PolyharmonicSpline p new PolyharmonicSpline(); // k2此外每个类的toString()都会格式化输出其参数如GaussianRadialBasis(r0 1.0000)、PolyharmonicSpline(k 2)便于日志调试。如何选择尺度r₀尺度参数对插值质量影响极大。通用经验法则是r₀应大于数据点之间的典型间距但小于被逼近函数的特征尺寸外部尺度。这一准则在 GaussianRadialBasis.java 与 MultiquadricRadialBasis.java 的 Javadoc 中都有明确阐述r₀的好坏选择可能造成插值精度相差数个数量级因此值得认真实验调参。最实用的调参手段是留一交叉验证leave-one-out cross-validation// LOO 尺度搜索伪代码 double bestR0 1.0; double bestError Double.MAX_VALUE; for (double r0 : candidates) { GaussianRadialBasis rbf new GaussianRadialBasis(r0); // 每次省略一个数据点构建插值器度量被省略点处的误差 double error leaveOneOutError(data, rbf); if (error bestError) { bestError error; bestR0 r0; } }在 RBF 网络中使用RBF NetworksSMILE 的 RBF 网络使用RadialBasisFunction实例定义每个隐层神经元的激活函数。网络模型位于 RBFNetwork.java每个神经元由 RBF.java 封装其激活计算为rbf.f(distance.d(x, center))——即先求样本到中心的度量距离再送入径向基函数。import smile.classification.RBFNetwork; import smile.model.rbf.RBF; // 拟合含 30 个神经元的 Gaussian RBF 网络 RBFNetworkdouble[] model RBFNetwork.fit(x, y, RBF.fit(x, 30)); // 自定义 RBF 类型 GaussianRadialBasis customRbf new GaussianRadialBasis(0.5); RBFdouble[][] neurons RBF.of(centers, customRbf, new EuclideanDistance()); RBFNetworkdouble[] model2 RBFNetwork.fit(x, y, neurons);RBF.fit(x, 30)在底层使用 K-Means 选取中心并自动估计高斯宽度默认宽度取d_max / sqrt(2k)d_max为中心间最大距离k为中心数该估计在数据均匀分布时接近最优见 RBF.java。RBF.of则支持传入自定义基函数与度量距离且校验基函数数量必须与中心数量一致RBF.java。RBFNetwork还提供了带normalize参数的fit重载以及基于Properties参数的版本见 RBFNetwork.java。在散乱数据插值中使用RBF InterpolationRBF 同样是散乱数据插值的主力方法。SMILE 的smile.interpolation包提供了泛型插值器 RBFInterpolation.java它直接接受任意RadialBasisFunctionimport smile.interpolation.RBFInterpolation; import smile.math.rbf.GaussianRadialBasis; double[][] x { /* 散乱数据点 */ }; double[] y { /* 对应函数值 */ }; // 普通 RBF 插值 RBFInterpolation interp new RBFInterpolation(x, y, new GaussianRadialBasis(1.0)); // 归一化 RBFNRBF插值 RBFInterpolation ninterp new RBFInterpolation(x, y, new GaussianRadialBasis(1.0), true); double v interp.interpolate(0.5, 0.5); // 在任意点求值从源码看RBFInterpolation.java构造时会构建 n×n 的 Gram 矩阵并用rbf.f(MathEx.distance(x[i], x[j]))填充随后求解线性方程组求权重当基函数是GaussianRadialBasis时走 Cholesky 分解否则走 LU 分解。归一化模式NRBF要求基函数之和为 1即sumw / sum见 RBFInterpolation.java该变体源自贝叶斯统计视角但源码注释也说明并无证据表明 NRBF 一贯优于普通 RBF。包内还提供了面向 1D / 2D 的便捷子类 RBFInterpolation1D.java 与 RBFInterpolation2D.java。此外在 RBFInterpolation.java 的类注释中总结了重要结论薄板样条的适定性对尺度缩放不变高斯、多二次与逆多二次都是无穷光滑的且包含形状参数r₀ 0减小r₀会使基函数更扁平增大r₀则能改善矩阵适定性放大的点间分离距离增大。如何选择正确的 RBF场景推荐一般插值GaussianRadialBasis调优r₀对r₀不太敏感MultiquadricRadialBasis光滑且有界的插值InverseMultiquadricRadialBasis重尾相关InverseQuadraticRadialBasis物理动机的光滑性ThinPlateRadialBasis或PolyharmonicSpline(2)C¹ 光滑、紧支撑PolyharmonicSpline(3)三次更高阶光滑性更大的k的PolyharmonicSpline(k)快速验证与测试仓库自带完整的单元测试 RadialBasisFunctionTest.java覆盖每个 RBF 的φ(0)值、已知点取值、单调性、有界性、scale()/order()访问器、默认构造、非法参数异常、toString()格式、跨函数性质如 IMQ 与 MQ 的倒数关系、k2 与薄板样条的等价性、衰减型 RBF 有界于 1以及Serializable能力。运行测试即可快速验证本文中所有数值示例的正确性。赞分享人工智能机器学习深度学习NLP大模型模型推理服务数据可视化【免费下载链接】smileStatistical Machine Intelligence Learning Engine项目地址https://gitcode.com/gh_mirrors/smi/smile点击查看免费下载上一篇OWASP MASTG 安全测试培训视频版权视频使用许可下一篇Formily vs 传统表单库终极性能对决与优势分析指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进