You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在考虑权重的情况下对带权重的点进行插值?(Python实现)

带权重的平滑插值Python实现

核心思路

通过权重映射调整插值参数空间,让高权重的点在插值过程中占据更大的有效区间,实现“挤压”其他点位置的效果,同时用三次样条保证插值的平滑性。

代码实现

import numpy as np
from scipy.interpolate import CubicSpline

def weighted_smooth_interpolate(points, num_samples=100):
    # 提取原始点的位置与权重
    x = np.array([p[0] for p in points])
    w = np.array([p[1] for p in points])
    
    # 避免权重为0导致计算错误
    w = np.maximum(w, 1e-6)
    
    # 归一化权重并计算累积权重,构建权重参数空间
    w_normalized = w / np.sum(w)
    cumulative_w = np.cumsum(w_normalized)
    # 补全首尾,确保参数空间落在[0,1]区间
    cumulative_w = np.concatenate([[0], cumulative_w])
    x = np.concatenate([[x[0]], x])
    
    # 创建从权重空间到原始位置空间的平滑样条插值函数
    spline = CubicSpline(cumulative_w, x)
    
    # 在权重空间均匀采样,映射回原始位置空间得到插值结果
    t_samples = np.linspace(0, 1, num_samples)
    x_interp = spline(t_samples)
    
    return t_samples, x_interp

使用示例

# 定义带权重的点集
points = [(0.1, 1), (0.3, 5), (0.6, 2), (0.9, 1)]
# 生成插值结果
t_samples, x_interp = weighted_smooth_interpolate(points)

# 可视化验证(可选)
import matplotlib.pyplot as plt
plt.scatter([p[0] for p in points], [0]*len(points), s=[p[1]*20 for p in points], label='原始点(大小对应权重)')
plt.plot(x_interp, np.zeros_like(x_interp), label='带权重平滑插值')
plt.legend()
plt.show()

原理说明

  1. 权重归一化:将所有点的权重转化为占比,避免单个权重过大干扰整体分布。
  2. 累积权重空间:高权重的点会在累积权重序列中占据更长的区间,相当于在插值时给这些点分配了更多的“分辨率”。
  3. 三次样条插值:基于权重空间与原始位置空间的映射关系,生成平滑的插值曲线,最终在原始空间中呈现出高权重点挤压周围位置的效果。

内容的提问来源于stack exchange,提问作者user16909741

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:10:20