前置知识
1,numpy中poly1d, linspace, random.rand, random.normal用法
numpy包中的poly1d函数用于生成多项式,注意这儿是数字1,而不是字母l。譬如生成:
可以这样
其它更多例子
linspace的定义是linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
用于生成落在start到stop这个区间中num个数,如果endpoint为True, stop也包括在内;
譬如生成落在[0,1]区间的10个数,可以这样
random.rand用于生成指定维数的随机数,这些随机数落在[0, 1)之间;譬如生成一个落在[0, 1)之间的随机数,如下
后面两个分别是生成2行列的和2行3列这样的随机数矩阵
random.normal从指定的均值和标准差所界定的正态分布区间进行采样,譬如从均值为,标准差为0.1所界定的正太分布中采10个样,如下:
leastsq用来最小化给定函数在给定数据集上的二乘结果的权重;什么意思呢?譬如有一个二维数据集(1, 3), (2, 5), (3, 7), (4, 9)我们可以知道这个满意y = ax+b,怎么求出a,b呢?可以这么办,如下
可以看到结果为2x + 1,就是返回的第一个数组中的元素;注意这儿的参数顺序:因为leastsq会将np.array([0.01, 0.01])和x,y传到residual里面,所以,residual里面的参数顺序应该是估计的starting weight在前(p),然后是需要拟合的数据(x, y)
3,matplotlib.pyplot用法
matplotlib.pyplot主要是做图形化展示之用,功能相当强大,下面举几个例子说明它的用途。
展示一些数字
为什么X轴是到4,而y轴是1到5呢?原因是如果只给plot一个序列的话,matplotlib会认为这是针对y轴的一个序列,并且会自动生成对应的x轴的值,这个自动生成的序列和传入的序列长度相同,只不过是从开始。
plt.axis分别指定x轴和y轴上的范围。
r--,bs等用来指定线的形状和颜色。
最小二乘
基本思想是这样:先用一个函数real_func来生成一系列数据,然后,给这些数据加上噪声,然后,用一个多项式函数fit_func来拟合这些数据,也就是从噪声数据中学习出real_func,而学习的结果就是fit_func和real_func在函数图形上应该更接近,这就是机器学习的过程和场景。为了演示学习拟合过程,分别用常数次,三次,七次和九次多项式来拟合,最后,给10次多项式加上正则项来消除噪声的干扰。下面分别进行说明。
首先,当然是引入需要的python包了,如下:
import numpy as np
import scipy as sp
from scipy.optimize import leastsq
import matplotlib.pyplot as plt
真实函数real_func生成的数据和噪声数据的生成代码和对应的函数图形
现在是学习过程,和一般的机器学习过程一样,由于这样或那样的原因,我们收集到的实际数据都有是听声的;譬如这儿的训练数据就是x和y_noise,我们的目标就是根据这些数据生成接近于上图中real_func函数对应的图形,而不是噪声数据所对应的图形。我们通过最小二乘来完成这个过程。
在常数次下,拟合是一条直线,相差甚远。下面是分别从二次,三次到九次的图形。
三次多项式的情况:
在三次式项式情况下,fitted这条线和real这条线已经比较接近了, well done.
看看七次的情况
好像更接近了。再看看九次的情况:
没有大的改进,好像还向噪声数据更靠近了。从上面可以看出:多项式可以逼近诸如sin这样的函数,其实多项式可以无限逼近任何连续函数;这有数学上的证明。其次,次数越高,会把噪声也包括进去,就是出现所谓的过拟合现象。那怎么解决过拟合呢?引入惩罚项或者叫做正则项(penalty or regularization),我们不妨用九次项中逼近中所得到的coff[0]权重加上正则项来尝试深度,如下:
好像还不错。次数越高呢,对带噪声的训练数据拟合越好,加上正则项之后,离真实数据的情况更近,这也是我们想要的结果。Enjoy it.
领取专属 10元无门槛券
私享最新 技术干货