最小二乘实验

前置知识

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.

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181220G0TCQ100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券