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

如何在Scikit-Learn中获取GMM模型对应的累积分布函数(CDF)

Scikit-Learn 高斯混合模型获取累积分布函数实现方案

接口支持情况

当前Scikit-Learn官方的GaussianMixture类没有提供直接计算累积分布函数(CDF)的内置方法,需要基于高斯混合模型的数学定义手动实现,实现成本很低。

实现逻辑

高斯混合模型的CDF本质是所有单高斯成分的CDF按混合权重加权求和的结果:

  • 每个单高斯成分的CDF可以直接调用scipy.stats.norm.cdf计算
  • 最终GMM的CDF值 = Σ(第i个成分的权重 * 第i个成分在x处的CDF值)

具体代码实现

import numpy as np
from scipy.stats import norm
from sklearn.mixture import GaussianMixture

# 以下为示例流程,可替换为你自己的拟合逻辑
# 这里sps_data为你预处理后的太阳能电站发电量一维数组
# gmm = GaussianMixture(n_components=5, random_state=42) # 成分数按你自己的参数设置
# gmm.fit(sps_data.reshape(-1, 1))

def calculate_gmm_cdf(x, trained_gmm):
    """
    计算已拟合GMM在指定x位置的CDF值
    参数:
        x: 标量或numpy数组,待计算CDF的自变量
        trained_gmm: 已经完成拟合的sklearn GaussianMixture实例
    返回:
        对应x位置的CDF值,取值范围在[0,1]
    """
    total_cdf = 0
    # 遍历所有混合成分累加计算
    for weight, mean, cov in zip(trained_gmm.weights_, trained_gmm.means_, trained_gmm.covariances_):
        # 单变量场景下提取标准差
        std = np.sqrt(cov[0])
        total_cdf += weight * norm.cdf(x, loc=mean[0], scale=std)
    return total_cdf

# 生成全范围CDF序列用于绘图示例
x_min, x_max = sps_data.min() * 0.9, sps_data.max() * 1.1 # 扩展边界避免截断
x_sample = np.linspace(x_min, x_max, 1000)
cdf_value = calculate_gmm_cdf(x_sample, gmm)
# 后续直接用plt.plot(x_sample, cdf_value)即可得到你需要的单调递增CDF曲线

注意事项

  • 如果你处理的是多变量数据,将scipy.stats.norm.cdf替换为scipy.stats.multivariate_normal.cdf即可
  • 绘图时x轴采样点建议设置在1000个以上,保证CDF曲线平滑
  • 最终输出的cdf_value天然满足y轴取值在[0,1]、全程单调递增的要求

内容的提问来源于stack exchange,提问作者Валерий Гамалей

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 14:45:04