本文基于Python3+
緣由是看到微博上某程序員通過計算擬合度估算出某貓2019雙十一的銷售額,與現(xiàn)實結果相差無幾,本著試一試的態(tài)度,也想復現(xiàn)一下結果,而且預測下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) # 是否繪制網(wǎng)格線
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]]
# 訓練數(shù)據(jù)
X_train = X[:-2]
y_train = y[:-2]
# 做擬合度的數(shù)據(jù)取訓練數(shù)據(jù)的最后兩個
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)
# 創(chuàng)建一個線性回歸實例
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數(shù)據(jù)集的預測值
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)
# 創(chuàng)建一個線性回歸實例
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():
# 通過循環(huán)的方式計算多次回歸的擬合度
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拭目以待!