我正在做一些信号处理,在Python中有一个循环,在这个循环中,我试图在参数alpha上优化一个结果,ln(B)。当我运行它时,我得到了一个最优的alpha值-0.8,但是当我在我的常规代码中使用它时,它给了我一个不同于循环给我的结果。为了清楚起见,正则代码的结果是~4,循环对于alpha = -0.8的结果是~5。
我觉得这很奇怪,所以在反复检查过程在每种情况下都是相同的之后,我在alpha =-0.8的一个实例上运行循环代码,得到了与普通代码相同的结果,4,与循环在alpha = -0.8迭代范围时给我的结果相反。然后,我在列表[-0.8,-0.8,-0.8, -0.8, -0.8, -0.8]上迭代了代码,发现在第一个-0.8中,我得到了4个,然后对于每个后续的代码,我得到了5个。
是否有什么原因,循环会给我一个不同的答案或过程,为第一项,比其余的?我盯着它看了好几个小时,我找不到我的错误。我想也许我没有重置变量,但区别只发生在第一次迭代和其他迭代之间,而不是每次迭代。
这是我的循环:
alpharange = [-0.8,-0.8,-0.8, -0.8, -0.8, -0.8]
for alpha in alpharange:
run += 1
print("Run {0}, alpha = {1}".format(run, alpha))
#find var_n
denominator = 0
r = np.arange(1,16)
for n in r:
if n*fecho <= fmax:
denominator += (n*fecho)**(2-2*alpha)/(var_f[n*nf])**2
var_n = numerator/denominator
print("var_n = ", var_n)
#find lnB
YB_ln = np.zeros(spec_H1.shape)
B_t = np.arange(0,len(YB_ln[0,:]),1) #length of a row
B_f = np.arange(0,len(YB_ln[:,0]),1) #length of a column
for nt in tzoomindx:
for nf in fzoomindx:
for n in r:
if n*nf<realfreqs.size-1:
f = realfreqs[n*nf]
YB_ln[nf,nt] += (np.abs(2*np.real(spec_H1[n*nf,nt]*np.conj(spec_L1[n*nf,nt])) + np.abs(spec_H1[n*nf,nt])**2 + np.abs(spec_L1[n*nf,nt])**2 ))/(1/(var_n*(1/f**alpha)) + 1/var_f[n*nf]) - np.log(1 + (var_n*(1/f**alpha))/var_f[n*nf])
peak = np.max(YB_ln)
peakcoord = np.where((YB_ln==peak))
if peak > lnB_max:
alpha_max = alpha
lnB_max = peak
time_max = t[peakcoord[1]]-tinterval
freq_max = realfreqs[peakcoord[0]]
var_n_max = var_n
print("!!!!!NEW MAX: alpha = {0} with peak {1} at time {2} and frequency {3}".format(alpha_max,lnB_max,time_max,freq_max))
alphalist.append(alpha)
lnBlist.append(peak)
timelist.append(t[peakcoord[1]]-tinterval)
freqlist.append(realfreqs[peakcoord[0]])
print("Peak lnB = {0} at time {1} and frequency {2}. Time: {3} min {4} s".format(peak,t[peakcoord[1]]-tinterval,realfreqs[peakcoord[0]],(time.time()-start_time)//60,(time.time()-start_time)%60))
print("lnB is optimized at alpha = {0} with peak {1} at time {2} and frequency {3}, var_n = {4}".format(alpha_max,lnB_max,time_max,freq_max,var_n_max))
print("Run took {0} min, {1} s".format((time.time()-start_time)//60,(time.time()-start_time)%60)) 以及产出:
Run 1, alpha = -0.8
var_n = (1.1668471858083481e-14+0j)
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:72: ComplexWarning: Casting complex values to real discards the imaginary part
!!!!!NEW MAX: alpha = -0.8 with peak 4.115523906554817 at time [1.0625] and frequency [72.]
Peak lnB = 4.115523906554817 at time [1.0625] and frequency [72.]. Time: 0.0 min 0.3648514747619629 s
Run 2, alpha = -0.8
var_n = (3.664163403845884e-14+0j)
!!!!!NEW MAX: alpha = -0.8 with peak 5.330720524005124 at time [1.0625] and frequency [72.]
Peak lnB = 5.330720524005124 at time [1.0625] and frequency [72.]. Time: 0.0 min 0.702958345413208 s
Run 3, alpha = -0.8
var_n = (3.664163403845884e-14+0j)
Peak lnB = 5.330720524005124 at time [1.0625] and frequency [72.]. Time: 0.0 min 1.0434083938598633 s
Run 4, alpha = -0.8
var_n = (3.664163403845884e-14+0j)
Peak lnB = 5.330720524005124 at time [1.0625] and frequency [72.]. Time: 0.0 min 1.375929832458496 s
Run 5, alpha = -0.8
var_n = (3.664163403845884e-14+0j)
Peak lnB = 5.330720524005124 at time [1.0625] and frequency [72.]. Time: 0.0 min 1.7248213291168213 s
Run 6, alpha = -0.8
var_n = (3.664163403845884e-14+0j)
Peak lnB = 5.330720524005124 at time [1.0625] and frequency [72.]. Time: 0.0 min 2.0683481693267822 s
lnB is optimized at alpha = -0.8 with peak 5.330720524005124 at time [1.0625] and frequency [72.], var_n = (3.664163403845884e-14+0j)
Run took 0.0 min, 2.069751739501953 s(我忽略这个错误,因为复杂的值只有一个真实的部分)。
在我看来,变量var_n正在改变,这就是我的结果。我只是不知道为什么只有在第一次迭代时才会有所不同。
包含所有变量定义的完整代码如下所示,我只是不想弄乱上面的代码:
start_time = time.time()
#find the energy over the leading seconds
dt = t[1] - t[0]
inspiral = np.where((t-tinterval >= -2) & (t-tinterval <= 0))
Einspiral_sum = np.sum(E[inspiral])*dt
print("Summed E_inspiral = ", Einspiral_sum)
#find the 'constant'
noise = np.where((t-tinterval <= -5) & (t-tinterval >= -50))
Enoise = np.sum(E[noise])/(E[noise].size)
print("E_noise = ", Enoise)
#finding the variance
var_f = var_f_same
fecho = 72
nf = np.where((realfreqs==fecho))
nf = int(nf[0])
fmax = 300
tzoomindx = np.where((t-tinterval>=0.5)&(t-tinterval<=1.5))
tzoomindx = np.array(tzoomindx[0])
fzoomindx = np.where((realfreqs>=63)&(realfreqs<=92))
fzoomindx=np.array(fzoomindx[0])
upperbound = 0
lowerbound = -2
numerator = (Einspiral_sum - (Enoise*upperbound-Enoise*lowerbound))
run = 0
lnB_max = -1e5
lnBlist = []
alphalist = []
timelist = []
freqlist = []
#alpharange = np.arange(-1.5,1,0.1)
#alpharange = np.array([-0.5,-0.4,-0.3,-0.2,-0.1,0,0.1,0.2,0.3,0.4])
alpharange = [-0.8,-0.8,-0.8, -0.8, -0.8, -0.8]
for alpha in alpharange:
run += 1
print("Run {0}, alpha = {1}".format(run, alpha))
#find var_n
denominator = 0
r = np.arange(1,16)
for n in r:
if n*fecho <= fmax:
denominator += (n*fecho)**(2-2*alpha)/(var_f[n*nf])**2
var_n = numerator/denominator #for Einspiral = sum
#find lnB
YB_ln = np.zeros(spec_H1.shape)
B_t = np.arange(0,len(YB_ln[0,:]),1) #length of a row
B_f = np.arange(0,len(YB_ln[:,0]),1) #length of a column
for nt in tzoomindx:
for nf in fzoomindx:
for n in r:
if n*nf<realfreqs.size-1:
f = realfreqs[n*nf]
YB_ln[nf,nt] += (np.abs(2*np.real(spec_H1[n*nf,nt]*np.conj(spec_L1[n*nf,nt])) + np.abs(spec_H1[n*nf,nt])**2 + np.abs(spec_L1[n*nf,nt])**2 ))/(1/(var_n*(1/f**alpha)) + 1/var_f[n*nf]) - np.log(1 + (var_n*(1/f**alpha))/var_f[n*nf])
peak = np.max(YB_ln)
peakcoord = np.where((YB_ln==peak))
if peak > lnB_max:
alpha_max = alpha
lnB_max = peak
time_max = t[peakcoord[1]]-tinterval
freq_max = realfreqs[peakcoord[0]]
var_n_max = var_n
print("!!!!!NEW MAX: alpha = {0} with peak {1} at time {2} and frequency {3}".format(alpha_max,lnB_max,time_max,freq_max))
alphalist.append(alpha)
lnBlist.append(peak)
timelist.append(t[peakcoord[1]]-tinterval)
freqlist.append(realfreqs[peakcoord[0]])
print("Peak lnB = {0} at time {1} and frequency {2}. Time: {3} min {4} s".format(peak,t[peakcoord[1]]-tinterval,realfreqs[peakcoord[0]],(time.time()-start_time)//60,(time.time()-start_time)%60))
print("lnB is optimized at alpha = {0} with peak {1} at time {2} and frequency {3}, var_n = {4}".format(alpha_max,lnB_max,time_max,freq_max,var_n_max))
print("Run took {0} min, {1} s".format((time.time()-start_time)//60,(time.time()-start_time)%60)) E是信号的能量,spec_H1/spec_L1是信号的谱图,总之,我试图在一定的时间和频率范围内求出信号的Bayes因子。
发布于 2020-04-10 21:44:38
可能,当您在nf in fzoomindx上迭代时,您会更改nf,它用于计算denominator += (n*fecho)**(2-2*alpha)/(var_f[n*nf])**2中的denominator .
https://stackoverflow.com/questions/61148962
复制相似问题