《集体智慧编程》第8章

来源:互联网 发布:云南旅游业数据统计 编辑:程序博客网 时间:2024/06/05 05:47

1.P175
在计算高斯函数时,代码中的默认标准差为10.0,如果默认标准差为10是得不到正文中的数据的,这里的默认值应该改为1.0
附上高斯函数的公式和图像
高斯函数公式
公式中的a代表高斯函数的最大值,b代表平均值(即当高斯函数取最大值时x的值),c代表标准差,c^2表示方差。
标准差为1
上图表示a=1,b=0, c=1
标准差为10
上图表示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]

就可以得到结果了