1.P175
在計算高斯函數時,代碼中的默認標準差爲10.0,如果默認標準差爲10是得不到正文中的數據的,這裏的默認值應該改爲1.0
附上高斯函數的公式和圖像
公式中的a代表高斯函數的最大值,b代表平均值(即當高斯函數取最大值時x的值),c代表標準差,c^2表示方差。
上圖表示a=1,b=0, c=1
上圖表示a=1, b=0, c=10(注意橫座標數值)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
注意此處標準差爲1,但是在後邊P181計算按比例縮放後的預測結果時,此處的標準差應該改回10,否則會導致分母爲0的錯誤(error:float division),切記。
2.P182
本頁下方爲了對縮放結果進行優化時,調用了第五章的代碼,但是我們不能直接把第五章的optimization.py文件直接拷貝過來,我們還要對其進行一些修改,或者讀者如果下載了本書的配套代碼就可以直接把\PCI_Code Folder\chapter8中的optimization.py複製過來,但要注意調用第二個geneticoptimize()函數時,chapter8中的文件把函數名稱改爲了swarmoptimize(),也就是說原文中的
>>>optimization.geneticoptimize(numpredict.weightdomain, costf, popsize = 5, lrate = 1, maxv = 4, iters = 20)
應改爲
>>>optimization.swarmoptimize(numpredict.weightdomain, costf, popsize = 5, lrate = 1, maxv = 4, iters = 20)
沒有下載配套代碼的,應該把geneticoptimize()函數改爲
def geneticoptimize(domain,costf,popsize=20,lrate=0.1,maxv=2.0,iters=50):
# Initialize individuals
# current solutions
x=[]
# best solutions
p=[]
# velocities
v=[]
for i in range(0,popsize):
vec=[float(random.randint(domain[i][0],domain[i][1]))
for i in range(len(domain))]
x.append(vec)
p.append(vec[:])
v.append([0.0 for i in vec])
for ml in range(0,iters):
for i in range(0,popsize):
# Best solution for this particle
if costf(x[i])<costf(p[i]):
p[i]=x[i][:]
g=i
# Best solution for any particle
for j in range(0,popsize):
if costf(p[j])<costf(p[g]): g=j
for d in range(len(x[i])):
# Update the velocity of this particle
v[i][d]+=lrate*(p[i][d]-x[i][d])+lrate*(p[g][d]-x[i][d])
# constrain velocity to a maximum
if v[i][d]>maxv: v[i][d]=maxv
elif v[i][d]<-maxv: v[i][d]=-maxv
# constrain bounds of solutions
x[i][d]+=v[i][d]
if x[i][d]<domain[d][0]: x[i][d]=domain[d][0]
elif x[i][d]>domain[d][1]: x[i][d]=domain[d][1]
#print p[g],costf(p[g])
return p[g]
就可以得到結果了