[Python]通过n次多项式线性回归计算拟合度估算销售额

本文基于Python3+
缘由是看到微博上某程序员通过计算拟合度估算出某猫2019双十一的销售额,与现实结果相差无几,本着试一试的态度,也想复现一下结果,而且预测下2020/2021的销售额
直接的线性回归没有太多的参考意义,所以从2次多项式计算到9次多项式的拟合度,代码过程比较简单,就是想得到结果,有兴趣的朋友,直接复制代码就能跑了


图表.png
#!/usr/bin/python3

import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression  # 导入线性回归模型
from sklearn.preprocessing import PolynomialFeatures  # 导入多项式回归模型

# 字体
myfont = fm.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
plt.title('样本', fontproperties=myfont)  # 图像标题
plt.xlabel('年', fontproperties=myfont)  # x轴文本
plt.ylabel('销售额', fontproperties=myfont)  # y轴文本
plt.grid(True)  # 是否绘制网格线

X = [[2009], [2010], [2011], [2012], [2013], [2014], [2015], [2016], [2017], [2018], [2019]]
y = [[0.5], [9.36], [33.6], [191], [350], [571], [912], [1207], [1682], [2135], [2684]]
# 训练数据
X_train = X[:-2]
y_train = y[:-2]
# 做拟合度的数据取训练数据的最后两个
X_test = X[-2:]
y_test = y[-2:]

# 绘制散点图
plt.scatter(X, y, marker='*', color='blue', label='样本')
plt.scatter(X, y, color='blue')

# 线性回归
lin = LinearRegression()
lin.fit(X, y)
plt.plot(X, lin.predict(X), color='green')


def lineReg():
    for k in range(2, 10):
        # 实例化一个n次多项式特征实例
        k_featurizer = PolynomialFeatures(degree=k)
        # 用n次多项式对样本X值做变换
        X_train_k = k_featurizer.fit_transform(X_train)
        # 创建一个线性回归实例
        regressor_k = LinearRegression()
        # 以n次多项式变换后的X值作为输入,带入线性回归模型做训练
        regressor_k.fit(X_train_k, y_train)
        # 预测 X_train_k 回归结果
        k_predict = regressor_k.predict(X_train_k)
        # 计算test 的 拟合度
        X_test_k = k_featurizer.transform(X_test)
        # 计算拟合度
        score = regressor_k.score(X_test_k, y_test)
        # test数据集的预测值
        predict = regressor_k.predict(X_test_k)
        print('%d项式r^2是%.9f' % (k , score))
        print('2018预测值:%f,2019预测值:%f ' % (predict[0], predict[1]))
        print('2018实际值:%f,2019实际值:%f ' % (y_test[0][0], y_test[1][0]))



def predict():
    for k in range(2, 10):
        # 实例化一个n次多项式特征实例
        k_featurizer = PolynomialFeatures(degree=k)
        # 用n次多项式对样本X值做变换
        X_train_k = k_featurizer.fit_transform(X)
        # 创建一个线性回归实例
        regressor_k = LinearRegression()
        # 以n次多项式变换后的X值作为输入,带入线性回归模型做训练
        regressor_k.fit(X_train_k, y)
        # 预测 X_train_k 回归结果
        k_predict = regressor_k.predict(X_train_k)
        # 用numpy取 [2019. 2020. 2021.]
        temp = np.linspace(2019, 2021, 3)
        # 把训练好X值的多项式特征实例应用到一系列点上, 预测 [2019. 2020. 2021.] 的结果
        temp_cubic = k_featurizer.transform(temp.reshape(temp.shape[0], 1))
        predict = regressor_k.predict(temp_cubic)
        print('2019预测值:%f,2020预测值:%f,2021年预测值:%f' % (predict[0], predict[1],predict[2]))
        # 显示 图表
        plt.plot(X, k_predict)


def main():
    # 通过循环的方式计算多次回归的拟合度
    lineReg()
    # 预测
    predict()
    plt.show()


if __name__ == "__main__":
    main()

拟合度结果:

2项式r^2是0.999009072
2018预测值:2146.347619,2019预测值:2688.534857 
2018实际值:2135.000000,2019实际值:2684.000000 
3项式r^2是0.981902029
2018预测值:2164.020737,2019预测值:2727.418546 
2018实际值:2135.000000,2019实际值:2684.000000 
4项式r^2是0.981797451
2018预测值:2164.078316,2019预测值:2727.561275 
2018实际值:2135.000000,2019实际值:2684.000000 
5项式r^2是0.981711425
2018预测值:2164.123781,2019预测值:2727.679546 
2018实际值:2135.000000,2019实际值:2684.000000 
6项式r^2是0.981627012
2018预测值:2164.168360,2019预测值:2727.795265 
2018实际值:2135.000000,2019实际值:2684.000000 
7项式r^2是0.981544027
2018预测值:2164.212177,2019预测值:2727.908690 
2018实际值:2135.000000,2019实际值:2684.000000 
8项式r^2是0.981462598
2018预测值:2164.255172,2019预测值:2728.019663 
2018实际值:2135.000000,2019实际值:2684.000000 
9项式r^2是0.981382766
2018预测值:2164.297314,2019预测值:2728.128153 
2018实际值:2135.000000,2019实际值:2684.000000 

从结果总可以看到 二次多项式的拟合度高达99.9%,n次多项式的拟合度高达98.2%

2019 2020 2021 销售额的预测值:

2019预测值:2681.617623,2020预测值:3282.276000,2021年预测值:3943.452000
2019预测值:2683.370096,2020预测值:3287.587899,2021年预测值:3954.073977
2019预测值:2683.370031,2020预测值:3287.595234,2021年预测值:3954.094960
2019预测值:2683.371401,2020预测值:3287.602068,2021年预测值:3954.111979
2019预测值:2683.372503,2020预测值:3287.607168,2021年预测值:3954.124381
2019预测值:2683.373335,2020预测值:3287.610530,2021年预测值:3954.132155
2019预测值:2683.373900,2020预测值:3287.612158,2021年预测值:3954.135298
2019预测值:2683.374207,2020预测值:3287.612072,2021年预测值:3954.133848

因为二次多项式的拟合度高达99.9%,2020年的预测值为3282.27
n次多项式的预测值为3287.61
结果怎么样,2020拭目以待!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353