Matlab最小二乘拟合概率密度函数报维度错误及绘图异常排查
问题产生原因
异常的核心是维度不匹配引发的连锁错误,Matlab给出的运算符修改提示属于误判:
- 初始写法
Astar = inv(H'*H)*H'*y_报错的本质不是乘法类型选错,是向量维度不符合矩阵运算要求:- 代码中
bin是步长0.5的行向量,hist返回的频数结果f(即赋值后的y_)同样是1×n的行向量;而构造的设计矩阵H是n行2列的列向量组格式,inv(H'*H)*H'计算得到的是2×n的系数矩阵。 - 标准矩阵乘法要求前一个矩阵的列数等于后一个矩阵的行数,2×n矩阵和1×n行向量做
*运算时内维度n≠1,自然触发维度不匹配报错,Matlab的自动修复提示错误推荐了逐元素运算.*,属于误导。
- 代码中
- 修改为
.*后出现平直线,是因为逐元素运算完全偏离最小二乘的计算逻辑:- 逐元素运算要求两个变量维度完全一致,Matlab会自动把1×n的
y_广播复制为2×n的矩阵,和2×n的inv(H'*H)*H'逐位相乘,最终得到的Astar是2×n的矩阵,完全不是最小二乘要求的2×1参数向量(仅包含截距、斜率两个系数)。 - 后续执行
H*Astar时,n×2的矩阵乘2×n的矩阵会得到n×n的矩阵,Matlab默认绘制多列数据时如果维度和x轴不匹配,仅读取第一列数据绘图,就会出现你看到的底部异常平直线。
- 逐元素运算要求两个变量维度完全一致,Matlab会自动把1×n的
正确修正方案
不需要用逐元素乘法,只需要统一向量维度为列向量即可:
N = 10000; mu = 5; sigma = 2; r = randn(N,1); x = mu+sigma*r; bin=mu-6*sigma:0.5:mu+6*sigma; f=hist(x,bin); plot(bin,f,'bo'); hold on; xlabel('bin'); ylabel('f'); y_ = f(:); % 强制转为列向量,规避维度问题 x_ = bin(:); H = [ones(length(y_),1),x_]; Astar = inv(H'*H)*H'*y_; % 保留标准矩阵乘法即可 % 更推荐用反斜杠求解,数值稳定性更好:Astar = H\y_; Ytilde = H*Astar; plot(x_,Ytilde, 'r-','LineWidth',1)
异常运行结果参考:
内容的提问来源于stack exchange,提问作者lambduh
相关产品推荐
相关产品推荐

