高斯拟合时矩阵相乘报错:维度不匹配问题求助
解决高斯拟合中的矩阵乘法维度不匹配问题
首先,咱们来定位你遇到的ValueError的核心原因:你试图用numpy矩阵的*运算符去乘两个11×1的列向量,但这个运算符在numpy矩阵中代表的是矩阵乘法(点积),要求左矩阵的列数等于右矩阵的行数——显然1≠11,所以报错。而Matlab里如果是元素级乘法会用.*,推测你在Matlab里实际用的是元素乘,只是numpy矩阵的行为和Matlab不同。
具体修正方案
这里有几种可行的解决办法,根据你的需求选择:
1. 改用numpy数组(推荐)
numpy数组的*运算符默认是元素级乘法,更符合你可能想要的Matlab.*的行为。把代码里的np.matrix换成np.array即可:
import numpy as np import pandas as pd spectre = pd.read_csv('spectre.txt') wl = pd.read_csv('longueur_d_onde.txt') spectre = spectre - 8000 A = wl.iloc[185:196, 0] B = spectre.iloc[185:196, 0] sigma = 2565 / 8192 mu = A[192] # 改用numpy数组,不需要手动转置 A_ = A.values.reshape(-1, 1) # 更简洁的方式生成mu的重复列向量 Mu_ = np.full_like(A_, mu) mu_ = A_ - Mu_ for i in range(100): Y = (B / B[192]).values.reshape(-1, 1) # 元素级乘法,直接用* N = np.exp(-np.power(mu_, 2) / (2 * sigma**2)) # 注意这里用/而不是//,//是整数除法 print(N * np.power(mu_, 2)) # 现在维度匹配,执行元素乘
2. 用np.multiply()做元素级乘法
如果你坚持使用numpy矩阵,可以用np.multiply()函数明确指定元素级乘法:
# 保留你原来的矩阵定义 N = np.exp(-np.power(mu_, 2) / (2 * sigma**2)) print(np.multiply(N, np.power(mu_, 2)))
3. 如果需要矩阵外积(生成11×11矩阵)
如果你确实想要的是矩阵乘法(比如计算两个列向量的外积,得到11×11的矩阵),那需要转置其中一个向量:
print(N * np.transpose(np.power(mu_, 2))) # 或者 print(np.transpose(N) * np.power(mu_, 2))
额外的代码优化提示
- 你原来的
Mu_初始化可以用np.full_like()或者np.tile()简化,不需要手动循环赋值 - 注意
//是整数除法,这里计算高斯函数应该用浮点数除法/,否则会丢失精度 - 循环里的
Y和Yt如果没有用到,可以考虑移除或者调整位置,避免重复计算
内容的提问来源于stack exchange,提问作者Chakib
相关产品推荐
相关产品推荐

