设置自适应区域
使用量子机器学习来理解天气预报。
具体来说,我们预测大阪市的天气。
获取和确认数据
从日本气象厅下载大阪市最近一个月的CSV数据。 (截至2022年9月27日)
下载的 CSV 是: (2022 年 8 月 30 日至 2022 年 9 月 30 日)
我们提取了与天气相关的项目。
下载时间:2022/10/01 14:38:59
大阪,大阪,大阪,大阪,大阪
,平均当地气压(hPa),总日照量(MJ/m2),平均云量(10分比),总降水量(毫米),天气概况(中午:06点~18点)
2022年8月30日,1002.8,13.01,10.0,6.5,多云临时降雨
2022年8月31日,998.8,23.13,6.3,0.0,晴有时多云
2022年9月1日,1001.1,8.88,10.0,20.5,多云时雨
2022年9月2日,1004.8,20.43,8.5,21.5,晴天有时多云,伴有临时雨和雷电
2022年9月3日、1005.0、15.35、9.3、17.5、晴后多云暂时降雨
2022年9月4日,1004.6,19.90,3.5,0.0,晴后多云
2022年9月5日,1002.9,19.27,3.3,0.0,晴天
2022年9月6日、998.4、14.47、9.5、1.0、晴后多云暂时降雨
2022年9月7日,1003.6,17.47,9.8,2.5,多云
2022年9月8日、1004.8、7.79、10.0、39.0、多云后暂时降雨
2022年9月9日,1004.6,9.35,10.0,5.0,多云时下雨
2022年9月10日,1005.1,19.87,7.5,0.5,晴天多云
2022年9月11日, 1004.2,22.28, 2.8,--,晴
2022年9月12日、1003.4、21.10、5.0,--,晴暂时多云
2022年9月13日,1004.3,21.74,6.8,--,晴
2022年9月14日、1004.5、19.19、7.0,--,多云有时晴
2022年9月15日、1003.0、19.31、7.0,--,晴天
2022年9月16日、1002.1、22.04、7.3,--,晴后多云
2022年9月17日, 1000.4, 8.23, 10.0, 3.5, 多云
2022年9月18日,994.8,11.89,10.0,--,多云
2022年9月19日,984.1,7.09,9.8,16.0,多云临时降雨
2022年9月20日, 995.8, 12.89, 9.8, 16.0, 多云
2022年9月21日,1004.9,13.43,9.3,0.0,多云有时晴
2022年9月22日,1005.5,15.15,10.0,2.0,多云临时降雨
2022年9月23日,1000.9,2.62,9.8,17.0,雨后多云
2022年9月24日, 1002.8, 19.63, 5.3,--,晴
2022年9月25日, 1005.6, 21.19, 2.3,--,晴
2022年9月26日, 1005.8, 20.74, 1.0,--,晴
2022年9月27日,1003.7,10.36,9.5,18.5,多云后雨
2022年9月28日, 1001.3, 12.33, 10.0, 0.0, 多云
2022年9月29日、1003.4、11.88、9.5、0.0、多云暂时晴后临时降雨
2022年9月30日, 1005.4, 19.61, 0.5,--,晴
* 如果您通过 API 获取
天气数据
似乎可以通过从
内部获取,即使使用 Python 库请求。
Intertrust 收集来自世界各地的天气数据。
还提供 API。
在 14 天免费试用期内,您可以检索数据。
实施
导入
from blueqat import Circuit
from blueqat.pauli import Z
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
数据处理
• 天气数据(2022/08/26 - 2022/09/26)
data = np.array(
[
[1002.8,13.01,10.0,6.5],
[998.8,23.13,6.3,0.0],
[1001.1,8.88,10.0,20.5],
[1004.8,20.43,8.5,21.5],
[1005.0,15.35,9.3,17.5],
[1004.6,19.90,3.5,0.0],
[1002.9,19.27,3.3,0.0],
[998.4,14.47,9.5,1.0],
[1003.6,17.47,9.8,2.5],
[1004.8,7.79,10.0,39.0],
[1004.6,9.35,10.0,5.0],
[1005.1,19.87,7.5,0.5],
[1004.2,22.28,2.8,0.0],
[1003.4,21.10,5.0,0.0],
[1004.3,21.74,6.8,0.0],
[1004.5,19.19,7.0,0.0],
[1003.0,19.31,7.0,0.0],
[1002.1,22.04,7.3,0.0],
[1000.4,8.23,10.0,3.5],
[994.8,11.89,10.0,0.0],
[984.1,7.09,9.8,16.0],
[995.8,12.89,9.8,16.0],
[1004.9,13.43,9.3,0.0],
[1005.5,15.15,10.0,2.0],
[1000.9,2.62,9.8,17.0],
[1002.8,19.63,5.3,0.0],
[1005.6,21.19,2.3,0.0],
[1005.8,20.74,1.0,0.0],
[1003.7,10.36,9.5,18.5],
[1001.3,12.33,10.0,0.0],
[1003.4,11.88,9.5,0.0],
[1005.4,19.61,0.5,0.0],
]
)
df = pd. DataFrame(data, columns=['hPa','MJ','cloud','precipitation']) # 平均本地气压(hPa),合计全天日照量(MJ/m2),平均云量(10分比),降水量的合计(mm)
• 根据云量判断天气
y = df["cloud"]
X = df.drop(columns=["cloud"], axis=1)
X_train, X_val, y_train, y_val = train_test_split(
X,
y,
test_size=0.2,
random_state=1
)
模型开发
我们用三个量子位做。
N = 3
提供 1 个种子和 18 个参数。
np.random.seed = 1
params = [np.random.rand() for _ in range(N*6)] # param*18
哈密尔顿尼安
hamiltonian = 1*Z[0]*Z[1]*Z[2]
差分误差和学习率。
h = 1e-6
e = 0.1
arr_loss = []
for k in range(100):
for item, answer in zip(X_train.values, y_train.values):
circuit = Circuit()
print(item)
for i in range(N):
circuit.rx(params[i*3+0])[i].ry(params[i*3+1])[i].rz(params[i*3+2])[i]
circuit.cz[0,1].cz[1,2].cz[2,3].cz[3,0]
for i in range(N):
circuit.rx(np.pi*2*item[i]/100)[i]
for i in range(N):
circuit.rx(params[i*3+N*3])[i].ry(params[i*3+N*3+1])[i].rz(params[i*3+N*3+2])[i]
expt = circuit.run(hamiltonian = hamiltonian)
loss = (expt - answer/100)**2
grad_temp = np.zeros(N*6)
for j in range(N*6):
params_temp = params[:]
angle_temp = params_temp[j]
params_temp[j] += h
circuit = Circuit()
for i in range(N):
circuit.rx(params_temp[i*3+0])[i].ry(params_temp[i*3+1])[i].rz(params_temp[i*3+2])[i]
circuit.cz[0,1].cz[1,2].cz[2,3].cz[3,0]
for i in range(N):
circuit.rx(np.pi*2*item[i]/100)[i]
for i in range(N):
circuit.rx(params_temp[i*3+N*3])[i].ry(params_temp[i*3+N*3+1])[i].rz(params_temp[i*3+N*3+2])[i]
expt_temp = circuit.run(hamiltonian = hamiltonian)
loss_temp = (expt_temp - answer/100)**2
grad_temp[j] = (loss_temp - loss)/h
params -= grad_temp*e
arr_loss.append(loss)
print(loss)
评估/预测
plt.plot(arr_loss)
plt.show()
试着预测适宜的天气。
• 2003 年 8 月 18 日的数据。 云量为8.8,暂时晴朗。
X_test = [1004.8,18.6,0.5]
circuit = Circuit()
for i in range(N):
circuit.rx(params[i*3+0])[i].ry(params[i*3+1])[i].rz(params[i*3+2])[i]
circuit.cz[0,1].cz[1,2].cz[2,3].cz[3,0]
for i in range(N):
circuit.rx(np.pi*2*X_test[i]/100)[i]
for i in range(N):
circuit.rx(params[i*3+N*3])[i].ry(params[i*3+N*3+1])[i].rz(params[i*3+N*3+2])[i]
expt = circuit.run(hamiltonian = hamiltonian)
print(expt*100)
在 6.25270091561785。
云量为1成以下(0~1成)的状态为“晴天”,
2成到8成的状态为“晴天”,
超过九成的状态称为“多云”。
2003年8月18日天气晴朗,预测结果晴朗,这难道不是好问题吗?
结论
输入值太便宜,无法使用。
我们必须检查图像 (QCNN) 还是 GSWR 系统和 QML 的混合体(我们不太确定)。