怀化网站优化联系方式,装修是全包划算还是半包划算,西安专业网站建设,枣庄住房和城乡建设厅网站目录
#x1f30c; 序章#xff1a;星空下的概率分布
#x1f914; 困境#xff1a;当聚类需要 “灰度地带”
生活里的 “模糊归属”
数据里的 “混合高斯密码”
#x1f680; 破局#xff1a;EM 算法 —— 在 “猜测” 与 “验证” 中逼近真相
核心思路#xff1…目录 序章星空下的概率分布 困境当聚类需要 “灰度地带”生活里的 “模糊归属”数据里的 “混合高斯密码” 破局EM 算法 —— 在 “猜测” 与 “验证” 中逼近真相核心思路两步迭代逼近最优解数学支撑概率公式的通俗解读 实践用 GMM 给数据 “算归属概率”MATLAB 实现运行说明 终章概率视角下的聚类智慧 序章星空下的概率分布夏夜的星空肉眼望去是杂乱无章的光点。但天文学家知道这些星星并非随机散落 —— 它们分属不同的星团每个星团都有自己的 “核心”均值和 “分布范围”方差。有的星团密集紧凑有的星团稀疏分散却都遵循着某种概率规律聚集。“技术是量化不确定性的艺术让数据的归属不再只有‘是’或‘否’。” 高斯混合模型GMM正是这样一种概率化聚类工具它假设数据来自多个高斯分布的混合不生硬地给数据点贴 “唯一标签”而是输出每个点属于各个簇的概率就像判断一颗星星 “大概率属于猎户座”“小概率属于金牛座”让聚类结果更具柔性与解释力。 困境当聚类需要 “灰度地带”生活里的 “模糊归属”你是否有过这样的纠结一款同时包含 “办公” 和 “娱乐” 功能的 APP该归为 “ productivity 工具” 还是 “休闲应用”一位既喜欢健身又热爱阅读的用户该划入 “运动爱好者” 还是 “文艺青年”传统硬聚类算法如 K-means会给出明确答案 —— 非此即彼。但现实中的数据往往没有绝对的边界用户行为是多元的数据分布是重叠的。硬聚类就像用剪刀生硬地切割重叠的纸张而我们需要的是一把能衡量 “重叠程度” 的尺子这正是 GMM 的核心价值。数据里的 “混合高斯密码”GMM 的核心假设很简单复杂数据是多个简单高斯分布的叠加。每个高斯分布对应一个 “簇”包含三个关键信息均值μ簇的 “中心位置”就像星团的核心协方差Σ簇的 “形状与大小”圆形、椭圆形都能拟合混合系数π簇的 “权重”代表该簇在整体数据中占比多少。例如用户行为数据可能由 “高频办公”“高频娱乐”“均衡使用” 三个高斯分布混合而成。GMM 的任务就是从数据中拆解出这三个分布的参数并用概率表示每个用户属于不同分布的可能性。 破局EM 算法 —— 在 “猜测” 与 “验证” 中逼近真相GMM 的参数估计找 μ、Σ、π依赖 EM 算法期望最大化算法这个过程就像侦探破案先根据线索做 “初步猜测”E 步再根据猜测优化 “证据链”M 步反复迭代直到真相浮出水面。核心思路两步迭代逼近最优解E 步期望步给每个数据点 “算概率”假设我们已经有了初步的簇参数比如随机设定的 μ、Σ、π计算每个数据点属于各个簇的后验概率 γjk——“点 j 属于簇 k 的概率是多少”。这一步就像侦探根据现有线索判断嫌疑人的作案概率。M 步最大化步更新簇参数 “更合理”基于 E 步得到的概率 γjk重新计算每个簇的参数混合系数 πk所有点属于簇 k 的概率平均值簇 k 的 “占比”均值 μk数据点的 “加权平均”权重是 γjk概率越高对均值的影响越大协方差 Σk数据点相对于均值的 “加权方差”同样以 γjk 为权重描述簇的形状。这一步就像侦探根据作案概率调整对线索的解读让证据链更贴合嫌疑人特征。迭代收敛直到参数不再变化重复 E 步和 M 步直到簇参数的变化量小于阈值比如 1e-6此时算法收敛得到最终的混合高斯模型。数学支撑概率公式的通俗解读设数据点为 xj共 n 个簇的数量为 K高斯分布的概率密度函数为 N (xj|μk,Σk)点 xj 在簇 k 中的概率密度则后验概率E 步\(\gamma_{jk} \frac{\pi_k N(x_j|\mu_k, \Sigma_k)}{\sum_{i1}^K \pi_i N(x_j|\mu_i, \Sigma_i)}\)分子是 “点 j 属于簇 k 的联合概率”分母是 “点 j 属于所有簇的总概率”整体表示 “在所有可能性中点 j 属于簇 k 的占比”。参数更新M 步\(\pi_k \frac{1}{n}\sum_{j1}^n \gamma_{jk}, \quad \mu_k \frac{\sum_{j1}^n \gamma_{jk} x_j}{\sum_{j1}^n \gamma_{jk}}, \quad \Sigma_k \frac{\sum_{j1}^n \gamma_{jk} (x_j-\mu_k)(x_j-\mu_k)^T}{\sum_{j1}^n \gamma_{jk}}\)本质是 “以概率为权重的加权计算”让参数更贴合数据的实际分布。 实践用 GMM 给数据 “算归属概率”MATLAB 实现以下代码手动实现高斯混合模型不依赖 MATLAB 内置聚类函数通过二维数据展示软聚类效果并对比不同初始值对结果的影响。% 高斯混合模型GMM聚类算法实现软聚类 % 功能对二维数据进行概率化聚类输出每个数据点属于各簇的概率对比不同初始值的影响 % 日期2025-12-12 close all; clear;clc; %% 1. 生成测试数据3个重叠的高斯分布混合 rng(2); % 固定随机种子确保结果可复现 % 簇1中心(5,5)圆形分布协方差矩阵为对角矩阵 mu1 [5, 5]; sigma1 [2, 0; 0, 2]; % 方差小分布紧凑 data1 mvnrnd(mu1, sigma1, 200); % 200个数据点 % 簇2中心(10,10)椭圆形分布协方差矩阵非对角 mu2 [10, 10]; sigma2 [3, 1.5; 1.5, 2]; % 沿对角线拉伸 data2 mvnrnd(mu2, sigma2, 200); % 簇3中心(5,10)稀疏分布 mu3 [5, 10]; sigma3 [4, 0; 0, 3]; % 方差大分布稀疏 data3 mvnrnd(mu3, sigma3, 150); % 合并数据 data [data1; data2; data3]; n size(data, 1); % 总数据点数量 K 3; % 预设簇数量GMM需指定K区别于均值漂移 %% 2. GMM核心算法实现EM迭代 % 参数设置 max_iter 200; % 最大迭代次数 tol 1e-6; % 收敛阈值参数变化小于此值则停止 init_methods {random, kmeans}; % 两种初始值方案随机初始化、K-means初始化 % 存储不同初始值的结果 gamma_all cell(length(init_methods), 1); % 后验概率矩阵n×K params_all cell(length(init_methods), 1); % 最终参数mu, sigma, weights for m 1:length(init_methods) init_method init_methods{m}; fprintf(正在使用【%s】初始化GMM...\n, init_method); % ---------------------- 步骤1初始化参数 ---------------------- if strcmp(init_method, random) % 随机初始化均值在数据范围内随机取协方差为单位矩阵混合系数均等 data_range range(data); data_min min(data); mu rand(K, 2) .* data_range data_min; % K×2均值矩阵 sigma repmat(eye(2), 1, 1, K); % 2×2×K协方差矩阵初始为单位矩阵 weights ones(1, K) / K; % 混合系数均等使用weights代替pi else % K-means初始化更稳定避免局部最优 % 先用K-means得到硬聚类标签再以此计算初始参数 [idx, centers] kmeans(data, K, Replicates, 3); mu centers; % K-means中心作为初始均值 sigma repmat(eye(2), 1, 1, K); weights zeros(1, K); for k 1:K cluster_data data(idx k, :); weights(k) size(cluster_data, 1) / n; % 混合系数簇内点数/总点数 if size(cluster_data, 1) 1 sigma(:, :, k) cov(cluster_data); % 协方差簇内数据的协方差 end end end % 记录迭代过程中的参数用于判断收敛 mu_prev mu; weights_prev weights; conv_flag false; % ---------------------- 步骤2EM迭代 ---------------------- for iter 1:max_iter % ---------------------- E步计算后验概率gamma(jk) ---------------------- gamma zeros(n, K); % n×K矩阵gamma(j,k)点j属于簇k的概率 % 为每个数据点计算属于每个簇的概率 for j 1:n xj data(j, :); probabilities zeros(1, K); for k 1:K mu_k mu(k, :); sigma_k sigma(:, :, k); % 计算高斯概率密度 diff xj - mu_k; % 确保协方差矩阵正定 sigma_k sigma_k eye(2) * 1e-6; % 计算逆矩阵和行列式 inv_sigma inv(sigma_k); det_sigma det(sigma_k); % 数值稳定性处理 if det_sigma 0 det_sigma eps; end % 计算马氏距离 mahalanobis diff * inv_sigma * diff; % 计算高斯概率密度 normalization_factor 1 / (2 * pi * sqrt(det_sigma)); % 使用内置的pi常数 exponent -0.5 * mahalanobis; % 防止数值下溢 if exponent -500 gauss_prob 0; else gauss_prob normalization_factor * exp(exponent); end probabilities(k) weights(k) * gauss_prob; end % 归一化得到后验概率 total_prob sum(probabilities); if total_prob 0 gamma(j, :) probabilities / total_prob; else gamma(j, :) 1/K; % 均匀分布 end end % ---------------------- M步更新参数weights, mu, sigma ---------------------- % 1. 更新混合系数weights(k) 平均后验概率 weights mean(gamma, 1); % 2. 更新均值mu(k) 加权平均权重为gamma(jk) mu zeros(K, 2); for k 1:K cluster_weights gamma(:, k); total_weight sum(cluster_weights); if total_weight eps mu(k, :) sum(data .* cluster_weights, 1) / total_weight; else mu(k, :) mu_prev(k, :); end end % 3. 更新协方差sigma(k) 加权协方差 for k 1:K cluster_weights gamma(:, k); total_weight sum(cluster_weights); mu_k mu(k, :); if total_weight eps % 计算加权协方差 weighted_cov zeros(2, 2); for j 1:n diff (data(j, :) - mu_k); weighted_cov weighted_cov cluster_weights(j) * (diff * diff); end sigma(:, :, k) weighted_cov / total_weight; end % 确保协方差矩阵正定 sigma(:, :, k) sigma(:, :, k) eye(2) * 1e-6; end % ---------------------- 检查收敛 ---------------------- mu_diff max(max(abs(mu - mu_prev))); weights_diff max(abs(weights - weights_prev)); if mu_diff tol weights_diff tol conv_flag true; fprintf(迭代%d次后收敛\n, iter); break; end % 更新前一次参数 mu_prev mu; weights_prev weights; end if ~conv_flag fprintf(警告达到最大迭代次数可能未完全收敛\n); end % 存储结果 gamma_all{m} gamma; params_all{m} struct(mu, mu, sigma, sigma, weights, weights); end %% 3. 可视化结果 % 图1原始数据分布 figure(Name,原始数据3个重叠高斯分布,Position,[100 100 600 500]); scatter(data(:,1), data(:,2), 30, b, ., MarkerEdgeAlpha, 0.6); title(原始数据3个重叠的高斯分布混合); xlabel(X); ylabel(Y); grid on; axis equal; % 图2不同初始值的聚类效果对比硬聚类标签取概率最大的簇 figure(Name,不同初始值的GMM聚类效果,Position,[200 200 1200 500]); colors lines(K); % 预先定义颜色 for m 1:length(init_methods) gamma gamma_all{m}; params params_all{m}; % 硬聚类标签概率最大的簇 [~, cluster_idx] max(gamma, [], 2); subplot(1, 2, m); hold on; % 绘制数据点按簇着色 for k 1:K scatter(data(cluster_idx k, 1), data(cluster_idx k, 2), ... 30, colors(k, :), x, MarkerEdgeAlpha, 0.9); end % 绘制簇中心 for k 1:K scatter(params.mu(k, 1), params.mu(k, 2), 150, r*, LineWidth, 2); end title([GMM聚类结果, init_methods{m}, 初始化]); xlabel(X); ylabel(Y); grid on; axis equal; hold off; end % 图3软聚类概率示例展示前5个数据点的归属概率 figure(Name,软聚类概率示例,Position,[300 300 800 400]); % 取K-means初始化的概率矩阵更稳定 gamma_example gamma_all{2}; data_idx 1:min(5, n); % 展示前5个点确保不超过数据点总数 prob_matrix gamma_example(data_idx, :); % 绘制概率热力图 subplot(1, 2, 1); imagesc(prob_matrix); colorbar; xlabel(簇编号); ylabel(数据点编号); title(前5个数据点的归属概率热力图); set(gca, XTick, 1:K, XTickLabel, 1:K); set(gca, YTick, 1:length(data_idx), YTickLabel, data_idx); % 绘制概率柱状图 subplot(1, 2, 2); bar_width 0.25; x 1:length(data_idx); hold on; for k 1:K bar(x (k-1)*bar_width, prob_matrix(:, k), bar_width, FaceColor, colors(k, :)); end xlabel(数据点编号); ylabel(归属概率); title(前5个数据点的归属概率分布); legend({簇1, 簇2, 簇3}, Location, best); set(gca, XTick, x); grid on; hold off; %% 4. 结果解读 disp( 结果解读 ); fprintf(数据点总数: %d\n, n); fprintf(簇数量: %d\n, K); disp(1. 软聚类特性GMM输出每个点属于各簇的概率而非唯一标签适合数据重叠场景); disp(2. 初始值影响); disp( - random初始化易陷入局部最优可能导致簇参数偏离真实分布); disp( - kmeans初始化先通过硬聚类锁定大致簇位置再优化概率参数结果更稳定、收敛更快); % 显示最终的混合系数 for m 1:length(init_methods) params params_all{m}; fprintf(\n%s初始化的最终混合系数:\n, init_methods{m}); for k 1:K fprintf( 簇%d: %.4f\n, k, params.weights(k)); end end disp(3. 适用场景适合数据近似高斯分布、需要概率解释的场景如用户行为分群输出用户属于各群体的概率。); %% 5. 运行说明 disp( 运行说明 ); disp(1. 脚本自动生成3个重叠的高斯分布数据无需额外准备数据); disp(2. 运行后生成3个可视化窗口原始数据分布、不同初始值的聚类效果、软聚类概率示例); disp(3. 可修改K值簇数量、max_iter迭代次数或tol收敛阈值调整算法性能);运行说明脚本自动生成 3 个重叠的高斯分布数据无需额外准备包含 550 个数据点采用两种初始值方案随机初始化、K-means 初始化对比验证初始值对 GMM 的影响运行后生成 3 个可视化窗口原始数据分布、聚类效果对比、软聚类概率示例代码无额外工具箱依赖使用 MATLAB 自带函数mvnrnd 生成高斯数据、kmeans 辅助初始化可直接复制运行。 终章概率视角下的聚类智慧GMM 的魅力在于它承认数据的 “模糊性” 与 “不确定性”。在现实世界中很少有事物能被绝对归类 —— 用户的兴趣是多元的交易的特征是重叠的声音的频率是连续的。GMM 用概率为这些模糊性建模让聚类结果不再是冰冷的标签而是有温度的 “可能性描述”。它的优势显而易见支持软聚类、能拟合复杂的多峰分布、提供概率解释这让它在用户行为分群、金融欺诈检测、语音识别等场景中大放异彩。但它也有局限需要提前指定 K 值、对初始值敏感、不适合非高斯分布数据 —— 这提醒我们没有万能的算法只有最适合数据特性的工具。技术的进步往往源于对现实复杂性的接纳。GMM 没有强行将数据 “一刀切”而是用概率的语言倾听数据的多元诉求这正是它的人文温度。当我们学会用 “大概率”“小概率” 看待世界不仅能更好地理解数据也能更包容地看待生活中的各种 “模糊地带”。