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

如何修复R绘制混合分布等高线图时x and mean have non-conforming size错误

问题修复方案

错误原因

  • 你要绘制二维等高线,传入mvtnorm::dmvnorm的data.grid是2列的二维数据,要求对应正态分布的均值为长度2的向量,但你当前设置的mu1为2行3列的矩阵,维度不匹配触发报错。
  • 如果你要实现3组分二元混合高斯分布的等高线,不能直接将多组分均值矩阵传入dmvnorm的mean参数,需要单独计算每个组分的密度后按权重求和。

修复代码

场景1:绘制单组分二元正态等高线

如果你只需要绘制单个二元正态分布的等高线,调整mu1为长度2的均值向量即可:

# 调整为长度为2的均值向量,对应二维数据维度
mu1 <- c(0.2765799, 2.30699)
sigma1 <- matrix(c(0.9796896, -0.5666977, -0.5666977, 1.0509883), ncol = 2)
data.grid <- expand.grid(seq1 = seq(1,10, length.out = 200), seq2 = seq(0, 5, length.out = 200))
# 计算单组分密度
samp <- cbind(data.grid, prob = mvtnorm::dmvnorm(data.grid, mean = mu1, sigma = sigma1))
# 绘图
library(ggplot2)
ggplot(samp, aes(x=seq1, y=seq2, z=prob)) + 
  geom_contour() + 
  labs(x = "Sepal Length", y = "Sepal Width")

场景2:绘制3组分二元混合高斯等高线

如果你需要绘制混合分布,首先调整mu1为3行2列的矩阵(每行对应一个组分的二维均值),再分别计算各组分密度后加权求和:

# 调整为3行2列的均值矩阵,每行对应一个组分的二维均值
mu1 <- matrix(c(0.2765799, 2.30699, 0.4268534, 2.6254749, -1.30049, -0.9883130), nrow = 3, ncol = 2, byrow = TRUE)
# 共用协方差矩阵,你也可以为每个组分单独设置对应协方差
sigma1 <- matrix(c(0.9796896, -0.5666977, -0.5666977, 1.0509883), ncol = 2)
# 混合权重,可根据你的实际拟合结果调整,这里默认三个组分权重相等
weights <- c(1/3, 1/3, 1/3)

# 调整坐标范围覆盖所有组分的取值区间
data.grid <- expand.grid(seq1 = seq(-3,10, length.out = 200), seq2 = seq(-2, 5, length.out = 200))

# 分别计算每个组分的密度,加权求和得到混合密度
prob <- rep(0, nrow(data.grid))
for(i in 1:nrow(mu1)){
  prob <- prob + weights[i] * mvtnorm::dmvnorm(data.grid, mean = mu1[i,], sigma = sigma1)
}
samp <- cbind(data.grid, prob = prob)

# 绘图
library(ggplot2)
ggplot(samp, aes(x=seq1, y=seq2, z=prob)) + 
  geom_contour() + 
  labs(x = "Sepal Length", y = "Sepal Width")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:30:00