系统环境
系统:WIin10
编译器:Anaconda3 下的 Jupyter Notebook 6.0.1
语言:Python 3.7.4
Github:LinearRegression_Sample(供下载测试,走过路过给颗星呗)
欢迎大家讨论相关问题~
0 库引用
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
1 Plot设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号
plt.rcParams['figure.dpi'] = 540 # 图片清晰度
size = 11 # 图字体大小
2 Sample设置
N=500 # 假设总体数为500
n=300 # 假设样本数为300
ylabel = '风速' # 假设为风速数据
unit = 'm/s' # 风速单位
3 获取数据
这里使用的是随机数据,稍微加了亿点点转换,让数据看上去更加真实亿点点 😛
# 风速数据
# 让它看起来真实一点!
data1 = np.random.rand(n)
data2 = np.random.rand(n)
data1 = (data1-0.5)*1.5
data2 = (data2-0.5)*1.5
data1 = np.abs(data1 + [i/100 for i in range(n)])
data2 = np.abs(data2 + [i/100 for i in range(n)])
4 数据分析
numpy 自带有相关系数、算术平均值、和标准差的计算,记得有效利用 😃
r = np.corrcoef(data1,data2)[0,1] # 相关系数
X=data1.reshape(n,1) # 数据格式转换
y=data2.reshape(n,1) # 数据格式转换
m = np.mean(y-X) # 系统差
s = np.std(y-X) # 标准差
5 Plot
model = LinearRegression()
model.fit(X,y) # 数据录入线性回归模型
intercept = model.intercept_[0] # 获取 intercept
coef = model.coef_[0][0] # 获取 slope
X2 = [[np.min(X)],[np.max(X)]] # 取出 x 最大最小值
y2 = model.predict(X2) # 用 x 最大最小值计算对应 y 的值
X3 = [np.min(X),np.max(X)] # 取出 x 最大最小值来画基准线
y3 = [np.min(X),np.max(X)] # 取出 x 最大最小值来画基准线
fig2 = plt.figure(figsize=(8,8))
plt.plot(X,y,'k.') # 点图
plt.plot(X2,y2,'r-') # 线性回归模型
plt.plot(X3,y3,'b--') # 基准线
plt.legend([ylabel,'y='+str(round(intercept,4))+'+'+str(round(coef,4))+'x','y=x'],
bbox_to_anchor=(1,1),fontsize = size) # label,model,baseline
plt.text(0,np.max(X),
'N={}\nn={}\nx={}{}\ns={}{}\nr={}'.format(N,n,round(m,3),unit,round(s,3),unit,round(r,3)),
verticalalignment='top',fontsize = size,color='r') # size, sample size, difference mean, difference std, correlation
plt.xlabel('实际测得风速'+ylabel,fontdict={'size':size})
plt.ylabel('真实风速'+ylabel,fontdict={'size':size})
plt.title(ylabel+'相关对比图',fontdict={'size':size})
plt.tick_params(labelsize=size-3)
fig2.tight_layout()
plt.show