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

Python计算Student-t分布自由度出错,请求排查修正

排查Student-t分布自由度计算的代码问题

我帮你找出了两处关键错误,这应该就是导致结果不对的核心原因:

1. 样本标准差计算错误

你的stdev函数计算的是总体标准差(直接除以样本数量len(X)),但在计算Welch-Satterthwaite自由度时,我们需要用样本标准差(除以len(X)-1,这是总体标准差的无偏估计量)。

修正后的标准差函数应该是:

def stdev(X):
    m = mean(X)
    return math.sqrt(sum((x-m)**2 for x in X) / (len(X) - 1))

2. 自由度公式的括号位置错误

在degreesOfFreedom函数的分母部分,你对第二个样本的处理写错了括号逻辑:
原代码中这部分:

(s2 / len(Y))**2 / len(Y) - 1

会被Python解析为((s2/len(Y))² / len(Y)) - 1,完全偏离了公式要求。正确的写法应该是将len(Y)-1作为整个项的除数,也就是:

(s2 / len(Y))**2 / (len(Y) - 1)

修正后的完整代码

import math

def mean(X):
    return sum(X) / len(X)

def stdev(X):
    m = mean(X)
    return math.sqrt(sum((x-m)**2 for x in X) / (len(X) - 1))

def degreesOfFreedom(X, Y):
    n1 = len(X)
    n2 = len(Y)
    s1_sq = stdev(X)**2
    s2_sq = stdev(Y)**2
    
    numerator = (s1_sq / n1 + s2_sq / n2)**2
    denominator = (s1_sq / n1)**2 / (n1 - 1) + (s2_sq / n2)**2 / (n2 - 1)
    df = numerator / denominator
    return df

# 假设A和B是你的样本数据
# A = [1,2,3,...]
# B = [4,5,6,...]
print('Degrees of freedom for Student-t distribution: ' + str(degreesOfFreedom(A, B)))

我额外加了n1和n2变量让代码更易读,避免重复调用len()。现在这个版本应该能正确计算Welch-Satterthwaite自由度了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:04:10