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

如何计算sklearn.mixture.GaussianMixture拟合模型的标准差与中位数

获取GaussianMixture拟合模型的标准差与中位数

标准差获取方式

scikit-learn的GaussianMixture类拟合完成后,会通过covariances_属性返回每个高斯分量的协方差矩阵,一维场景下协方差矩阵的唯一元素就是分量的方差,对其开平方即可得到标准差,示例代码如下:

# 取第一个分量的协方差,一维数据下直接提取方差值
variance = gmm.covariances_[0][0][0]
# 计算标准差
std = np.sqrt(variance)
print(std)

如果是多分量场景,遍历covariances_中每个分量的协方差矩阵分别计算即可。

中位数获取方式

分两种场景处理:

  • 单分量场景(n_components=1):单个高斯分布的中位数与均值完全相等,直接取gmm.means_[0][0]即可得到拟合模型的中位数
  • 多分量场景(n_components>1):需要先计算混合分布的累积分布函数,再通过二分法反推中位数,示例代码如下:
from scipy.stats import norm

def gmm_cdf(x, gmm):
    cdf = 0
    # 累加所有分量的加权累积分布概率
    for weight, mean, cov in zip(gmm.weights_, gmm.means_, gmm.covariances_):
        comp_std = np.sqrt(cov[0][0])
        cdf += weight * norm.cdf(x, loc=mean[0], scale=comp_std)
    return cdf

# 二分法求解累计概率为0.5对应的x值,即中位数
left_bound = data.min()
right_bound = data.max()
# 迭代100次精度可满足绝大多数需求
for _ in range(100):
    mid_val = (left_bound + right_bound) / 2
    if gmm_cdf(mid_val, gmm) < 0.5:
        left_bound = mid_val
    else:
        right_bound = mid_val
gmm_median = (left_bound + right_bound) / 2
print(gmm_median)

注意:你当前的用例是用单分量高斯拟合偏态分布数据,得到的拟合结果是对称高斯分布,和原始偏态数据的实际中位数会存在偏差。如果需要更高的拟合精度,可以适当增加GMM的分量数量,或者直接使用偏态分布的专用拟合接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:01