Patchouli的机器学习系列教程四:基底函数——『道』

上节课我们学习了线性回归拟合,虽然能展现出趋势,但是还是不能比较精准地模拟历史并预言未来。这节课我们学习基底函数,用一系列基底函数的组合来拟合历史,达到可谓精准的拟合水平。曲线拟合其实在《刺客信条4·黑旗》这款游戏中有所体现,主人公作为abstergo公司的一名员工,受到先行者的诱导去解放史前人类的灵魂。但是公司的安保系统十分严格,只有你的权限等级大于等于门的权限等级时,该区域才是允许你进入的区域。主角为了破解系统,就必须扮演黑客,通过玩小游戏的方式来骇进公司的门禁系统,而曲线拟合就是这些小游戏中的一个。

我们可以猜测,这个公司的门禁系统是基于声音的密码锁,一个人的声音的波函数与密码的偏差率小于一定值即可通过门禁。而无论多么复杂的波函数都可以用多个正弦波配上不同的参数来表现出来,上图就是一种用四个正弦波拟合出一个复杂的波函数的小游戏。这其中,正弦波就是我们的基底函数,参数就是我们一直提到的特征向量(比如图中的 )。当然了,由于我们拟合的结果不再是一条直线,因此本章的内容也叫非线性回归。

到了非线性回归就不再是一条直线 那么简单了,而是由一系列参数和一系列基底函数组成,由曲线拟合历史,预言未来。

我们的特征值还是老朋友 ,而基底函数则用 来表示,记作:

因此,我们的第一个拟合不妨就用 的基底函数组来实现:

首先来定义基底函数组:

defpolynomial(x,num_basis,data_limits=[-1.,1.]):centre=data_limits[0]/2.data_limits[1]/2.span=data_limits[1]-data_limits[0]z=x-centrez=2*z/spanPhi=np.zeros((x.shape[0],num_basis))foriinrange(num_basis):Phi[:,i:i1]=z**ireturnPhi

随后设计矩阵和向量,x就阵列声称即可,特征向量可以先XJB生成一组。

x=np.linspace(-1.5,1.5,100)[:,None]w=np.random.normal(size=(3,1))Phi=polynomial(x,3)f=np.dot(Phi,w)

最后展示出来:

fig, ax = plt.subplots(figsize=(7, 7))ax.plot(x, f, color=[0, 0, 0], linewidth=3)ax.plot(x, Phi[:, 0], color=[1, 0, 0], linewidth=1) ax.plot(x, Phi[:, 1], color=[1, 0, 1], linewidth=1)ax.plot(x, Phi[:, 2], color=[0, 0, 1], linewidth=1)

三条彩色的线分别是 三个基底函数,黑又粗则是在随机特征向量 的加成下生成的曲线。除去 函数,常用的还有高斯基底和傅里叶基底。

高斯基底:

可以使用如下构成:

高斯基底函数设计:

defradial(x,num_basis,data_limits=[-1.,1.],width=None):ifnum_basisgt;1:centres=np.linspace(data_limits[0],data_limits[1],num_basis)ifwidthisNone:width=(centres[1]-centres[0])/2.else:centres=np.asarray([data_limits[0]/2.data_limits[1]/2.])ifwidthisNone:width=(data_limits[1]-data_limits[0])/2.Phi=np.zeros((x.shape[0],num_basis))foriinrange(num_basis):Phi[:,i:i1]=np.exp(-0.5*((x-centres[i])/width)**2)returnPhi

配合刚才的函数展示函数即可

至于傅里叶函数基底可以如下定义:

tdeffourier(x,num_basis,data_limits=[-1.,1.],frequency=None):tau=2*np.pispan=float(data_limits[1]-data_limits[0])Phi=np.zeros((x.shape[0],num_basis))foriinrange(num_basis):count=float((i1)//2)iffrequencyisNone:frequency=count/spanifi%2:Phi[:,i:i1]=np.sin(tau*frequency*x)else:Phi[:,i:i1]=np.cos(tau*frequency*x)returnPhi

根据上一章中对于特征向量特解的推理,令偏导数等于零:

有:

推理过程和 类似,最终得:

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();