{
  "cells": [
    {
      "cell_type": "markdown",
      "id": "0de576a4-9a1a-46e9-8d6b-e2c5178d6051",
      "metadata": {
        "gloss": {
          "computational-basis-state": {
            "text": "Also known as Z-basis states, these are the states we measure when we measure in the Z (or 'computational') basis. These are the states with labels like |00〉 and |00110100〉. IBM&reg; quantum computers always measure in the Z-basis.",
            "title": "computational basis state"
          },
          "features": {
            "text": "A feature is a property of the things we're trying to learn about that we can assign a number to. If we were learning something about cats, the features might be \"height\" or \"age\" or \"propensity to consume treats\".",
            "title": "features"
          },
          "unitary": {
            "text": "A unitary operation is a reversible operation that preserves the norm (that is, makes sure our probabilities always sum to 1). [Read more](https://en.wikipedia.org/wiki/Unitary_matrix).",
            "title": "unitary"
          }
        }
      },
      "source": [
        "---\n",
        "title: \"概要\"\n",
        "description: \"量子機械学習の入門編：期待値の設定、コース構成の説明、および最初の例題の提供\"\n",
        "---\n",
        "\n",
        "{/* cspell:ignore webkitallowfullscreen allowfullscreen quantumly Ewin Yunchao Srinivasan Arunachalam Kristan */}\n",
        "\n",
        "<span id=\"introduction-to-quantum-machine-learning\" />\n",
        "\n",
        "# 量子力学入門 Machine Learning\n",
        "\n",
        "<span id=\"overview-and-motivation\" />\n",
        "\n",
        "## 概要と動機\n",
        "\n",
        "量子機械学習へようこそ！\n",
        "\n",
        "以下のビデオで簡単に紹介し、以下の文章で補足する。\n",
        "\n",
        "<IBMVideo id=\"134355930\" title=\"このビデオでは、クリス・ポーターが亜空間量子対角化の概要を説明する。 彼は、その効率性と有用性に影響を与える要因について述べている。 何が他のアプローチより速いのかを説明している。 詳細は以下の文章を参照されたい。\" />\n",
        "\n",
        "ビデオを簡単に振り返り、補強する：\n",
        "\n",
        "* ある問題が量子コンピューターで初めて解決され、その後、古典的なスーパーコンピューターで解決する方法が発見された。 古典コンピューティングと量子コンピューティングが互いの限界に挑み合うこのサイクルは、おそらく数年は続くだろう。\n",
        "* エラーの減少や利用可能な量子ビット数などの分野の進歩により、量子コンピューティングが古典コンピューティングに対して証明可能な優位性を持つ特定の問題がある。 しかし、今はまだ、量子的に利用可能なデータセットや有用な量子特徴マップを探索する時期である。\n",
        "* 量子機械学習（QML）は、量子コンピューティングが既存の古典的なワークフローを補強または補完することができる多くのエキサイティングな分野の1つである。\n",
        "\n",
        "機械学習（ML）はデータセットにアルゴリズムを適用するので、QMLはデータ側かアルゴリズム側のどちらか、あるいは両方に量子力学を含めるのが妥当かもしれない。 これらの可能性はどれも興味深いものだ。 しかし、ここでは古典的データに適用される量子アルゴリズムの議論に限定する。 その理由のひとつは、古典的なデータを使ったMLの問題はすでによく研究され、広く利用できるようになっているからだ。 古典的なデータから始まる問題解決に幅広い関心が寄せられている。 もうひとつの理由は、QRAMがないことだ。 大量の量子データを比較的長い時間スケールで保存する能力がなければ、量子データから始める方法は産業界への応用にはまだかなり遠い。 また、古典データに効率的に「量子アクセス」する方法も不明である。 教師あり学習とは、ラベル付けされたデータセットを使ってアルゴリズムを学習するもので、教師なし学習とは、ラベル付けされていないサンプルから分布を学習しようとするものである。 教師なしアルゴリズムは、例えば、同じ分布から新しいサンプルを生成する方法や、サンプルを似た特徴を持つグループにクラスタリングする方法を学習するかもしれない。\n",
        "\n",
        "![QML\\_CR\\_background\\_Sup\\_Unsup.avif](https://quantum.cloud.ibm.com/learning/images/courses/quantum-machine-learning/introduction/qml-cr-background-sup-unsup.avif)\n",
        "\n",
        "左の画像は、教師あり学習におけるラベル付きデータの2つのカテゴリを示しています。 この場合、カテゴリは線形分離可能である。 右側の画像はデータのクラスターを示しています。 教師なし学習タスクでは、これらのデータは当初ラベル付けされておらず、アルゴリズムは分布を分析し、おそらくクラスターを探すことになる。 アルゴリズムが特定する可能性のある例示クラスターを可視化するため、データポイントにラベルが付けられました。 両者の主な違いは、教師あり学習プロセスは既にラベル付けされたデータから開始するのに対し、教師なしプロセスはラベル付けされていないデータから開始する点にある。たとえ最終的にデータにラベルが付与される場合でも同様である。\n",
        "\n",
        "機械学習の経験がある人なら、多くの解決方法がデータを高次元空間にマッピングすることを含んでいることをすでにご存知だろう。 これは特にカーネルの文脈でよく研究されている。 簡単に思い出してほしいのだが、データが与えられた次元数と同じ次元数の線、面、超平面（コンパクトにするために、単に「超平面」と言うことが多い）によって、データがカテゴリーに分けられることがある。 これは上の最初の画像に示されている。 また、2番目の画像に示すように、それらの次元の超平面によってデータが分離できないこともある。 しかし、高次元へのマッピングで利用できるデータの構造がまだ残っている可能性があり、その場合、データはその高次元空間で分離可能なままとなる。 これは、円対称性を持つ 2D データを、データ点が放物面に沿って配置された 3D 空間へマッピングすることで示されている。\n",
        "\n",
        "![QML\\_CR\\_background\\_2D-3D.avif](https://quantum.cloud.ibm.com/learning/images/courses/quantum-machine-learning/introduction/qml-cr-background-2d-3d.avif)\n",
        "\n",
        "QMLの一般的な目的は、低次元の特徴量から高次元の空間へのマッピングを見つけることです。このマッピングによってデータ点を効果的に分離し、新しいデータ点を分類することができます。\n",
        "しかし、これは簡単なことではなく、機械学習における量子コンピューティングの潜在的な有用性を議論する際には、適切な注意事項を伴わなければならない。 特に、データセットの選択におけるニュアンスの違いや、ユーティリティ・スケールに到達するための課題に取り組まなければならない。 また、古典的なMLアルゴリズムですでに効率的にうまく処理されているデータについて、古典的なMLアルゴリズムを凌駕しようとすることから脱却し、有用な新しい特徴マップを調査することに議論の焦点を絞らなければならない。\n",
        "\n",
        "<span id=\"managing-expectations\" />\n",
        "\n",
        "## 期待値の管理\n",
        "\n",
        "文献に記載されているQMLアプリケーションで使用されている多くのデータセットは、「フィーチャーエンジニアリング」されています。これは、量子コンピューティングが有用である狭いユースケースを示すために、特別にデータセットを選択または生成していることを意味します。 もしこれがズルをしているように見えるなら、私たちは目の前の課題を誤解している。 ある量子特徴マップを使えば、古典的な機械学習アルゴリズムよりも効率よく、あるいはスケーラブルに、すべての、あるいは多くの分類タスクを解くことができるという**わけではない**。 むしろ、量子特徴マップの中には（すべてではないが）古典的特徴マップとは異なる振る舞いをするものがある。 そして目下の課題は、複雑なデータ構造の中で量子回路を探求することである。 具体的な質問をいくつか挙げてみよう：\n",
        "\n",
        "1. 古典的な回路と比較して、どのような量子回路が斬新な振る舞いをする可能性が高いか？\n",
        "2. このような新奇な量子回路を使って探索するのが最適な性質を持つデータを扱う現実の問題はあるのだろうか？\n",
        "3. これらの量子回路は、近い将来の量子コンピューターでスケールするのだろうか？\n",
        "\n",
        "<span id=\"insufficient-explanation\" />\n",
        "\n",
        "### 説明不足\n",
        "\n",
        "量子コンピューティングがいかにパワフルであるかについて、単純化された説明にしばしば出会う。 こんな感じだ：\n",
        "\n",
        "古典的なコンピューターが情報のビットを使うように、量子コンピューターは量子ビットを使う。 あるビット数、例えば4ビットが与えられた場合、古典的なコンピューターは $2^4 = 16$、どの状態にもなりうる。一方、量子コンピューターは16の状態すべての重ね合わせの中に同時に存在することができ、この重ね合わせ全体に対して演算を行うことができる。 場合によっては、高次元空間への写像に基づいた、潜在的に興味深い学習アルゴリズムを設計することができる。\n",
        "\n",
        "これは事実だが、不十分であり、これから説明するように少し誤解を招きやすい。 また、複素係数と実係数の違いが強調されることもある：\n",
        "\n",
        "確率論的古典システムは、システムが異なる状態にある確率を持つものとして記述することができ、次のように記述することができる。\n",
        "\n",
        "$$\n",
        "|s\\rangle = a|0000\\rangle+b|0001\\rangle+c|0010\\rangle+... a, b, c \\in \\reals\n",
        "$$\n",
        "\n",
        "このようなシステムでは、係数 $a$、 $b$、 $c$ などは、正の実数でなければ意味をなさない。 量子コンピュータの状態は、複素数になりうる確率振幅によって記述される。\n",
        "\n",
        "$$\n",
        "|\\psi \\rangle = A|0000\\rangle+B|0001\\rangle+C|0010\\rangle+... A, B, C \\in \\mathbb{C}\n",
        "$$\n",
        "\n",
        "上記の記述は、それが真実であるように細心の注意を払ってなされたものである（表面的に類似した記述の多くは誤りである）。 しかし、これらの正しい記述は、機械学習における量子コンピューティングのパワーを説明するものではない。 ひとつには、量子コンピュータを機械学習に応用する場合、測定が必要になる。 $|\\psi\\rangle = \\frac{1}{\\sqrt{2}}\\left(|0\\rangle+|1\\rangle\\right)$ のような重ね合わせの量子ビットを用意することはできるが、測定結果は $|0\\rangle$ か $|1\\rangle$ のどちらかになる。だから、最低限、次元が増えるという話は不完全だ。 さらに、カーネルの文脈では、ガウスカーネルは無限次元であるため、量子コンピューティングにおける次元の増加は、古典的な代替手段に対する計算能力の十分条件とはなり得ない。 ガウス特徴マップは、無限次元の写像ベクトルを計算する必要性を回避する \"カーネルトリック \"と組み合わせてのみ使用されるという点で、そこには微妙な違いがある。 しかし、ポイントは変わらない：\n",
        "\n",
        "**量子もつれ状態の高次元性は指数関数的な並列性ではないし、機械学習における能力向上の十分条件でもない。**\n",
        "\n",
        "この後のレッスンでは、量子回路を機械学習タスクに組み込むワークフローを紹介し、量子コンピューティングのパワーを探求しやすくすることを明確な目的としている。 なぜなら、そのような特徴マップやアルゴリズムは存在しないからである。 むしろ、有用な量子コンピューティングを探求するために使用する量子ツールの数々を紹介する。\n",
        "\n",
        "<span id=\"dequantization\" />\n",
        "\n",
        "### 脱量子化\n",
        "\n",
        "脱量子化とは、与えられた量子アルゴリズムを、量子アルゴリズムと同様の性能を持つ古典アルゴリズムに置き換えることである。 ある定義によれば、古典的アルゴリズムは量子アルゴリズムより多項式的に遅いだけである。\n",
        "\n",
        "量子機械学習（QML）アルゴリズムの中には、当初は古典的アルゴリズムに比べて大幅な高速化が期待できると考えられていたものが、近年になって量子化解除されたものがいくつかある。 この非量子化のプロセスは、機械学習に対する量子的アプローチの潜在的な利点と限界に関する重要な洞察につながった。\n",
        "\n",
        "最も注目すべき脱量子化の成果のひとつは、エウィン・タンの[推薦システムに関する研究による](https://arxiv.org/abs/1807.04271)ものだ。タンは、これまで量子コンピューターでしか達成できないと考えられていた速度で推薦タスクを実行できる古典的アルゴリズムを発見した。 この発見は、量子アルゴリズムがこの問題に対して指数関数的な優位性を持つという仮定を覆すものだった。 [Shinらによる](https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.6.023218)最近の研究では、変分量子機械学習モデルの関数クラスの量子化可能性に関する条件を特定することに焦点が当てられている。\n",
        "\n",
        "量子化解除の一般的な手法のひとつは（唯一の手法ではないが）、データ読み込みのオーバーヘッドを考慮することである。 つまり、古典的データに適用される量子アルゴリズムには、古典的データを量子コンピュータにエンコードするステップがある。 量子アルゴリズムが、量子データがすでに利用可能な出発点を想定している場合、エンコードに要する時間を効果的に隠すことができる。 量子データを仮定することが合理的な文脈もあるが、興味のあるアプリケーションの多くは古典データから始めるだろう。 いくつかの量子化解除のケースでは、この符号化時間が含まれ、古典的なデータロードが効率的に達成できる場合、量子アルゴリズムはもはや古典的な同等のものを凌駕しないことが示されている。\n",
        "\n",
        "あるアルゴリズムが量子化できないとしても、それがすべての古典的アルゴリズムよりも効率的でスケーラブルであるとは限らない。 極端で作為的な例として、サイズkの集合から最大のj個の要素を選択するアルゴリズムを想像してみよう。 ショールのアルゴリズムを使ってk個の要素をそれぞれ素因数分解し、その素因数を使って最大の要素を決定する量子アルゴリズムを書くことができる。 このようなアルゴリズムは、おそらく量子化することはできないだろうが、同じように最大の要素を選択する（不必要な因数分解の部分は別として）ことを達成する古典的なアルゴリズムよりも劇的に効率が悪い。\n",
        "\n",
        "<span id=\"existence-proof\" />\n",
        "\n",
        "## 存在証明\n",
        "\n",
        "2021年、 IBM Quantum®の研究者であるYunchao Liu、Srinivasan Arunachalam、Kristan Temmeは、Nature誌に論文「 [A rigorous and robust quantum speed-up in supervised machine learning](https://www.nature.com/articles/s41567-021-01287-z) 」を発表した 上記の注意点を踏まえ、この研究では、(1)古典的に難しいことが知られており、(2)量子アルゴリズムが高速化を示すのに適した分類問題を慎重に選んだ。\n",
        "\n",
        "この論文では、離散対数に基づくデータの分類を扱っている。 この論文を引用すると、\"大きな素数 $p$ と $\\mathbb{Z}^*_p = {1, 2, . . . , p − 1}$ の生成器 $g$ については、 $x \\in \\mathbb{Z}^*_p $ の入力 $\\text{log}_g(x)$ を、 $p$ を表現するのに必要なビット数 $n = \\lceil{\\text{log}_2(p)}\\rceil$ の多項式時間で計算できる古典的アルゴリズムはない、というのが広く信じられている推測である。\"対照的に、 [Shorのアルゴリズムは](https://epubs.siam.org/doi/10.1137/S0097539795293172)離散対数問題を多項式時間で解くことが知られている。 つまり、古典的な硬さ（量子化される可能性が低い）と、量子アルゴリズムに適していることが知られている、という条件を同時に満たす問題である。\n",
        "\n",
        "このように分類問題を慎重に選択することで、著者らは量子カーネル法（以下で簡単に説明し、後のレッスンで議論する）を用いて、エンド・ツー・エンドでロバストな指数関数的なスピードアップを示すことができた。 ここでいう \"end-to-end \"とは、古典的なデータから始めるという前提のことである。 ここでいう「ロバスト」とは、量子アルゴリズムを用いて分類されるデータが大きなマージンをもって分離され、分類の成功が有限サンプリング誤差のような実世界の考慮事項に対してロバストであることを指す。\n",
        "\n",
        "これらはすべて、量子カーネルが指数関数的なスピードアップをもたらす問題が存在するということだ。 しかし、科学の現状では、そのような問題は、観測に基づいて選択されるか、量子アルゴリズムに従順であるべきだという理論的な根拠に基づいて選択される。 古典的なコンピューターがすでに十分にこなしている機械学習タスクに、量子的なスピードアップを期待するのは現実的ではない。\n",
        "\n",
        "量子ユーティリティの探求のために、このような理想的なケースを特定することは、このコースの学習者にとって大きな責任である。 そしてそれは、このようなコースで達成できる課題ではない。 その探求は、あなたのような研究者で構成される IBM 量子ネットワーク全体の課題である。 このコースでは、QMLのワークフローとエンコーディングのストラテジーを紹介します。\n",
        "\n",
        "この序章で、量子機械学習について少しはご理解いただけただろうか：\n",
        "\n",
        "1. 量子アルゴリズムは、古典的に難しく、量子アルゴリズムに適した非常に特殊な問題に対して、古典的アルゴリズムよりも指数関数的なスピードアップを提供することができる。\n",
        "2. 量子コンピューティングにおけるもつれ状態の高次元性は重要だが、古典的アルゴリズムに対する優位性を得るだけでは十分ではない。\n",
        "3. 量子アルゴリズムに適した問題を見つけるのは非常に困難な作業であり、このコースの学習者がその大部分を担うことになる。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "8ff490cb-1b17-4ac7-bd32-9edca1aa051e",
      "metadata": {},
      "source": [
        "<span id=\"check-in-questions\" />\n",
        "\n",
        "## チェックインに関する質問\n",
        "\n",
        "量子状態は古典状態と何が違うのか？\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"回答\">\n",
        "    ほんとうに 特に：複素係数、および単一コピーとの重ね合わせ。 今後取り上げる他の多くの違いには、量子もつれや干渉などが含まれます。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n",
        "真か偽か？ 高度にエンタングルされた量子状態は、量子コンピューター上でほとんどの機械学習問題をより効率的に解くことを可能にする。\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"回答\">\n",
        "    これは誤解です。 ほとんどの機械学習問題は、古典的アルゴリズムによって非常に効率的に解決されており、量子アルゴリズムが大幅なスピードアップをもたらすことはないだろう。 QMLの目標は、量子状態によってよく記述される特徴を持つデータセットを見つけること、あるいはモデルの精度を最適化するデータ特徴のマッピングを見つけることである。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "0158cbee-9b6e-4b74-a449-a4cb6ef27f18",
      "metadata": {},
      "source": [
        "<span id=\"course-learning-goals\" />\n",
        "\n",
        "## コース学習目標\n",
        "\n",
        "このコースを修了することで、以下のコア・スキルとコンピテンシーを身につけることができます。 学習者は次のことができるようになる：\n",
        "\n",
        "1. QMLとは何か、量子が古典的機械学習とどのような関係にあるのかを説明する。\n",
        "\n",
        "2. 量子ボキャブラリーと主要用語をMLワークフローに適用する。\n",
        "\n",
        "3. QMLワークフローの主要コンポーネント（様々なタイプ）を特定する。\n",
        "\n",
        "4. 異なるタイプのQMLを識別し、それらを区別する。\n",
        "\n",
        "5. IBM Quantum のプリミティブを使用し、Qiskitのパターンに従って、量子カーネル法および変分量子分類器を実装する。\n",
        "\n",
        "6. QMLが最も有望な場所とそうでない場所を特定する。\n",
        "\n",
        "7. 例題を自分のデータセットに合わせる。\n",
        "\n",
        "8. トレーニング時間、ノイズ、マルチステートリードアウトの複合エラーなど、QMLの問題点に注意してください。\n",
        "\n",
        "9. QMLが組織にどのような利益をもたらすかを提案する。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "cb9bf2a7-8487-482f-8fcc-95d2210bc314",
      "metadata": {},
      "source": [
        "<span id=\"course-structure\" />\n",
        "\n",
        "## コース構成\n",
        "\n",
        "このコースはいくつかのレッスンで構成されている。 各レッスンには、テキスト中にいくつかのチェックイン問題があるので、新しいスキルを練習したり、理解度を確認しながら進めることができます。 これらは必須ではない。\n",
        "\n",
        "コースの最後には20項目の小テストがある。 Quantum Machine Learning バッジを取得するには、このクイズで70%以上のスコアを獲得する必要があります。 70％以上のスコアを獲得すると、その後すぐにバッジが自動的にEメールで送られる。 クイズの提出は2回までです。 1回目の提出後、解けなかった問題に再挑戦する機会があります。 2回目の提出後、スコアは最終決定となる。 詳細はクイズを参照。\n",
        "\n",
        "コース構成は以下の通り：\n",
        "\n",
        "* レッスン1：イントロダクションと概要\n",
        "* レッスン2：機械学習の復習\n",
        "* レッスン3：データエンコーディング\n",
        "* レッスン4：量子カーネル法とサポートベクターマシン\n",
        "* 第5課 変量量子分類器／ニューラルネットワーク\n",
        "* バッジ試験\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "622774e8-c23c-4610-b204-80390b639852",
      "metadata": {},
      "source": [
        "<span id=\"run-your-first-qml-code\" />\n",
        "\n",
        "## 最初のQMLコードを実行する\n",
        "\n",
        "その前に、どこに行こうとしているのかを確認し、その背景を掘り下げていくことは、しばしば役に立つ。 以下のコードセルは、量子カーネル法の単純なインスタンスを実行する。 具体的には、単一のカーネル行列要素が計算される。 カーネル・メソッドや量子カーネルに慣れていないユーザーも、これで怖気づく必要はない。このコースの複数のレッスンは、これらのセルで何が行われているかを正確に解剖することに費やされる。\n",
        "\n",
        "このコードと同時に、我々はQiskitパターンを紹介する。これは、ユーティリティ・スケールで量子コンピューティングにアプローチするためのフレームワークである。 このフレームワークは、非常に一般的で、ほとんどの問題に適用できる4つのステップで構成されている（ただし、ワークストリームによっては、特定のステップを複数回繰り返す場合もある）。\n",
        "\n",
        "<span id=\"qiskit-patterns\" />\n",
        "\n",
        "### Qiskit パターン:\n",
        "\n",
        "* ステップ1：古典的入力を量子問題にマップする\n",
        "* ステップ2：量子実行のための問題の最適化\n",
        "* ステップ 3: `IBM Quantum` プリミティブを使用して実行する\n",
        "* ステップ4：分析／後処理\n",
        "\n",
        "以下のセルでは、様々なステップについてざっくりとした説明しかしていないので、より詳しく学ぶために適切なレッスンを見つけるのに十分である。\n",
        "\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "id": "63b85808-7f02-446e-9ef6-38369c95a4bb",
      "metadata": {},
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "--2025-05-09 10:04:28--  https://raw.githubusercontent.com/qiskit-community/prototype-quantum-kernel-training/main/data/dataset_graph7.csv\n",
            "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...\n",
            "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.\n",
            "HTTP request sent, awaiting response... 200 OK\n",
            "Length: 49405 (48K) [text/plain]\n",
            "Saving to: ‘dataset_graph7.csv.2’\n",
            "\n",
            "dataset_graph7.csv. 100%[===================>]  48.25K  --.-KB/s    in 0.03s   \n",
            "\n",
            "2025-05-09 10:04:29 (1.37 MB/s) - ‘dataset_graph7.csv.2’ saved [49405/49405]\n",
            "\n"
          ]
        },
        {
          "data": {
            "text/plain": [
              "0.8199"
            ]
          },
          "execution_count": 1,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "# Import some qiskit packages required for setting up our quantum circuits.\n",
        "from qiskit.circuit import Parameter, ParameterVector, QuantumCircuit\n",
        "from qiskit.circuit.library import unitary_overlap\n",
        "\n",
        "# Import StatevectorSampler as our sampler.\n",
        "from qiskit.primitives import StatevectorSampler\n",
        "\n",
        "# Step 1: Map classical inputs to a quantum problem:\n",
        "\n",
        "# Start by getting some appropriate data.\n",
        "# The data imported below consist of 128 rows or data points.\n",
        "# Each row has 14 columns that correspond to data features, and a 15th column with a label (+/-1).\n",
        "!wget https://raw.githubusercontent.com/qiskit-community/prototype-quantum-kernel-training/main/data/dataset_graph7.csv\n",
        "\n",
        "# Import some required packages, and write a function to pull some\n",
        "# training data out of the csv file you got above.\n",
        "import pandas as pd\n",
        "import numpy as np\n",
        "\n",
        "\n",
        "def get_training_data():\n",
        "    \"\"\"Read the training data.\"\"\"\n",
        "    df = pd.read_csv(\"dataset_graph7.csv\", sep=\",\", header=None)\n",
        "    training_data = df.values[:20, :]\n",
        "    ind = np.argsort(training_data[:, -1])\n",
        "    X_train = training_data[ind][:, :-1]\n",
        "\n",
        "    return X_train\n",
        "\n",
        "\n",
        "# Prepare training data\n",
        "X_train = get_training_data()\n",
        "\n",
        "# Empty kernel matrix\n",
        "num_samples = np.shape(X_train)[0]\n",
        "\n",
        "# Prepare feature map for computing overlap between two data points.\n",
        "# This could be pre-built feature maps like ZZFeatureMap, or a custom quantum circuit,\n",
        "# as shown here.\n",
        "num_features = np.shape(X_train)[1]\n",
        "num_qubits = int(num_features / 2)\n",
        "entangler_map = [[0, 2], [3, 4], [2, 5], [1, 4], [2, 3], [4, 6]]\n",
        "fm = QuantumCircuit(num_qubits)\n",
        "training_param = Parameter(\"θ\")\n",
        "feature_params = ParameterVector(\"x\", num_qubits * 2)\n",
        "fm.ry(training_param, fm.qubits)\n",
        "for cz in entangler_map:\n",
        "    fm.cz(cz[0], cz[1])\n",
        "for i in range(num_qubits):\n",
        "    fm.rz(-2 * feature_params[2 * i + 1], i)\n",
        "    fm.rx(-2 * feature_params[2 * i], i)\n",
        "\n",
        "# Pick two data points, here 14 and 19, and assign the features to the circuits as parameters.\n",
        "x1 = 14\n",
        "x2 = 19\n",
        "unitary1 = fm.assign_parameters(list(X_train[x1]) + [np.pi / 2])\n",
        "unitary2 = fm.assign_parameters(list(X_train[x2]) + [np.pi / 2])\n",
        "\n",
        "# Create the overlap circuit\n",
        "overlap_circ = unitary_overlap(unitary1, unitary2)\n",
        "overlap_circ.measure_all()\n",
        "overlap_circ.draw(\"mpl\", scale=0.6, style=\"iqp\")\n",
        "\n",
        "# Step 2: Optimize problem for quantum execution\n",
        "\n",
        "# Use IBM Quantum Compute Service to get the least busy backend for running on real quantum computers.\n",
        "# from qiskit_ibm_runtime import QiskitRuntimeService\n",
        "\n",
        "# service = QiskitRuntimeService(channel=\"ibm_quantum\")\n",
        "# backend = service.least_busy(\n",
        "#    operational=True, simulator=False, min_num_qubits=overlap_circ.num_qubits\n",
        "# )\n",
        "\n",
        "# Transpile the circuits optimally for the chosen backend using a pass manager.\n",
        "# from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\n",
        "# pm = generate_preset_pass_manager(optimization_level=3, backend=backend)\n",
        "# overlap_ibm = pm.run(overlap_circ)\n",
        "\n",
        "# Step 3: Execute using IBM Quantum primitives\n",
        "\n",
        "# Specify the number of shots to use.\n",
        "num_shots = 10_000\n",
        "\n",
        "## Evaluate the problem using statevector-based primitives from Qiskit\n",
        "sampler = StatevectorSampler()\n",
        "counts = (\n",
        "    sampler.run([overlap_circ], shots=num_shots).result()[0].data.meas.get_int_counts()\n",
        ")\n",
        "\n",
        "# Step 4: Analyze and post-processing\n",
        "\n",
        "# Find the probability of 0.\n",
        "counts.get(0, 0.0) / num_shots"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "453db58e-80b2-41df-8b9c-52dc17be6174",
      "metadata": {},
      "source": [
        "上記のステップをすべて理解する必要はないが、アウトプットを理解するようにしよう。 機械学習における多くのプロセスは、（とりわけ）二値分類の一部として内積を使用する。 量子力学はこれと明らかに関係がある。さまざまな状態 $|\\phi_i\\rangle$ を測定する確率は、内積を通して初期状態 $|\\psi\\rangle$ との内積によって与えられるからである。 $P_i = |\\langle\\phi_i|\\psi\\rangle|^2$。つまり、我々が上記で行ったことは、2つのデータの特徴を含む量子回路を作成し、それらを量子ベクトルの空間にマッピングし、測定を行うことでその空間における内積を推定することである。 これは量子カーネル推定の例である。 なお、この処理は2つのデータポイント（14日と19日）に対してのみ実施した。 可能なすべてのペアについてこれを行えば、出力（この場合、数字 0.821...）を得ることができる を計算し、トレーニングデータセット内のすべての点間の重複を記述する結果の行列を入力する。 これが「カーネル行列」である。\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "id": "29a0f015-46a3-4b6d-8afa-c188cc5aab36",
      "metadata": {},
      "source": [
        "<span id=\"check-your-understanding\" />\n",
        "\n",
        "#### 理解度チェック\n",
        "\n",
        "上記のプロセスでは、14番目と19番目のデータポイントに対してカーネル行列のエントリを計算した。 ここで、同じデータポイントを2回（14日と14日のように）使用した場合、どのような値が得られるだろうか？ 言い換えれば、カーネル行列の対角エントリーはどうあるべきか？ ノイズがない場合にこの質問に答えてください。ただし、ノイズがある場合には、あなたの答えから外れる可能性があることに注意してください。\n",
        "\n",
        "<Accordion>\n",
        "  <AccordionItem title=\"回答\">\n",
        "    対角線は 1.0。 この処理は、ベクトルとそれ自身との正規化内積を計算するもので、常に1でなければならない。\n",
        "  </AccordionItem>\n",
        "</Accordion>\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "id": "a1b8767d",
      "source": "© IBM Corp., 2017-2026"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 4
}