如何将实现KDE计算与可视化的R脚本改写为Python脚本
KDE计算与可视化的Python实现方案
以下代码完全复现你提供的R代码逻辑,运行效果和R版本完全一致,仅依赖numpy、matplotlib两个常用数据计算与可视化库:
import numpy as np import matplotlib.pyplot as plt # 对应原R代码的输入数据与参数 data = np.array([65, 75, 67, 79, 81, 91]) h = 5.5 kernelpoints = np.arange(50, 151, 1) # 匹配R的seq(50,150,1),np.arange左闭右开所以上限设为151 # 初始化画布与坐标轴范围 plt.figure() plt.xlim(50, 120) plt.ylim(0, 0.04) plt.xlabel('X') plt.ylabel('K (= density)') # 逐点计算每个数据对应的核密度曲线 kde_list = [] n_data = len(data) for val in data: z = (kernelpoints - val) / h multi = 1 / np.sqrt(2 * np.pi) kerneld = (multi * np.exp(-0.5 * z ** 2)) / (n_data * h) plt.plot(kernelpoints, kerneld, linewidth=3, c="#1f77b4") kde_list.append(kerneld) # 计算叠加后的总KDE曲线并绘制 kde_sum = np.sum(np.array(kde_list), axis=0) plt.plot(kernelpoints, kde_sum, linewidth=3, c="red") # 匹配原R代码的网格设置 plt.grid(visible=True, alpha=0.7) plt.xticks(np.linspace(50, 120, 20)) plt.yticks(np.linspace(0, 0.04, 20)) plt.show()
如果希望调用成熟的第三方库简化实现,也可以使用scipy的gaussian_kde接口,注意需要手动对齐你设置的带宽参数:
from scipy.stats import gaussian_kde # 手动指定带宽和你设置的h=5.5对齐,scipy的bw_method参数需要除以数据的标准差完成适配 kde_model = gaussian_kde(data, bw_method= h / data.std(ddof=1)) kde_sum = kde_model(kernelpoints)
手动实现的版本无任何隐藏参数,和原R代码逻辑1:1对齐,不会出现效果偏差。
内容的提问来源于stack exchange,提问作者Minecraft_Json
相关产品推荐
相关产品推荐

