事件原委
今年的双11依旧火爆。
官方宣布今年成交额为2684亿,再创新高。
虽然没有亲自参与,却也在朋友圈,微博上面感受到了鹧鸪双11的热浪。
然而,今年双11最大的瓜却是,有网友认为历年双11的数据“太过完美”,有造假嫌疑。
前排吃瓜:
在这个网友的分析中,分别采用了二次多项式以及三次多项式拟合,结果发现拟合和数据达到了惊人的吻合程度,让人产生了怀疑。
这位网友使用多项式拟合让我想到了一个无穷次多项式拟合的拟合工具,它神秘而又强大,是个拟合界的杠把子。
无穷次多项式拟合?
数学警告:对数学不感兴趣的同学可以跳过这段。
经常使用多项式拟合的同学肯定会遇到一个难题,如果选择的项数过少,会出现欠拟合,拟合结果会比较差,因为过少的拟合项数不足以捕捉数据的复杂度。而如果选择的项数过多,又会出现过拟合。这是因为待拟合的参数过多,拟合出来的结果都会完美穿过每一个数据点,但是预测的时候会翻车。
上面这张图很好地反映了过拟合和欠拟合的情况。
那么我们该如何选择合适的项数呢?
这时候,有一个大胆的想法来了,既然不好选择项数,那我们就选无穷多个项数吧。有个严谨的说法叫做“非参数”方法。里面最有代表性的方法就是“高斯过程”。
高斯过程可能需要懂一些数学的同学才能搞明白,这里我们就不展开论述了。我们只需要知道无穷多项式是因为:高斯过程中的核展开后可以得到无穷多项多项式。这就是鼎鼎有名的“核方法”(kernel method)。
非参数模型的意思是一个不是能被参数唯一确定的模型。尽管它的模型中仍然有确定的分布和参数个数。所以,高斯过程之所以是非参的方法是因为它参数估计没有完全确定模型。
明白了吧,说白了就是非参数方法没有一个确定的模型,不像是多项式拟合有确定的项数。
翻车or洞见?
现在我们来拟合一下双11的数据吧:
从这个09到18年的数据看来的确非常有规律。而且19年的上升趋势已经跃然纸上。
我们用Python的一个sklearn工具来实现高斯过程回归:
#coding:utf-8import numpy as npfrom matplotlib import pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressorfrom sklearn.gaussian_process.kernels import RBF, ConstantKernel as C
x = np.arange(2009,2019) x_pred = np.linspace(2009, 2019, 1000)x = np.atleast_2d(x).T #高斯过程拟合需要将数据变成二维x_pred = np.atleast_2d(x_pred).Ty = np.array([0.5,9.36,52,191,352,571,912,1207,1682.69,2135])
kernel = RBF(1.0, (1e-5, 1e5))gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10)gp.fit(x, y)y_pred, sigma = gp.predict(x_pred, return_std=True)
plt.plot(x,y,'*')
plt.plot(x_pred, y_pred, 'b-', label=u'Prediction')plt.fill(np.concatenate([x_pred, x_pred[::-1]]), np.concatenate([y_pred - 1.9600 * sigma, (y_pred + 1.9600 * sigma)[::-1]]), alpha=.5, fc='b', ec='None', label='95% confidence interval')
plt.rcParams['font.sans-serif']=['SimHei'] plt.xlabel(u'年份')plt.ylabel('销售额(亿元)')plt.show()
拟合结果:
可以发现,我们的高斯过程拟合顺利穿过了每一个历史点。但是它却预测2019年的结果是1733亿,比18年的2135亿元还要少!
没想到我们的高斯过程虽然成功穿过了历史数据,却非常看衰未来走势。这是翻车了呢?还是一种“洞见”呢?
对于今年的双11数据有没有造假,高斯过程回答说“咱也不知道,咱也不敢问”。
本文分享自 Python机器学习学会 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!