論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
内積
Inner Product / Dot Product
数学基礎
別称: ドット積

🔖 キーワード索引

内積ドット積dot productコサイン類似度射影直交ノルムベクトル

内積 a·b = Σ aᵢbᵢ は、2 本のベクトルの成分ごとの積を足した 1 つの数。下のチップはどれも内積から作られる量で、コサイン類似度は内積をノルムの積で割ったもの、共分散は平均を引いたベクトル同士の内積、Cauchy-Schwarz 不等式 |a·b| ≤ ‖a‖‖b‖ はコサインが −1〜1 に収まる理由になる。

コサイン類似度ノルム直交射影共分散 = 中心化ベクトルの内積グラム行列Cauchy-Schwarz 不等式行列積

💡 30秒で分かる結論

🍰 まずはやさしく

内積はベクトルの掛け算のようなものです。

2つのデータの似具合を調べるために使います。

スマホのオススメ機能などで活用されています。

ここでは内積の基本と計算方法を学びます。

ベクトル積の基本。 類似度・射影に使用

📍 あなたが今見ているもの

🍰 まずはやさしく

内積はデータ分析の主役となる道具です。

機械学習などの高度な計算に欠かせません。

検索エンジンの仕組みなどにも使われています。

定義から実装までを6つの視点で解説します。

Word2Vec の単語類似度、 検索エンジンの文書スコアリング、 ニューラルネットの forward 計算 — 全部内積です。 機械学習の隠れた主役。

🎨 直感で掴む

🍰 まずはやさしく

内積は「好みの近さ」を測る物差しです。

データがどれくらい似ているか判断します。

趣味が似ている人を探すイメージです。

入力から解釈までの流れを順に説明します。

2人の人物のベクトル(趣味プロファイル)の内積:

  • 同じ方向=同じ趣味 → 内積大 → 類似度高い
  • 直角=全く違う趣味 → 内積 0 → 無関係
  • 逆方向=対立する趣味 → 内積負 → 不一致

これがコサイン類似度の本質。 推薦システムの基本原理です。

📐 定義/数式

🍰 まずはやさしく

内積はドット積とも呼ばれる計算です。

向きや長さの関係を数値にするために使います。

部活の得点データなどの分析に役立ちます。

計算式と図形的な意味について解説します。

内積(Inner Product / Dot Product):ベクトル積の基本。 類似度・射影に使用

同義・関連語:ドット積

【内積の定義】
$$ \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta $$
代数定義(左)と幾何定義(右)が一致する点が美しい。 $\theta$ は 2ベクトルのなす角。

🔬 記号・用語の読み解き(数式を言葉で読み解く)

内積の定義式 $\mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i$ は、 「2 つのベクトルの対応する成分どうしを掛け合わせて足す」というシンプルな計算ですが、 同時に $\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta$ という幾何的表現と一致するのが内積の核心です。 代数的には「ただの成分計算」に見えますが、 幾何的には「ベクトルの『揃い具合』を測る」操作。 ベクトル $\mathbf{b}$ をベクトル $\mathbf{a}$ の方向に正射影した長さに、 $\|\mathbf{a}\|$ を掛けた値が内積になります。 これは「類似度の最も自然な定義」と言える性質で、 機械学習・統計・物理・工学の至るところで顔を出します。たとえば線形回帰の予測式 $\hat{y} = \mathbf{w} \cdot \mathbf{x}$ は「重みベクトル $\mathbf{w}$ と特徴量ベクトル $\mathbf{x}$ の内積」で、 ニューラルネットワークの 1 ニューロンの出力 $z = \mathbf{w} \cdot \mathbf{x} + b$ も同じ。 推薦システムにおける協調フィルタリングの行列分解(Matrix Factorization)では、 ユーザーベクトル $\mathbf{u}$ とアイテムベクトル $\mathbf{v}$ の内積 $\mathbf{u} \cdot \mathbf{v}$ で評価予測を行います。 また、 直交性(直角)の判定が「内積 = 0」という 1 行の条件で表せるのも重要。 PCA(主成分分析)が「データを直交基底に展開する」ためには、 内積の零条件が本質的役割を果たします。 つまり内積は 線形代数の万能演算。 「ベクトルの類似度」「射影の長さ」「直交性の判定」「カーネル法」「重み付き和」とあらゆる場面で同じ操作が現れる、 と認識すると見通しが立ちます。

記号・用語意味と読み方
$\mathbf{a}\cdot\mathbf{b}$内積(dot product)。 結果はスカラー値。 ベクトルの揃い具合
$\langle \mathbf{a}, \mathbf{b} \rangle$内積の別表記。 関数空間や複素ベクトルでよく使われる
$\|\mathbf{a}\|$ / $\|\mathbf{a}\|_2$L2 ノルム。 $\sqrt{\mathbf{a} \cdot \mathbf{a}}$。 ベクトルの長さ
$\theta$ベクトル間のなす角度(0〜π)
$\cos\theta$コサイン類似度。 $\mathbf{a}\cdot\mathbf{b} / (\|\mathbf{a}\|\|\mathbf{b}\|)$、 範囲 [-1, 1]
直交$\mathbf{a}\cdot\mathbf{b}=0$ ⇔ 90°。 線形独立より強い条件
射影$\text{proj}_{\mathbf{a}}\mathbf{b} = \frac{\mathbf{a}\cdot\mathbf{b}}{\|\mathbf{a}\|^2}\mathbf{a}$。 $\mathbf{b}$ の $\mathbf{a}$ 方向成分
$\mathbf{a}^\top \mathbf{b}$行列表記の内積。 $1 \times n$ 行ベクトルと $n \times 1$ 列ベクトルの積
$\mathbf{a}\mathbf{b}^\top$外積(行列)。 $n \times n$ 行列。 内積と混同しがち
Frobenius 内積$\langle A, B \rangle_F = \text{tr}(A^\top B) = \sum_{i,j} A_{ij}B_{ij}$。 行列版内積
Cauchy-Schwarz 不等式$|\mathbf{a}\cdot\mathbf{b}| \le \|\mathbf{a}\|\|\mathbf{b}\|$。 内積の上限保証

🧮 実値で計算してみる

例:$\mathbf{a}=(1,2,3)$、 $\mathbf{b}=(4,5,6)$ → $\mathbf{a}\cdot\mathbf{b} = 1\cdot4 + 2\cdot5 + 3\cdot6 = 4+10+18 = 32$。
$\|\mathbf{a}\| = \sqrt{14}, \|\mathbf{b}\| = \sqrt{77}$ → コサイン類似度 = $32/\sqrt{14\cdot77} \approx 0.975$。

🧮 数式に値を入れて手で計算する: 内積

合成 3 次元ベクトル a, b の内積とコサインを計算する。

Step 1: ベクトル

a = [1, 2, 3] b = [4, 5, 6]

Step 2: 内積

a·b = 1·4 + 2·5 + 3·6 = 4+10+18 = 32

Step 3: ノルムとコサイン

|a| = √14 ≈ 3.742 |b| = √77 ≈ 8.775 cos θ = 32/(3.742·8.775) ≈ 0.975

🐍 Python で再現

1
2
3
4
5
6
7
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
dot = a @ b
cos = dot / (np.linalg.norm(a) * np.linalg.norm(b))
print(f"内積: {dot}")
print(f"cos θ: {cos:.3f}")

📤 実行結果

内積: 32 cos θ: 0.975

💬 手計算 (Step 2,3) と Python 出力が完全一致。

🐍 Python での実装例

まず 3 次元の小さなベクトル a = (1, 2, 3)、b = (4, 5, 6) で、内積・ノルム・コサイン類似度の 3 つを NumPy で計算する(SSDSE-B-2026 の都道府県ベクトルで同じ計算をするコードは下の 🧪 の節にある)。

1
2
3
4
5
6
7
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print('内積:', np.dot(a, b))           # 32
print('ノルムa,b:', np.linalg.norm(a).round(3), np.linalg.norm(b).round(3))
cos = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print('コサイン類似度:', cos.round(3))
📤 実行例(実測) 内積: 32 ノルムa,b: 3.742 8.775 コサイン類似度: 0.975

💬 内積 32 は 1×4+2×5+3×6 の和で、ノルムはそれぞれ √14=3.742 と √77=8.775。32 ÷ (3.742×8.775) で cos が 0.975 になり、成分の大きさは倍以上違っても向きはほぼそろっている。内積 32 という値だけでは「似ている」とは言えず、長さで割って初めて比べられる量になる点を押さえておく。

🎮 触って理解する

内積の幾何的な正体は「$\mathbf{b}$ を $\mathbf{a}$ の方向へ正射影した符号付き長さ × $\|\mathbf{a}\|$」。 つまり $\mathbf{a}\cdot\mathbf{b} = \|\mathbf{a}\|\,(\|\mathbf{b}\|\cos\theta)$ は「長さ × 射影」という 符号付き長方形の面積 として絵に描ける。 下の 2 つのデモを指やマウスで直接動かして、 (1) 射影×長さの面積、 (2) 内積が統計に現れる場面(共分散・相関)を体感しよう。

① 内積 = 射影 × 長さ(符号付き面積)

矢印の先端をドラッグ(タッチ対応)。 青い長方形の面積が $|\mathbf{a}\cdot\mathbf{b}|$、 色が符号。 $\theta$ が 90° を跨ぐ瞬間に符号が反転し、 $|\mathbf{a}|$ や $|\mathbf{b}|$ を伸縮しても向きが同じなら符号は変わらないことを確かめよう。

a = (3.00, 1.00) |a| = 3.16
b = (1.20, 2.60) |b| = 2.86
なす角 θ = —° cos θ = —
b の a 方向への射影 = |b|cos θ = —
a·b = |a| × 射影 = —
(成分計算 a₁b₁+a₂b₂ = — と必ず一致)
θ < 90° → 内積は正

👀 観察ポイント: ① b を回して θ=90° ちょうどにすると面積が消える(直交=内積 0)。 ② そのまま b を少し倒すと色が青→赤に反転(射影の符号反転)。 ③ 「|b| を 1.5 倍」を何度押しても符号は変わらず大きさだけ変わる — 内積の値はスケールに依存し、 符号と cos θ は向きだけで決まる。 これが「類似度比較ではコサインに正規化する」理由。

② 内積が統計に現れる瞬間 — 中心化ベクトルの内積 = 共分散 × n

5 個のデータ点 $(x_i, y_i)$ をドラッグすると、 平均 $(\bar{x}, \bar{y})$ からの偏差の積 $\sum_i (x_i-\bar{x})(y_i-\bar{y})$ — つまり 中心化ベクトル $\mathbf{x}_c$ と $\mathbf{y}_c$(5 次元)の内積 — がリアルタイムに変わる。 各点と平均を結ぶ長方形(青=正の寄与、 赤=負の寄与)の符号付き面積の合計がこの内積。 $n$ で割れば共分散、 両ノルムで割れば相関係数 $r$(= 中心化ベクトルどうしの cos θ)になる。

平均: x̄ = —, ȳ = —
中心化ベクトルの内積
x_c·y_c = Σ(xᵢ−x̄)(yᵢ−ȳ) = —
共分散 = x_c·y_c ÷ n = —
相関 r = cos θ(x_c, y_c) = —
—
※ ここでは母共分散(÷n、n=5)。 pandas の cov() は不偏(÷(n−1))なので値が 5/4 倍違う点に注意。 r はどちらでも同じ。

👀 観察ポイント: 点を右上・左下(平均に対して同じ側)へ動かすと青い面積が増えて r が +1 に近づき、 右下・左上に散らすと赤が増えて r が −1 へ。 相関係数とは「データを 47 次元(都道府県数)や 5 次元のベクトルとみなしたときの、 中心化後のコサイン類似度」そのもの。 「関連手法」節の 総人口×出生数 r≈0.995(SSDSE-B-2026、 2023 年度実測)も、 47 次元の中心化ベクトルがほぼ同じ向きを向いている、 という幾何の話になる。

💡 直感の言語化 — 内積は「どれだけ同じ向きか × どれだけ大きいか」

デモ①で見た通り、 内積は「向きの一致度(cos θ)」と「2 本の長さ」の積に分解できる。 だから内積が大きい理由は 2 通りある — 向きがよく揃っているか、 単にベクトルが長いか。 この 2 つを分離したいときに、 長さで割って向きだけ取り出したものがコサイン類似度、 さらに「平均を引いてから」向きを比べたものが相関係数。 デモ②はまさにその関係 $r = \dfrac{\mathbf{x}_c \cdot \mathbf{y}_c}{\|\mathbf{x}_c\|\,\|\mathbf{y}_c\|}$ を動かして見せている。

⚠️ 触って分かる落とし穴(深掘り)

🚀 発展 — 内積が主役になる 3 つの場面

ベクトル・射影そのものの操作練習は ベクトル演算 のインタラクティブ、 長さの定義は ノルム、 直交基底への展開は 主成分分析 を参照。

⚠️ よくある落とし穴

❌ スケールの影響
内積はベクトルの長さに比例するので、 出現回数の多い文書や人口の大きい都道府県ほど値が大きくなる。 「似ている度合い」を比べたいのに「量の大きさ」を測ってしまう典型的な取り違え。 比較が目的ならノルムで割ったコサイン類似度を使う。
❌ 負の値の解釈
内積が負なら 2 つのベクトルは 90 度より開いており、 「無関係」ではなく「逆向き」を意味する。 推薦システムの埋め込みなら「関心が薄い」ではなく「反対の嗜好」と読むべき場面がある。 0 付近(直交=無関係)と負(逆向き)を混同しないこと。
❌ 高次元の呪い
次元が上がると、 独立に生成した 2 本のベクトルのコサインはほぼ 0 に集中する。 数百次元の埋め込みでは「cos=0.1 でも十分似ている」ことがあり、 低次元の感覚で閾値を決めると全部「似ていない」になる。 閾値は必ずそのデータの分布を見て決める。
❌ 零ベクトル
全要素が 0 のベクトルはノルムが 0 なので、 コサイン類似度の分母が 0 になり NaN や ZeroDivisionError を招く。 TF-IDF で語がすべて未知語だった文書、 全項目が欠損の行などで実際に起きる。 計算前にノルム 0 の行を除くか、 分母に微小値を足す。

🗺 概念マップ

関連概念を視覚的に整理した概念マップ。

inner product ベクトル空間 コサイン類似度 射影 / 直交性 行列積 (X^T X) np.dot / @ 演算子 Σ aᵢ bᵢ

内積 a·b = Σ aᵢ bᵢ は、 2 つのベクトルの「類似性」と「投影量」を 1 つの数値に集約する基本演算。 上図中心の「内積」から、 ベクトル空間理論 ・ 公的統計 (SSDSE データ) の活用 ・ 実務応用 (コサイン類似度 / 線形回帰の係数) ・ 拡張概念 (外積・テンソル積) の軸が放射する。 機械学習のほぼすべての線形演算は内積で書ける。

🔗 隣接手法への橋渡し

内積は単独の計算ではなく、 線形代数のあらゆる演算 (行列積・直交性判定・射影・類似度) の構成要素として現れる。

内積が 0 → 直交 (相関無し)、 内積が正で大 → 同方向 (強い類似)、 内積が負 → 反対方向 (負の相関)。 このシンプルな解釈が機械学習・統計の基礎を支える。

🌳 手法選択フロー

内積を使う場面と、 関連演算の選び分けを 3 段階で判定する。

  1. 2 ベクトルの類似度を測りたいか? Yes → 長さで正規化したコサイン類似度 = a·b / (|a||b|) を使う、 No (絶対量を残したい) → 純粋な内積
  2. 多変数の線形結合を計算したいか? Yes → 行列ベクトル積 Xβ (= 各行 xᵢ と係数 β の内積) を X @ beta で計算、 効率化なら numpy.dot / scipy.sparse の疎行列演算
  3. 直交性を確認したいか? a·b = 0 を厳密判定するときは浮動小数誤差を考慮 (絶対値 < 1e-10 で 0 とみなす)、 統計検定なら相関係数 r = 0 の検定 (t = r√(n-2)/√(1-r²)) を使う

内積は計算コスト O(n) と軽量だが、 高次元 (n > 10000) では SIMD / BLAS 呼び出しで桁違いに高速化される。 numpy / pytorch / tensorflow はすべて内部で BLAS を呼ぶ。

🔎 深掘り追補:直感・落とし穴・発展を SSDSE 実データで

ここまでの各節を、 SSDSE-B-2026(cp932・2 行目のコード行をスキップ・2023 年度・47 都道府県)の実測値で裏取りしながら、 「直感 → 落とし穴 → 発展」の順に凝縮する。 使う県ベクトルは 4 指標 [総人口 A1101, 15歳未満人口 A1301, 65歳以上人口 A1303, 出生数 A4101] とする。 実際の値(2023 年度実測)は次の通り。

総人口 15歳未満 65歳以上 出生数 東京都 14086000 1513000 3205000 86348 神奈川県 9229000 1031000 2390000 53991 鳥取県 537000 65000 179000 3263 島根県 650000 77000 227000 3759

🎨 直感:成分の積和 = |a||b|cosθ = 射影 × 長さ

内積 $\mathbf{a}\cdot\mathbf{b}=\sum_i a_i b_i$ は「対応成分を掛けて足すだけ」。 その値が同時に $\|\mathbf{a}\|\|\mathbf{b}\|\cos\theta$ に等しいので、 2 本のベクトルがどれだけ同じ方向を向いているか(=揃い具合)に長さを掛けたものと読める。 $\mathbf{b}$ を $\mathbf{a}$ 方向へ正射影した符号付き長さ $\|\mathbf{b}\|\cos\theta$ に $\|\mathbf{a}\|$ を掛けた面積、 と言い換えてもよい。 だから内積が測るのは「射影の長さ/類似度/なす角」であり、 直交(90°)なら内積は 0、 鋭角なら正、 鈍角なら負になる。 上の 4 県ベクトルなら、 鳥取県と島根県は「小規模・同構成」で同じ向き、 東京都はまるで長さの違う別方向のベクトル、 という幾何が数値に現れる(下記)。

⚠️ 落とし穴①:標準化前の内積は「一番大きい列」に支配される(実測)

生の内積は単位・桁の大きい成分がほぼ全部を決める。 東京都×神奈川県の生の内積 $1.392\times10^{14}$ を成分ごとに分解すると:

成分積 $a_i b_i$寄与率
総人口$1.300\times10^{14}$93.37%
65歳以上人口$7.660\times10^{12}$5.50%
15歳未満人口$1.560\times10^{12}$1.12%
出生数$4.662\times10^{9}$0.00%

総人口だけで 93% を占め、 出生数は桁が小さすぎて実質ゼロ寄与。 生の内積は「出生数の似方」をまったく見ていない。 さらに危険なのは大小関係の逆転で、 生の内積は 東京都×鳥取県 $=8.24\times10^{12}$ が 鳥取県×島根県 $=3.95\times10^{11}$ の 20 倍もある。 これを見て「東京と鳥取は、 鳥取と島根より似ている」と読むのは完全な誤り — 単に東京の長さ(規模)が大きいだけ。 列ごとに標準化(zスコア化)してから内積・コサインを取ると幾何が正しく出る。

県ペア生の内積標準化後の内積標準化後 cosθ読み
東京都 × 神奈川県$1.39\times10^{14}$36.950.997同方向(大都市)
東京都 × 鳥取県$8.24\times10^{12}$−12.22−0.992逆方向(規模が真逆)
鳥取県 × 島根県$3.95\times10^{11}$2.291.000ほぼ完全一致

標準化後は直感通り:東京都と神奈川県はほぼ同方向(0.997)、 鳥取県と島根県は事実上同一方向(1.000)、 東京都と鳥取県は正反対(−0.992)。 生の内積の「20 倍」は完全な錯覚だった。 これが「類似度を測るなら標準化 → コサイン化が前提」の実データ証拠。 標準化は各列を平均 0・標準偏差 1 に揃える(標準化)操作で、 これをせずに内積・距離を取ると単位の大きい列(円 vs 千円など)だけで結論が決まってしまう。

⚠️ 落とし穴②:混同しやすい 4 つ

🚀 発展:内積を「包む」と統計の主要量が全部出る

※ 本節の数値はすべて SSDSE-B-2026(2023 年度・47 都道府県)の実測から算出。 合成例(架空のベクトル)は用いていない。 再現するには pd.read_csv(..., encoding='cp932', skiprows=[1]) で読み、 年度列 SSDSE-B-2026==2023 で絞り、 上記 4 列を列ごとに z 標準化してから内積・コサインを取ればよい。