[QNN] 量子机器学习中的天气预报

设置自适应区域

使用量子机器学习来理解天气预报。
具体来说,我们预测大阪市的天气。

获取和确认数据

从日本气象厅下载大阪市最近一个月的CSV数据。 (截至2022年9月27日)

https://www.data.jma.go.jp/gmd/risk/obsdl/index.php

下载的 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 天免费试用期内,您可以检索数据。

https://www.intertrust.com/

实施

导入

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 的混合体(我们不太确定)。