如何计算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
相关产品推荐
相关产品推荐

