无需原始数据的高斯混合模型(GMM)合并方法咨询
合并无原始数据的高斯混合模型(GMM)方法探讨
已有的两种合并思路
思路1:直接拼接模型参数
提取两个GMM的权重、均值、协方差,按原始数据量加权权重后拼接,构建组件数为两者之和的新GMM。
伪代码:
import numpy as np from sklearn.mixture import GaussianMixture data_1=[1,2,1,3,1,2,5,2,1,2,7,6] data_2=[5,4,6,5,6,5,8,5,6,7,12,12,13,15,20] data_1 = np.expand_dims(data_1, 1) data_2 = np.expand_dims(data_2, 1) # 假设get_best_amount_Gaussians是已实现的最优组件数选择函数 n_comp_1=get_best_amount_Gaussians(data_1) n_comp_2=get_best_amount_Gaussians(data_2) gm1=GaussianMixture(n_components=n_comp_1) gm1.fit(data_1) gm2=GaussianMixture(n_components=n_comp_2) gm2.fit(data_2) n_comp_3=n_comp_1+n_comp_2 # 获取两个模型的核心参数 gm1_weights = gm1.weights_ gm1_means = gm1.means_ gm1_covs = gm1.covariances_ gm2_weights = gm2.weights_ gm2_means = gm2.means_ gm2_covs = gm2.covariances_ # 按原始数据量加权权重并归一化 total_data = len(data_1) + len(data_2) gm1_weights_scaled = gm1_weights * len(data_1) gm2_weights_scaled = gm2_weights * len(data_2) gm3_weights = np.concatenate((gm1_weights_scaled, gm2_weights_scaled), axis=0) gm3_weights /= total_data # 拼接均值和协方差 gm3_means = np.concatenate((gm1_means, gm2_means), axis=0) gm3_covs = np.concatenate((gm1_covs, gm2_covs), axis=0) # 初始化并赋值新模型 gm3 = GaussianMixture(n_components=n_comp_3) gm3.weights_ = gm3_weights gm3.means_ = gm3_means gm3.covariances_ = gm3_covs
- 缺点:组件数为两个模型之和,相似组件未合并,容易导致模型过于复杂。
思路2:基于采样数据重新拟合
从两个GMM中大量采样,用采样得到的数据集重新训练新GMM。
伪代码:
import numpy as np from sklearn.mixture import GaussianMixture # 从两个模型中批量采样 len_1 = int(1000 * len(data_1)) samples_1, _ = gm1.sample(len_1) len_2 = int(1000 * len(data_2)) samples_2, _ = gm2.sample(len_2) # 合并采样数据 combined_samples = np.concatenate((samples_1, samples_2), axis=0) # 确定最优组件数并拟合新模型 n_comp_3 = get_best_amount_Gaussians(combined_samples) gm3 = GaussianMixture(n_components=n_comp_3) gm3.fit(combined_samples)
- 缺点:大样本采样会带来较高的计算成本。
其他可行方法
方法1:组件聚类合并
对两个GMM的所有组件(均值、协方差、加权权重)进行聚类,合并相似组件以简化模型:
- 以组件的均值向量为核心特征(可结合协方差矩阵的距离 metric),用K-Means或层次聚类将组件分组;
- 对每组内的组件计算合并后的参数:
- 权重:组内所有组件的加权权重之和;
- 均值:按组内组件权重加权平均所有均值;
- 协方差:使用混合协方差公式计算,兼顾组件自身协方差和均值偏差:
$$\Sigma_{merged} = \frac{\sum_{k} w_k (\Sigma_k + (\mu_k - \mu_{merged})(\mu_k - \mu_{merged})^T)}{\sum_{k} w_k}$$
其中$w_k$为组内第k个组件的权重,$\Sigma_k$为其协方差,$\mu_k$为其均值,$\mu_{merged}$为组内加权平均均值。
该方法无需原始数据,既能保留原始分布信息,又能通过聚类避免模型冗余。
方法2:增量EM迭代优化
以思路1的拼接参数为初始值,执行少量EM迭代优化模型,自动合并相似组件:
- 按思路1的方法拼接两个GMM的参数,作为新GMM的初始值;
- 执行少量EM迭代:无需原始数据,可通过组件自身分布计算虚拟责任(responsibility),或用少量采样辅助迭代(采样量远小于思路2);
- 迭代后模型会自动调整参数,合并相似组件,优化整体拟合效果。
这种方法计算成本低,同时能在原始参数基础上简化模型结构。
方法3:矩匹配合并
通过匹配合并后分布的前几阶矩(均值、协方差等),构建近似的新GMM:
- 分别计算两个GMM的整体均值、协方差矩阵:
- 整体均值:$\mu_{total} = w_1 \mu_{gm1} + w_2 \mu_{gm2}$,其中$w_1 = len(data_1)/(len(data_1)+len(data_2))$,$\mu_{gm1}$为gm1的加权平均均值;
- 整体协方差:$\Sigma_{total} = w_1 (\Sigma_{gm1} + (\mu_{gm1} - \mu_{total})(\mu_{gm1} - \mu_{total})^T) + w_2 (\Sigma_{gm2} + (\mu_{gm2} - \mu_{total})(\mu_{gm2} - \mu_{total})^T)$,其中$\Sigma_{gm1}$为gm1的加权平均协方差;
- 根据计算出的整体矩,选择合适的组件数拟合新GMM。
该方法计算量极小,但会丢失原始模型的多峰细节,适合仅需保留分布整体特征的场景。
内容的提问来源于stack exchange,提问作者Jawis
相关产品推荐
相关产品推荐

