基于Pytorch的气温数据的处理和分析

要求

1)查找任意地区未来三天内任意连续7小时(如6:00-12:00)的天气气温数据;

2)计算每天的气温平均值与均方根,以及三天气温的加权算术平均和标准差。

3)用t-检验准则判断每天的最中间一小时的气温数据是否是异常值;

4)绘制每天气温随时间变化的曲线;(可用excel、matlab、origin等)

5)基于每天的气温数据,采用最小二乘法得到最优的线性模型,并分析线性度。

天气气温数据

2.1 江苏市姑苏区20240319-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。想要解决这个问题需要增加数据样本,或者使用非线性拟合。

 

 

如果这篇文章对您有所帮助,不妨打赏一下作者吧~
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇