import pandas as pd # 用来读取数据的一个包. from sklearn.linear_model import LinearRegression # 机器学习的包 用来做线性回归的-> 用咱们的数据帮我们求出一个函数 from sklearn.preprocessing import PolynomialFeatures # 机器学习的包 ..... 高次幂 import matplotlib.pyplot as plt # 数据可视化-> 用来画图的 import numpy as np # 做矩阵. data = pd.read_csv("data.csv", header=None) # 读取数据 data["time"] = pd.to_datetime(data[0]) # 排序处理 print(data.head()) 0 1 2 time 0 2020-1-31 2102 5019 2020-01-31 1 2020-1-25 688 1309 2020-01-25 2 2020-1-24 444 1118 2020-01-24 3 2020-1-30 1982 4812 2020-01-30 4 2020-1-26 769 3806 2020-01-26 # 索引改成时间 data.index = data["time"] data = data.sort_index() print(data.head()) 0 1 2 time time 2020-01-20 2020-1-20 77 27 2020-01-20 2020-01-21 2020-1-21 149 26 2020-01-21 2020-01-22 2020-1-22 571 393 2020-01-22 2020-01-23 2020-1-23 259 680 2020-01-23 2020-01-24 2020-1-24 444 1118 2020-01-24 # 计算每天的确诊的总数量 totle = data[1].cumsum() # 获取到确诊病例. 然后进行累积计算 前1, 2,3,4,5,项累加 print(totle) time 2020-01-20 77 2020-01-21 226 2020-01-22 797 2020-01-23 1056 2020-01-24 1500 2020-01-25 2188 2020-01-26 2957 2020-01-27 4728 2020-01-28 6187 2020-01-29 7924 。 。 。 。 。 。 # x轴是数字 使用时间不好使用机器学习的包 totle = totle.reset_index()[1] # 去掉时间, 把时间转化成数字. 方便计算, 2020-1-20 totle.index = totle.index + 1 print(totle) 1 77 2 226 3 797 4 1056 5 1500 6 2188 7 2957 plt.scatter(totle.index, totle) # 画散点图. 展示一下目前确诊病例数量 plt.show()
1:线性回归线:
# 一元一次线性回归
liner_reg = LinearRegression() # 创建线性回归对象
x_data = totle.index[:, np.newaxis] # 增加维度, 拿到x
y_data = totle[:, np.newaxis] # 增加维度, 拿到y
liner_reg.fit(x_data, y_data) # 数据训练
plt.scatter(x_data, y_data) # 画点
plt.plot(x_data, liner_reg.predict(x_data), "red") # 画回归线. 预测线, liner_reg.predict(x_data) 把x_data的值扔进去. 得到回归线上的y值
plt.show() # 展示数据
# 斜率 截距
# k b
# y = kx + b
# liner_reg.coef_, liner_reg.intercept_
2:线性回归的预测曲线:
# 区别于 以下两步是为了求出高幂次方程的x的固定值,比如方差,平均值等, 求出后的x_data_poly 抛到预测fit里面训练,最后画图直接扔liner_reg.predict(x_data_poly)即可
poly = PolynomialFeatures(3) # 计算N幂次的公式 # degree=4 ax2+bx+c ax3+bx2+cx1+dx0 升幂 1元二次方程 # 1.0000e+00 0.0000e+00 0.0000e+00 0.0000e+00 0次方 1次方 2次方 3次方
x_data_poly = poly.fit_transform(x_data) # 1 0. 2 1.4 2. 8 3.
liner_reg = LinearRegression() # 线性回归对象
liner_reg.fit(x_data_poly, y_data) # 数据训练
# x0, x1, x2, x3, y???
# dx0+cx1+bx2+ax3 = y
plt.plot(x_data, liner_reg.predict(x_data_poly), "r") # 画图
# 预测值
plt.scatter(np.arange(1,50), liner_reg.predict([[i**0, i**1, i**2, i**3] for i in np.arange(1,50)])) # 几次幂就填几个i**n
plt.show()
PS总结思路:创建训练数据与测试数据,使用sklearn的linear_model包进行对数据训练,会得到一个对应的算法公式,对于公式进行传入自变量x,就会得到一个因变量y,接着绘制图即可