要求
1)查找任意地区未来三天内任意连续7小时(如6:00-12:00)的天气气温数据;
2)计算每天的气温平均值与均方根,以及三天气温的加权算术平均和标准差。
3)用t-检验准则判断每天的最中间一小时的气温数据是否是异常值;
4)绘制每天气温随时间变化的曲线;(可用excel、matlab、origin等)
5)基于每天的气温数据,采用最小二乘法得到最优的线性模型,并分析线性度。
天气气温数据
表2.1 江苏市姑苏区2024年03月19日-21日天气数据
1:00 | 2:00 | 3:00 | 4:00 | 5:00 | 6:00 | 7:00 | |
03月19日 | 7℃ | 7℃ | 6℃ | 6℃ | 6℃ | 7℃ | 7℃ |
03月20日 | 7℃ | 6℃ | 6℃ | 5℃ | 5℃ | 6℃ | 7℃ |
03月21日 | 9℃ | 9℃ | 9℃ | 9℃ | 9℃ | 9℃ | 9℃ |
代码
import torch import numpy as np import sklearn from sklearn import metrics import matplotlib as mpl import matplotlib.pyplot as plt from scipy.stats import ttest_ind
day19=torch.tensor([[1.,7],[2,7],[3,6],[4,6],[5,6],[6,7],[7,7]]);#x为时间,y为温度 day20=torch.tensor([[1.,7],[2,6],[3,6],[4,5],[5,5],[6,6],[7,7]]); day21=torch.tensor([[1.,9],[2,9],[3,9],[4,9],[5,9],[6,9],[7,9]]);
day19[:,1]
气温平均值与均方根以及三天气温的加权算术平均和标准差
t=torch.stack([day19,day20,day21])#合并数据 print('每天的气温平均值为','%.2f'%torch.mean(t[0,:,1]).item(),'%.2f'%torch.mean(t[1,:,1]).item(),'%.2f'%torch.mean(t[2,:,1]).item()) t2=t.numpy()#转换成numpy数组方便计算 print('每天的气温均方根为','%.2f'%np.sqrt(np.mean(t2[0,:,1]**2)),'%.2f'%np.sqrt(np.mean(t2[1,:,1]**2)),'%.2f'%np.sqrt(np.mean(t2[2,:,1]**2))) print('三天气温的算数平均值为7.19 标准差为','%.2f'%np.std(t2[:,:,1]))
t-检验准则
t,p=ttest_ind(t2[0,:,1],t2[1,:,1]) print("t = " + str(t)) print("p = " + str(p)) if(p>0.05): print('不具有异常值') else: print('具有异常值')
每天气温随时间变化的曲线
plt.plot(day19[:,0],day19[:,1],'or-')#绘制出3天内1点到7点时的温度变化 plt.plot(day20[:,0],day20[:,1],'ob-') plt.plot(day21[:,0],day21[:,1],'og-') plt.xlabel('time') plt.ylabel('temperature') plt.title('Temperature changes') plt.legend(['19day','20day','21day']) plt.show()
最小二乘法
p = torch.ones(7,1) X=torch.cat((day19[:,0].reshape(7,1),p),1)#拓展维度让X1矩阵包含b的系数 Y1=day19[:,1] Y2=day20[:,1] Y3=day21[:,1] X,Y1,Y2,Y3
print(torch.linalg.lstsq(X, Y1))#最小二乘法函数 w1,b1=torch.linalg.lstsq(X, Y1).solution #19日的线性拟合 torch.linalg.lstsq(X, Y2)#最小二乘法 w2,b2=torch.linalg.lstsq(X, Y2).solution #20日的线性拟合 torch.linalg.lstsq(X, Y3)#最小二乘法 w3,b3=torch.linalg.lstsq(X, Y3).solution #21日的线性拟合 w1,b1,w2,b2,w3,b3
x = np.linspace(1, 7, 50) y1 = w1*day19[:,0] + b1 y2 = w2*day20[:,0] + b2 y3 = w3*day21[:,0] + b3 plt.xlabel('time') plt.ylabel('temperature') plt.title('19day Temperature changes') plt.plot(day19[:,0],day19[:,1],X,y1,'ob-')#第19天的温度变化以及拟合函数 plt.plot(day20[:,0],day20[:,1],X,y2,'or-')#第20天的温度变化以及拟合函数 plt.plot(day21[:,0],day21[:,1],X,y3,'og-')#第21天的温度变化以及拟合函数 plt.show()
分析线性度
print('线性度为',sklearn.metrics.r2_score(Y1,y1))
线性度分析:由于数据样本均只上下轻微浮动,线性拟合时使用最小二乘法就会将平均值拟合成最佳的拟合直线,故线性度趋近于0。想要解决这个问题需要增加数据样本,或者使用非线性拟合。