我正在尝试实现高斯拟合,当我尝试乘以如下所示的矩阵时遇到问题。 为什么我得到这个错误? 我打印结果只是为了验证2个矩阵的乘积,当我这样做时,我得到的矩阵大小相同且值正确。
请帮忙吗?
谢谢
代码
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]
A_ = np.transpose(np.matrix(A))
Mu_ = np.transpose(np.zeros((1,len(A))))
for i in range(len(A)):
Mu_[i] = mu
mu_ = A_-Mu_
mu_t = np.transpose(mu_)
for i in range (100):
#Y = dat/dat[30]
Y = np.matrix((B/B[192]))
Yt = np.transpose(Y)
N = np.exp(-np.power(mu_,2)//(2*sigma**2))
print(N*np.power(mu_,2)) # when i print this i got the error.
错误
ValueError: shapes (11,1) and (11,1) not aligned: 1 (dim 1) != 11 (dim 0)
答案 0 :(得分:0)
您可能未使用预期的矩阵乘法类型。 N * np.power(mu_,2))
为您提供Hadamard积(或逐元素矩阵乘法)。
如果您要查找真正的矩阵矩阵乘法,则需要使用N.dot(*np.power(mu_,2))
或N @ np.power(mu_,2)
答案 1 :(得分:0)
没有文件,我无法重新创建您的计算,但是我可以提出一些建议。
A = wl.iloc[185:196,0]
B = spectre.iloc[185:196, 0 ]
A
和B
现在是熊猫系列。
sigma = 2565/8192
mu = A[192]
A_ = np.transpose(np.matrix(A))
np.matrix(A)
产生(1,11)形状matrix
; transpose
将其更改为(11,1)。 A_ = A.to_numpy()
将创建(11,)ndarray
。 A_=np.reshape(A_, (11,1)
将使其变成2d,而不会np.matrix
超载。
Mu_ = np.transpose(np.zeros((1,len(A))))
for i in range(len(A)):
Mu_[i] = mu
Mu_
是(11,1)matrix
,所有插槽中都有mu
。
mu_ = A_-Mu_
mu_ = A_-mu
也可以正常工作。无需制作Mu_
。 mu_
与A_
具有相同的类型和形状。
mu_t = np.transpose(mu_)
无需制作mu_t
(形状(1,11))。
我看不到这个循环是干什么的。
for i in range (100):
#Y = dat/dat[30]
Y = np.matrix((B/B[192]))
Yt = np.transpose(Y)
同样,Y = (B/B[192]).to_numpy()
就足够了。但是下面没有使用Y
。
N = np.exp(-np.power(mu_,2)//(2*sigma**2))
N
与mu_
(和A_
)具有相同的类型和形状
print(N*np.power(mu_,2)) # when i print this i got the error.
此乘法的目的是什么?结果应该是元素(11,1)乘积,还是(1,1)dot
乘积?无论哪种方式,您都不需要2d matrix
。
我认为您的代码可以简化为:
A_ = A.to_numpy() # (11,) shape array
mu_ = A_ - mu
N = np.exp(-np.power(mu_,2)//(2*sigma**2)) # still (11,) shape
N*np.power(mu_,2) # element-wise multiplication (11,) shape
N@np.power(mu_,2) # dot product, scalar result