common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

小中高校生向け親子AI&量子コンピュータプログラミングコード実例

Yuichiro Minato

2022/01/22 06:26

#量子コンピュータ #データサイエンス

5

2

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

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

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

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

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

./img/220122img1.jpg

まずはツールの読み込みです。#の記号のあとはコメントといって落書きですので実行されません。

#ツールの読み込み。 from blueqat import Circuit
Circuit().i[0].m[:].run(shots=100)
Counter({'0': 100})

簡単に解説します。 プログラミングはblueqatの開発したメソッドチェーンを使います。これは世界中の量子コンピュータプログラミングでblueqatの作った方式が採用されています。 プログラミングを点でつないでいきます。

Circuit()は準備です。何も考えずに書きましょう。

次に、i[0]ですが、これはiというプログラミングを0番目のつぶに計算しますという意味です。iは実は何もしないという命令なので、何も起きません。

次に、m[:]ですが、これは計算結果を取り出すというのを全部のつぶでやるといういみです。mは英語でmeasurement、:は全部っていう意味です。m[0]でもかまいません。

最後に、run(shots=100)ですが、これは100回同じ計算をするという意味です。

計算結果は、

Counter({'0': 100})

とでました。これは0が100回答えとして出ましたということです。つぶの計算では、0から計算が始まり、何もしないので0のままです。次に少し改造してみます。

Circuit().x[0].m[:].run(shots=100)
Counter({'1': 100})

今度は先ほどのiの部分をxに変えてみました。xは0を1に、1を0にするものです。これを実行すると今度は、1が100回出たとなりましたね。0のつぶを1のつぶにしました。ここまでは量子コンピュータ特有のなみの計算をしていません。なみの計算をしてみます。

./img/220122img1.jpg

粒を波に変えるには、hを使います。

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

どうでしょうか。今度は0が52回、1が48回とでました。これは計算するごとに変化します。なみをみると、0と1が約半分ずつ出ます。これが量子コンピュータの特有の計算です。

実はつぶだけを使うと今のコンピュータと同じ計算ができます。なみをつかうとさらに追加で新しい計算ができます。今のコンピュータと同じ計算をわざわざ量子コンピュータでやらせる必要がないので、今はなみの計算をするのが流行っています。

量子コンピュータのかんたんな説明は以上です。次はデータサイエンスを見てみたいと思います。

./img/220122img3.jpg

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

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

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

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

データサイエンスで家の値段を予測してみる

データサイエンスの基本で、データをつかって家の値段を予測してみます。 データは適当に作りました。駅からの距離や広さ、間取り、築年数などの情報があります。 これらは普通は人がなんとなく判断しますが、データから新しい家の値段を予測します。 不動産屋さんとかで値段が出ますが、これを使うとその値段が高いのか安いのかがAIでわかります。

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

import pandas as pd import numpy as np

まずはデータを準備します。今回は適当に作ったデータを使います。ここはデータを適当に作ってるだけなので無視してください。 データは東急田園都市線のたまプラーザ駅周辺の実際の物件のデータをウェブから集めました。

名前は日本語でもいいのですが、あとで問題になるので、英語に直しておきます。

#データを準備しました。 data = np.array([[8,3,83.74,18,22],[5,2,75.72,19,19],[7,2,31.47,46,7.8],[18,2,46.62,36,8],[8,3,41.02,49,8],[8,1,70.43,25,15.8],[8,1,70.43,25,15.8],[12,1,48.02,3,12.5],[10,4,58.57,36,11.8]]) df = pd.DataFrame(data,columns=['駅徒歩','階数','広さ','築年数','賃料']) df
    駅徒歩   階数     広さ   築年数    賃料

0   8.0  3.0  83.74  18.0  22.0

1   5.0  2.0  75.72  19.0  19.0

2   7.0  2.0  31.47  46.0   7.8

3  18.0  2.0  46.62  36.0   8.0

4   8.0  3.0  41.02  49.0   8.0

5   8.0  1.0  70.43  25.0  15.8

6   8.0  1.0  70.43  25.0  15.8

7  12.0  1.0  48.02   3.0  12.5

8  10.0  4.0  58.57  36.0  11.8
df = pd.DataFrame(data,columns=['toho','kaisu','hirosa','chiku','chinryo']) df
   toho  kaisu  hirosa  chiku  chinryo

0   8.0    3.0   83.74   18.0     22.0

1   5.0    2.0   75.72   19.0     19.0

2   7.0    2.0   31.47   46.0      7.8

3  18.0    2.0   46.62   36.0      8.0

4   8.0    3.0   41.02   49.0      8.0

5   8.0    1.0   70.43   25.0     15.8

6   8.0    1.0   70.43   25.0     15.8

7  12.0    1.0   48.02    3.0     12.5

8  10.0    4.0   58.57   36.0     11.8

データが読み込めました、各データが表形式で与えられます。 これから、諸条件での賃料を予測してみたいとおもいます。

まずはこれらのデータを覚えさせる必要があります。今回は賃料を予測するので、賃料とそれ以外のデータに分けます。

#賃料だけのデータ y = df["chinryo"] #賃料以外のデータ X = df.drop(columns=["chinryo"], 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
   toho  kaisu  hirosa  chiku

6   8.0    1.0   70.43   25.0

7  12.0    1.0   48.02    3.0

1   5.0    2.0   75.72   19.0

0   8.0    3.0   83.74   18.0

4   8.0    3.0   41.02   49.0

3  18.0    2.0   46.62   36.0

5   8.0    1.0   70.43   25.0

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

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

Requirement already satisfied: scipy in /opt/conda/lib/python3.8/site-packages (from xgboost) (1.6.3)

Requirement already satisfied: numpy in /opt/conda/lib/python3.8/site-packages (from xgboost) (1.20.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使いませんでしたが、いきなりテストに行こうと思います。 問題は、

駅徒歩9分、5階、広さ58.3平米、築年数34年の物件の賃料を予測してみます。ちなみに、答えは11.5万円です。

X_test = np.array([[9,5,58.3,34]]) predictions = model.predict(X_test) predictions[0]
12.301528

いかがでしょうか。少ないデータでもある程度近い値が出まいた。12.3万円。こたえは11.5万円です。どれくらい近いかを測る指標はいろいろありますが今回は割愛させていただきます。 実際にはこれらのどれくらい近いかという基準を決めて学習や評価をします。

そして、便利なのが、今回どの数字が家賃に最も影響を与えるかを見てみましょう。 これを見ると、広さと駅徒歩や階数が影響しているのがわかります。

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

このようにデータサイエンスを利用することでいろいろなことを学習させて予測することができます。この流れは量子コンピュータでも全く同じなので、まずは普通のコンピュータのデータサイエンスをpythonで学ぶところからスタートするのがよいと思います。以上です。

© 2024, blueqat Inc. All rights reserved