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

Python绘制CDF图异常:y轴未达0-1仅到0.12求排查

问题描述

我尝试在Python中绘制CDF(累积分布函数)图,预期y轴数值范围为0到1,但实际仅显示到0.12,无法定位问题原因。相关实现代码如下:

def plot_cdf_differences(data):
    data['differences'] = data.apply(lambda e: abs(e.inner_distance_speed - e.inner_distance_lsq), axis=1)
    counts, bin_edges = np.histogram(data['differences'], bins=200, density=True)
    cdf = np.cumsum(counts)

    plt.plot(bin_edges[1:], cdf)
    plt.xlabel('Differences')
    plt.ylabel('CDF')
    plt.show()
问题原因与解决办法

问题出在np.histogram设置density=True时,返回的counts是概率密度而非概率值。直接累加密度值无法得到0到1范围的累积概率——概率密度需要乘以区间宽度,才能得到对应区间的概率,再累加才是正确的CDF。

修正方案一(基于密度计算)

计算每个区间的宽度,用密度乘以宽度得到区间概率后再累加:

import numpy as np
import matplotlib.pyplot as plt

def plot_cdf_differences(data):
    data['differences'] = data.apply(lambda e: abs(e.inner_distance_speed - e.inner_distance_lsq), axis=1)
    counts, bin_edges = np.histogram(data['differences'], bins=200, density=True)
    # 计算每个区间的宽度
    bin_widths = np.diff(bin_edges)
    # 密度×宽度得到区间概率,累加后得到CDF
    cdf = np.cumsum(counts * bin_widths)

    plt.plot(bin_edges[1:], cdf)
    plt.xlabel('差异值')
    plt.ylabel('CDF')
    plt.ylim(0, 1)  # 可选:强制锁定y轴范围为0-1
    plt.show()

修正方案二(基于样本数量计算)

不使用density=True,直接用样本数量计算:累加区间样本数后除以总样本数,得到累积概率:

import numpy as np
import matplotlib.pyplot as plt

def plot_cdf_differences(data):
    data['differences'] = data.apply(lambda e: abs(e.inner_distance_speed - e.inner_distance_lsq), axis=1)
    counts, bin_edges = np.histogram(data['differences'], bins=200)
    # 累加样本数后除以总样本数,得到0-1范围的CDF
    cdf = np.cumsum(counts) / len(data['differences'])

    plt.plot(bin_edges[1:], cdf)
    plt.xlabel('差异值')
    plt.ylabel('CDF')
    plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:40:13