common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


Sign in
Sign up
common.title

220127データプログラミング教室プログラミング例

Yuichiro Minato

2022/01/27 09:50

小中高校生向け親子AI&量子コンピュータプログラミング解説会

データサイエンスと量子コンピュータに関しての説明をします。
資料は勉強会ではPDFでも提供しています。

ここでは、簡単なデータの扱い方と量子コンピュータのプログラミングを行います。
本ファイルはjupyternotebookという方式で書かれていて、blueqat cloudでしたら、ページにある自動取り込みボタンを押せば、クラウドに導入されます。

量子コンピュータプログラミング

データサイエンスに行く前に簡単に量子コンピュータのプログラミングだけを見てみたいと思います。
量子コンピュータはものすごい小さい「つぶ」と「なみ」を切り替えて計算をします。

#ツールの読み込み。
from blueqat import Circuit

Circuit().h[0].m[:].run(shots=100)
Counter({'1': 47, '0': 53})

これは量子コンピュータの最も簡単なプログラミングで、hゲートを使います。普通は0とか1とか答えは計算ごとに同じ答えが出ますが、これは0と1が半分ずつ出るけいさんです。かさねあわせとよびます。

量子テレポーテーション

量子テレポーテーションは人間がテレポートするわけではありません。数字がテレポートします。
今回は簡単な量子回路を使って数字をテレポートさせます。

a = Circuit().h[1].cx[1,2].cx[0,1].h[0].cx[1,2].cz[0,2].m[:]
a.run(shots=100)
Counter({'110': 23, '010': 30, '100': 24, '000': 23})

こちらが基本的な量子テレポーテーション回路です。みるべきものは、一番最後の数字となっていて、最後が全部0になっています。これは本当は一番最初にあった数字が最後に移動しています。そういう意味で量子テレポーテーションです。つぎに1を最後に移動させてみましょう。

(Circuit().x[0] + a).run(shots=100)
Counter({'011': 26, '111': 22, '001': 27, '101': 25})

これもきちんと最後の数字が1になっています。

(Circuit().h[0] + a).run(shots=100)
Counter({'011': 9,
         '110': 21,
         '001': 15,
         '101': 17,
         '100': 11,
         '010': 14,
         '000': 7,
         '111': 6})

重ね合わせに量子テレポーテーションをかけてもやっぱりちゃんと最後の数字に反映されています。
量子コンピュータのかんたんな説明は以上です。次はデータサイエンスを見てみたいと思います。

将来的な量子コンピュータアプリ

実は将来的な量子コンピュータのアプリも今のコンピュータで必要とされるアプリとあまり変わりません。量子コンピュータを使ってより速い計算やより安く計算をしたいという要望がありますが、それらは今のコンピュータの延長線上でとらえることも可能になっています。

ここでは、今量子コンピュータで将来的に最も期待されているAI分野でのアプリにフォーカスしてみたいと思いますが、2022年段階では普通のコンピュータでそのようなデータを学ぶのが効率的です。

量子コンピュータでもAIでも使われるプログラミング言語は同じです。私たちが今使っているpython(パイソン)という言語です。これを使うことにより、現在も未来も仕事をすることができます。ここでは、データサイエンスの基本であるよそくをやってみたいと思います。

データサイエンスでポケモンガオーレのポケエネを当てる

データはいえに散らかっていたポケモンガオーレディスクをつかいました。ポケモン10匹のデータを入力しておぼえさせます。
そのご、ポケエネを知りたいポケモンのデータを入れてあててみます。

まずはツールを読み込みます。pandasというツールを使います。numpyは便利な計算がたくさん入っているツールです。

import pandas as pd
import numpy as np
#データを準備しました。
data = np.array([ #ポケエネ、#たいりょく,#こうげき、#ぼうぎょ、#とっこう、#とくぼう、#すばやさ
    [96,107,78,54,78,54,104],  #パルスワン
    [110,125,110,81,96,62,72], #アップリュー
    [114,118,108,128,61,66,94], #リーフィア
    [94,113,54,54,79,84,82], #フォクスライ
    [96,119,104,80,63,72,40], #オトスパス
    [124,122,101,85,125,101,85], #パルキア
    [104,110,76,59,93,76,105], #ジュカイン
    [66,91,65,38,38,38,59], #ワルビル
    [70,85,49,45,61,50,61], #マグマラシ
    [84,98,64,80,64,80,34] #ビークイーン
])
df = pd.DataFrame(data,columns=['pokeene','tairyoku','kougeki','bougyo','tokko','tokubo','subayasa'])
df
   pokeene  tairyoku  kougeki  bougyo  tokko  tokubo  subayasa
0       96       107       78      54     78      54       104
1      110       125      110      81     96      62        72
2      114       118      108     128     61      66        94
3       94       113       54      54     79      84        82
4       96       119      104      80     63      72        40
5      124       122      101      85    125     101        85
6      104       110       76      59     93      76       105
7       66        91       65      38     38      38        59
8       70        85       49      45     61      50        61
9       84        98       64      80     64      80        34

まずは、データから覚えさせたいポケエネのデータだけを分けます

#ポケエネだけのデータ
y = df["pokeene"]

#ポケエネ以外のデータ
X = df.drop(columns=["pokeene"], axis=1)

次に覚えさせるためのデータと、覚えさせないテスト用のデータを準備します。試験勉強では勉強した範囲とちょっと違う問題がでますよね。きちんと応用ができるかどうかを確かめるために、学習したデータにはテストのデータを入れないようにします。学習用のデータをtrain、テスト用のデータをvalとつけます。

これらの訓練用のデータを作るための便利ツールがあります。今回はsklearnという統計用のツールを使います。test_size=0.2は全体の20%をテストに回すという意味です。

from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=1)
X_train
   tairyoku  kougeki  bougyo  tokko  tokubo  subayasa
6       110       76      59     93      76       105
4       119      104      80     63      72        40
0       107       78      54     78      54       104
3       113       54      54     79      84        82
1       125      110      81     96      62        72
7        91       65      38     38      38        59
8        85       49      45     61      50        61
5       122      101      85    125     101        85

こんな感じでできました。さっそくこれらのデータをおぼえさせてみます。
今回はxgboostというツールを使って覚えさせます。まずインストールをします。

!pip install xgboost
Requirement already satisfied: xgboost in /opt/conda/lib/python3.8/site-packages (1.5.2)
Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from xgboost) (1.20.3)
Requirement already satisfied: scipy in /opt/conda/lib/python3.8/site-packages (from xgboost) (1.6.3)

完了したらさっそく使えます。

学習にはいろいろな方法がありますが、それらの学習する方法をmodelといいます。

そして、modelにデータを学習させます。学習はfitを使います。

学習には、問題と答えがあり、X_trainが問題、y_trainが答えに相当します。

# xgboost
import xgboost as xgb

model = xgb.XGBRegressor(n_estimators=1000, learning_rate=0.01)
model.fit(X_train, y_train)
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,
             colsample_bynode=1, colsample_bytree=1, enable_categorical=False,
             gamma=0, gpu_id=-1, importance_type=None,
             interaction_constraints='', learning_rate=0.01, max_delta_step=0,
             max_depth=6, min_child_weight=1, missing=nan,
             monotone_constraints='()', n_estimators=1000, n_jobs=2,
             num_parallel_tree=1, predictor='auto', random_state=0, reg_alpha=0,
             reg_lambda=1, scale_pos_weight=1, subsample=1, tree_method='exact',
             validate_parameters=1, verbosity=None)

これで学習が終わりました。ちょっと今回はval使いませんでしたが、いきなりテストに行こうと思います。
問題は、

たいりょく96,こうげき66,ぼうぎょ55,とっこう48,とくぼう55,すばやさ41のヌマクローのデータをつかってポケエネをあててみます

X_test = np.array([[96,66,55,48,55,41]])

predictions = model.predict(X_test)
predictions[0]
69.99208

いかがでしょうか。70くらいとでました。正解は72となっていますので、大体近いすうじがでてますね。次になんの数字がポケエネをあてるのにつかえるかをみてみます。

xgb.plot_importance(model)
<AxesSubplot:title={'center':'Feature importance'}, xlabel='F score', ylabel='Features'>
<Figure size 432x288 with 1 Axes>

image

これを見ると、たいりょくが一番だいじとなります。こういうふうにデータを使って学ぶことができますが、今のコンピュータでも量子コンピュータでもやることは基本的には変わりません。

おまけ

AIがデータを覚えるようすをみる

evals_result = {}
model = xgb.XGBRegressor(n_estimators=1000, learning_rate=0.01)
model.fit(X_train, y_train,eval_set=[(X_train, y_train),(X_val, y_val)],
        eval_metric='rmse',callbacks=[xgb.callback.record_evaluation(evals_result)],verbose=0)

import matplotlib.pyplot as plt

#trainデータに対してのloss推移をplot
plt.plot(evals_result['validation_0']['rmse'], label='train rmse')
#testデータに対してのloss推移をplot
plt.plot(evals_result['validation_1']['rmse'], label='eval rmse')
plt.grid()
plt.legend()
plt.xlabel('rounds')
plt.ylabel('rmse')
plt.show()
<Figure size 432x288 with 1 Axes>

image

© 2025, blueqat Inc. All rights reserved