Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Misschien wel de belangrijkste operatie in machine learning is het dot of inner product tussen 2 vectoren uit dezelfde ruimte (dus met een gelijk aantal elementen). De eerste vector is daarbij een rij-vector aT\pmb{a}^T en de tweede een kolom-vector b\pmb{b}.

aTb=ab=a.b=i=1naibi=[a1a2an][b1b2bn]=a1b1+a2b2++anbn\begin{aligned} \pmb{a}^T\pmb{b} = \pmb{a}'\pmb{b} &= \pmb{a}.\pmb{b} \\ &= \sum_{i=1}^{n}a_ib_i \\ &= \begin{bmatrix} a_1 & a_2 \ldots & a_n \end{bmatrix}\begin{bmatrix} b_1 \cr b_2 \cr \vdots \cr b_n \end{bmatrix} \\ &= a_1b_1 + a_2b_2 + \ldots + a_nb_n \end{aligned}

Het dot product tussen 2 vectoren uit een gegeven ruimte, is dus de som van de elementgewijze producten. Het resultaat is altijd een scalaire waarde.

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(f"Dot product result: {np.dot(a, b)}")
Dot product result: 32
a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
np.int64(32)
# alternative notation for np.dot
a @ b
np.int64(32)

Merk op dat:

aTb=bTa\pmb{a}^T\pmb{b} = \pmb{b}^T\pmb{a}

Het principe van het dot product kan uitgebreid worden naar het geval een matrix en een vector uit dezelfde ruimte: Ab\pmb{A}\pmb{b}. Geometrisch moet de matrix A\pmb{A} hier gezien worden als een verzameling van punten in dezelfde ruimte als waar b\pmb{b} uit afkomstig is. A\pmb{A} heeft dus evenveel kolommen als er elementen in b\pmb{b} zijn.

Ab=[i=1nA1,ibii=1nA2,ibii=1nAm,ibi]=[A1,1A1,2A1,nA2,1A2,2A2,nAm,1Am,2Am,n][b1b2bn]=[A1,1b1+A1,2b2++A1,nbnA2,1b1+A2,2b2++A2,nbnAm,1b1+Am,2b2++Am,nbn]\begin{aligned} \pmb{A}\pmb{b} &= \begin{bmatrix} \sum_{i=1}^{n}A_{1,i}b_i \cr \sum_{i=1}^{n}A_{2,i}b_i \cr \vdots \cr \sum_{i=1}^{n}A_{m,i}b_i \end{bmatrix} \\ &= \begin{bmatrix} A_{1,1} & A_{1,2} & \ldots & A_{1,n} \cr A_{2,1} & A_{2,2} & \ldots & A_{2,n} \cr \vdots & \vdots & \ldots & \vdots \cr A_{m,1} & A_{m,2} & \ldots & A_{m,n} \end{bmatrix}\begin{bmatrix} b_1 \cr b_2 \cr \vdots \cr b_n \end{bmatrix} \\ &= \begin{bmatrix} A_{1,1}b_1 + A_{1,2}b_2 + \ldots + A_{1,n}b_n \cr A_{2,1}b_1 + A_{2,2}b_2 + \ldots + A_{2,n}b_n \cr \vdots \cr A_{m,1}b_1 + A_{m,2}b_2 + \ldots + A_{m,n}b_n \end{bmatrix} \end{aligned}

Bij het dot product tussen een matrix en een vector, is resultaat altijd een vector met evenveel elementen als er rijen zijn in de matrix.

A = np.array([[1, 2, 3], [4, 5, 6]])
print(f"Matrix A shape: {A.shape}")
nrow, ncol = A.shape
print(f"Matrix A has {nrow} rows and {ncol} columns.")
print(f"Dot product result:\n{np.dot(A, b)}")
Matrix A shape: (2, 3)
Matrix A has 2 rows and 3 columns.
Dot product result:
[32 77]
np.array(
    [
        A[0, 0] * b[0] + A[0, 1] * b[1] + A[0, 2] * b[2],
        A[1, 0] * b[0] + A[1, 1] * b[1] + A[1, 2] * b[2],
    ]
)
array([32, 77])
# alternative notation for np.dot
A @ b
array([32, 77])

Tenslotte bespreken we ook nog het geval van de uitbreiding naar 2 matrices; het inner product ABT\pmb{A}\pmb{B}^T. Geometrisch kunnen we beide matrices zien als verzamelingen van punten in dezelfde nn-dimensionele ruimte. Ze hebben hetzelfde aantal kolommen, maar niet per se hetzelfde aantal rijen. Meestal wordt B\pmb{B} direct gezien als een matrix met nn rijen en een bepaald aantal kolommen pp. Dan wordt de notatie simpelweg AB\pmb{A}\pmb{B}.

AB=[A1,1A1,2A1,nA2,1A2,2A2,nAm,1Am,2Am,n][B1,1B1,2B1,pB2,1B2,2B2,pBn,1Bn,2Bn,p]=[A1,1B1,1+A1,2B2,1++A1,nBn,1A1,1B1,2+A1,2B2,2++A1,nBn,2A1,1B1,p+A1,2B2,p++A1,nBn,pA2,1B1,1+A2,2B2,1++A2,nBn,1A2,1B1,2+A2,2B2,2++A2,nBn,2A2,1B1,p+A2,2B2,p++A2,nBn,pAm,1B1,1+Am,2B2,1++Am,nBn,1Am,1B1,2+Am,2B2,2++Am,nBn,2Am,1B1,p+Am,2B2,p++Am,nBn,p]\begin{aligned} \pmb{A}\pmb{B} &= \begin{bmatrix} A_{1,1} & A_{1,2} & \ldots & A_{1,n} \cr A_{2,1} & A_{2,2} & \ldots & A_{2,n} \cr \vdots & \vdots & \ldots & \vdots \cr A_{m,1} & A_{m,2} & \ldots & A_{m,n} \end{bmatrix}\begin{bmatrix} B_{1,1} & B_{1,2} \ldots & B_{1,p} \cr B_{2,1} & B_{2,2} \ldots & B_{2,p} \cr \vdots & \vdots \ldots & \vdots \cr B_{n,1} & B_{n,2} \ldots & B_{n,p} \end{bmatrix} \\ &= \begin{bmatrix} A_{1,1}B_{1,1} + A_{1,2}B_{2,1} + \ldots + A_{1,n}B_{n,1} & A_{1,1}B_{1,2} + A_{1,2}B_{2,2} + \ldots + A_{1,n}B_{n,2} & \ldots & A_{1,1}B_{1,p} + A_{1,2}B_{2,p} + \ldots + A_{1,n}B_{n,p} \cr A_{2,1}B_{1,1} + A_{2,2}B_{2,1} + \ldots + A_{2,n}B_{n,1} & A_{2,1}B_{1,2} + A_{2,2}B_{2,2} + \ldots + A_{2,n}B_{n,2} & \ldots & A_{2,1}B_{1,p} + A_{2,2}B_{2,p} + \ldots + A_{2,n}B_{n,p} \cr \vdots & \vdots & \vdots & \vdots \cr A_{m,1}B_{1,1} + A_{m,2}B_{2,1} + \ldots + A_{m,n}B_{n,1} & A_{m,1}B_{1,2} + A_{m,2}B_{2,2} + \ldots + A_{m,n}B_{n,2} & \ldots & A_{m,1}B_{1,p} + A_{m,2}B_{2,p} + \ldots + A_{m,n}B_{n,p} \end{bmatrix} \end{aligned}

Bij het dot product van 2 matrices A\pmb{A} en B\pmb{B}, is resultaat altijd een matrix met evenveel rijen als er rijen zijn in A\pmb{A} en evenveel kolommen als er kolommen zijn in B\pmb{B}.

B = np.array([[7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]])
print(f"Matrix B shape: {B.shape}")
print(f"Dot product result:\n{np.dot(A, B)}")  # Result is 2x4 matrix
Matrix B shape: (3, 4)
Dot product result:
[[ 74  80  86  92]
 [173 188 203 218]]
np.array(
    [
        [
            A[0, 0] * B[0, 0] + A[0, 1] * B[1, 0] + A[0, 2] * B[2, 0],
            A[0, 0] * B[0, 1] + A[0, 1] * B[1, 1] + A[0, 2] * B[2, 1],
            A[0, 0] * B[0, 2] + A[0, 1] * B[1, 2] + A[0, 2] * B[2, 2],
            A[0, 0] * B[0, 3] + A[0, 1] * B[1, 3] + A[0, 2] * B[2, 3],
        ],
        [
            A[1, 0] * B[0, 0] + A[1, 1] * B[1, 0] + A[1, 2] * B[2, 0],
            A[1, 0] * B[0, 1] + A[1, 1] * B[1, 1] + A[1, 2] * B[2, 1],
            A[1, 0] * B[0, 2] + A[1, 1] * B[1, 2] + A[1, 2] * B[2, 2],
            A[1, 0] * B[0, 3] + A[1, 1] * B[1, 3] + A[1, 2] * B[2, 3],
        ],
    ]
)
array([[ 74, 80, 86, 92], [173, 188, 203, 218]])
# alternative notation for np.dot
A @ B
array([[ 74, 80, 86, 92], [173, 188, 203, 218]])

Toepassingen

Lineaire gewichten

Zowel bij lineaire regressie als bij simpele neurale netwerken zoals perceptrons Rosenblatt (1958), worden input features vertaald naar model outputs door gewogen sommen te nemen. Deze operatie komt neer op het dot product tussen de input vector x\pmb{x} en een vector van gewichten w\pmb{w}: wTx\pmb{w}^T\pmb{x}.

Gewogen gemiddeldes

Ieder arithmetisch gemiddelde van een reeks datapunten van een bepaald type, kan uitgedrukt worden aan de hand van een dot product tussen een vector van gewichten en de data-vector y.w\pmb{y}.\pmb{w}, waarbij de som van de elementen van w\pmb{w} exact 1 is.

Voor het algemene on-/gewogen gemiddelde krijgen we:

yTw=i=1nyiwi=[y1y2yn][w1w2wn]=y1w1+y2w2++ynwnw1+w2++wn=1\begin{aligned} \pmb{y}^T\pmb{w} = \sum_{i=1}^{n}y_iw_i = \begin{bmatrix} y_1 & y_2 \ldots & y_n \end{bmatrix}\begin{bmatrix} w_1 \cr w_2 \cr \vdots \cr w_n \end{bmatrix} &= y_1w_1 + y_2w_2 + \ldots + y_nw_n \\ w_1+w_2+\ldots+w_n &= 1 \end{aligned}

Voor een ongewogen gemiddelde krijgen we dan:

yTw=i=1nyi1n=[y1y2yn][1n1n1n]=y1n+y2n++ynn\pmb{y}^T\pmb{w} = \sum_{i=1}^{n}y_i\frac{1}{n} = \begin{bmatrix} y_1 & y_2 \ldots & y_n \end{bmatrix}\begin{bmatrix} \frac{1}{n} \cr \frac{1}{n} \cr \vdots \cr \frac{1}{n} \end{bmatrix} = \frac{y_1}{n} + \frac{y_2}{n} + \ldots + \frac{y_n}{n}

Euclidische norm

Vectoren hebben een grootte en een richting, zoals bijvoorbeeld de versnelling van een object in de ruimte a=[axayaz]T\pmb{a} = [a_x a_y a_z]^T. Vaak willen we de grootte uitdrukken in een scalaire waarde. Dat doen we aan de hand van een norm-functie LpL^p die gedefiniëerd is als:

xp=(ixip)1p||\pmb{x}||_p = \begin{pmatrix}\sum_{i}|x_i|^p\end{pmatrix}^{\frac{1}{p}}

De norm van een vector in een bepaalde ruimte drukt de afstand uit tussen de oorsprong en het punt waar de vector betrekking op heeft.

In een Euclidische ruimte wordt die afstand gegeven door de L2L^2 norm. De L2L^2 norm van een vector bekomt men door het dot product te nemen van de vector met zichzelf, gevolgd door een vierkantswortel:

x2=ixi2=ixixi=xTx\begin{align} ||\pmb{x}||_2 &= \sqrt{\sum_{i}x_i^2} \\ &= \sqrt{\sum_{i}x_ix_i} \\ &= \sqrt{\pmb{x}^T\pmb{x}} \end{align}

Cosine similarity

Vaak willen we ook de afstand tussen 2 vectoren uitdrukken in een scalaire waarde, bijvoobeeld in de context van similarity search. In Euclidische ruimtes wordt dan vaak gekeken naar de cosinus van de hoek tussen 2 vectoren cos(θ)cos({\theta}). Dit heet dan de cosine similarity en wordt bekomen door het dot product te nemen en het te delen door de respectievelijke Euclidische normen:

cos(θ)=aTba2b2cos(\theta) = \frac{\pmb{a}^T\pmb{b}}{||\pmb{a}||_2||\pmb{b}||_2}

Om dit te begrijpen hebben we de geometrische interpretatie van het dot-product nodig.
De scalaire projectie van vector a\pmb{a} op b\pmb{b} in de Euclidische ruimte is gegeven als:

ab=acos(θ)a_b = ||\pmb{a}||cos(\theta)

waarbij θ\theta de hoek is tussen beide vectoren. We kunnen deze geometrische definitie herschrijven als

ab=aTb^a_b = \pmb{a}^T\hat{\pmb{b}}

met b^\hat{\pmb{b}} de unit vector (dwz. vector met lengte 1) in de richting van b\pmb{b}:

b^=bb\hat{\pmb{b}} = \frac{\pmb{b}}{||\pmb{b}||}

Als we definities (10) en (11) aan elkaar gelijk stellen krijgen we:

aTbb=acos(θ)aTb=abcos(θ)\begin{align} \pmb{a}^T\frac{\pmb{b}}{||\pmb{b}||} &= ||\pmb{a}||cos(\theta) \cr \pmb{a}^T\pmb{b} &= ||\pmb{a}||||\pmb{b}||cos(\theta) \end{align}

Het dot product van a\pmb{a} en b\pmb{b} is dus het product van (i) de grootte van de scalare projectie van a\pmb{a} op b\pmb{b} en (ii) de grootte van b\pmb{b}. De uitkomst zal groter worden naargelang:

  • a\pmb{a} groter is

  • b\pmb{b} groter is

  • θ\theta kleiner is

Als we terugkomen op de cosine similarity kunnen we direct zien waar de formulering vandaan komt:

aTb=abcos(θ)cos(θ)=aTbab\begin{align} \pmb{a}^T\pmb{b} &= ||\pmb{a}||||\pmb{b}||cos(\theta) \cr cos(\theta) &= \frac{\pmb{a}^T\pmb{b}}{||\pmb{a}||||\pmb{b}||} \end{align}
References
  1. Rosenblatt, F. (1958). The perceptron: A probabilistic model for information storage and organization in the brain. Psychological Review, 65(6), 386–408. 10.1037/h0042519
  2. McCulloch, W. S., & Pitts, W. (1943). A logical calculus of the ideas immanent in nervous activity. The Bulletin of Mathematical Biophysics, 5(4), 115–133. 10.1007/bf02478259