10.1 Vektor, skalárszorzat, norma és távolság

10.1.1 Cél és konkrét helyzet

A Northstar orders.csv táblájában minden rendeléshez több, a rendelés pillanatában ismert numerikus jellemző tartozik: distance_km (km), priority_flag (0/1 jelző), basket_minor (EUR-cent) és quantity_sum (darab). Amikor később hasonlósági modellt, legközelebbi szomszéd keresést vagy klaszterezést építünk, egy kérdés mindig előkerül: mennyire „van közel” két rendelés a feature-térben?

A feladat most kifejezetten ez: adott két rendelés,

és azt vizsgáljuk, mekkora a köztük lévő távolság, illetve hogy az egyes koordináták mennyire járulnak hozzá. Az output nem egyetlen szám lesz, hanem egy távolság és egy hozzájárulás-elemzés. A megfigyelési egység a rendelés, a négy koordináta a megfigyelt numerikus jellemző. Az induló becslésem: a nyers euklideszi távolságot szinte teljesen a basket_minor uralja, mert a kosáreltérés 1050010500, míg a többi koordináta eltérése legfeljebb 100100. Ezt a sejtést a szakasz végén invariánssal ellenőrizzük: a kosárkoordináta négyzetes hozzájárulása várhatóan 99%99\% fölött lesz.

10.1.2 Vektor és feature-tér

A vektor (vector) adattudományi jelentése: egy megfigyelés numerikus jellemzőinek rendezett listája. A pp koordinátájú vektort

x=(x1,x2,…,xp)x=(x_1,x_2,\dots,x_p)

alakban írom. A xix_i értelmezési tartománya a feature-től függ; a distance_km például nemnegatív valós szám km-ben, a priority_flag viszont csak 00 vagy 11. A NumPy-ban ugyanezt np.array adja, (p,) shape-szel, általában float64 dtype-tal. A matematikai jelölés 11-től indexel, a NumPy 00-tól: a képletben szereplő xix_i a kódban x[i-1].

A feature-tér (feature space) az összes lehetséges koordináta-kombináció halmaza, itt ℝ4\mathbb{R}^4. Minden rendelés egy pont ebben a térben. A gondot a mértékegység okozza: a tengelyek nem összehasonlítható skálájúak. A pontok geometriai távolsága ezért nem magától értetődő, hanem egy döntés következménye; a későbbi modellekben is ugyanez a választás tér vissza.

10.1.3 Pitagorasz újratanítva

Két koordinátán a vektor hosszát a Pitagorasz-tétel adja. Az x=(3,4)x=(3,4) vektor esetén a hossz

32+42=25=5.\sqrt{3^2+4^2}=\sqrt{25}=5.

A vektor a síkon a (0,0)(0,0) pontból a (3,4)(3,4) pontba mutató irányított szakasz; a hossza az átfogó, a derékszögű befogók hossza 33 és 44.

Pitagorasz: a (3,4) vektor hossza - Számított koordináta-példa, nem mérés.

A két befogó a koordinátatengelyekkel párhuzamos, ezért a négyzetösszeg pontosan a két oldalnégyzet összege. A pp dimenziós általánosítás ugyanez koordinátánként: minden xix_i egy derékszögű összetevő.

10.1.4 Skaláris szorzat (dot product)

A skaláris szorzat (dot product) két azonos hosszúságú vektorból készít skalárt:

x⋅y=∑i=1pxiyi.x\cdot y=\sum_{i=1}^p x_i y_i.

A jelölések: xx és yy egyaránt (p,)(p,) shape-ű vektor; a kimenet egyetlen skalár. A mértékegység vegyes lehet: ha a koordináták eltérő mennyiségek, akkor a szorzatok dimenziója sem egységes, tehát a kapott skalár nem hordoz közvetlen fizikai jelentést. Ezt a figyelmeztetést a távolságnál is meg kell ismételni.

Kézi kontroll: x=(1,2,3)x=(1,2,3), y=(4,5,6)y=(4,5,6) esetén

x⋅y=1⋅4+2⋅5+3⋅6=4+10+18=32.x\cdot y=1\cdot 4+2\cdot 5+3\cdot 6=4+10+18=32.

A művelet két alapvető tulajdonsága: szimmetrikus, azaz x⋅y=y⋅xx\cdot y=y\cdot x, és mindkét változójában lineáris. A NumPy-beli megfelelője np.dot(x, y).

10.1.5 Euklideszi norma és távolság

Az euklideszi norma (Euclidean norm) a vektor hossza az origótól:

∥x∥2=∑i=1pxi2.\|x\|_2=\sqrt{\sum_{i=1}^p x_i^2}.

A 22-es index a „négyzetes” definícióra utal; a NumPy np.linalg.norm(x) hívása alapértelmezésben ugyanezt számolja. A norma tulajdonságai: nemnegatív, csak a nullvektorra 00, és pozitív skalárral szorozva a hossz ugyanazzal a skalárral szorzódik. A távolság két pont között a különbségvektor normája:

d(x,y)=∥x−y∥2=∑i=1p(xi−yi)2.d(x,y)=\|x-y\|_2=\sqrt{\sum_{i=1}^p (x_i-y_i)^2}.

A fenti kis példában x−y=(−3,−3,−3)x-y=(-3,-3,-3), ezért

d(x,y)=9+9+9=18≈4.243.d(x,y)=\sqrt{9+9+9}=\sqrt{18}\approx 4.243.

Ha a koordináták mértékegysége eltérő, a négyzetösszeg tagjai eltérő mértékegységűek: km2\mathrm{km}^2, dimenziótlan, EUR-cent2\mathrm{EUR\text{-}cent}^2 és db2\mathrm{db}^2 kerülne egymás mellé. A matematikai számolás mindig elvégezhető, de a kapott értéket „távolságnak” nevezni csak akkor van értelme, ha a koordinátákat előzőleg közös, dimenziótlan skálára hozzuk.

10.1.6 Koszinusz-hasonlóság

A koszinusz-hasonlóság (cosine similarity) a skaláris szorzatot a hosszak szorzatával normálja:

cosθ=x⋅y∥x∥2∥y∥2.\cos\theta=\frac{x\cdot y}{\|x\|_2\|y\|_2}.

A kimenet dimenziótlan, és a [−1,1][-1,1] tartományba esik, ha egyik vektor sem nullvektor. Az érték 11, ha a két vektor azonos irányú, 00, ha merőleges, −1-1, ha ellentétes irányú. Ez nem távolság, hanem irány szerinti hasonlóság: a (3,4)(3,4) és a (6,8)(6,8) vektor koszinusza 11, pedig a hosszuk eltér. A példabeli xx és yy esetén

321477=321078≈0.9746.\frac{32}{\sqrt{14}\sqrt{77}}=\frac{32}{\sqrt{1078}}\approx 0.9746.

A hasonlóság magas; a két háromkoordinátás vektor iránya közel van, hosszaik közötti különbség viszont a koszinuszban nem jelenik meg.

10.1.7 Skálázás: mit csinál a koordinátákkal?

A standardizálás (standardization) minden koordinátát ugyanazzal a transzformációval dimenziótlanít. Ha a feature elvárt értéke μi\mu_i, szórása σi>0\sigma_i>0, akkor

zi=xi−μiσi.z_i=\frac{x_i-\mu_i}{\sigma_i}.

A zz vektor minden koordinátája dimenziótlan; a σi\sigma_i mértékegysége megegyezik xix_i mértékegységével, így a hányadosnak már nincs mértékegysége. A linearitás miatt a standardizált érték nem változik, ha az adott coordinatat pozitív skalárral átskálázzuk: a μi\mu_i és σi\sigma_i ugyanazzal a skalárral szorzódik, a hányados pedig ugyanaz marad. Ez a későbbiekben fontos ellenőrző eszköz: ha egy távolságalapú modell válasza megváltozik pusztán attól, hogy kilométer helyett méterben adjuk meg a távolságot, akkor a modell nem standardizált.

A skálázás azonban nem semleges, ahogy a Stabil numerika és érzékenység alfejezetben láttuk: egy másik skála más távolságot és más modelljelentést ad. A skálázási statisztikákat is csak abból az adatrészből szabad becsülni, amelyből a modell tanul, nem a teljes adatból; ez a későbbi szivárgásmentes pipeline egyik központi szabálya lesz.

10.1.8 Teljes minimális munkapélda

Az alábbi kód a két Northstar-példarendelés vektorából számol nyers távolságot, majd egy megadott referencia-statisztikával standardizál. A statisztikák itt szemléltető értékek, nem a mellékelt orders.csv futtatási eredményei.

import numpy as np

order_a = np.array([20.0, 0.0, 4500.0, 3.0])   # distance_km, priority_flag, basket_minor, quantity_sum
order_b = np.array([120.0, 1.0, 15000.0, 6.0])

diff = order_a - order_b
raw_distance = np.linalg.norm(diff)
print("nyers távolság:", raw_distance)  # szemléltető várt érték: kb. 10500.48

# Referencia-statisztikák a teljes tanító adatból számolandók; itt szemléltető értékek.
mu = np.array([80.0, 0.5, 12000.0, 4.0])
sigma = np.array([40.0, 0.5, 6000.0, 2.0])

z_a = (order_a - mu) / sigma
z_b = (order_b - mu) / sigma
scaled_distance = np.linalg.norm(z_a - z_b)
print("standardizált távolság:", scaled_distance)  # szemléltető várt érték: kb. 3.9449

contrib_raw = (diff ** 2) / (raw_distance ** 2)
contrib_scaled = ((z_a - z_b) ** 2) / (scaled_distance ** 2)
print("nyers négyzetes hozzájárulás:", contrib_raw)
print("standardizált hozzájárulás:", contrib_scaled)

A könyv készítésekor a kódot nem futtattam; a megadott értékek kézi ellenőrzésből származó elméletileg várt kimenetek. A saját lab/orders.csv betöltéséhez a teljes projektfüggő utat kell használni, például:

import pandas as pd
orders = pd.read_csv("orders.csv", parse_dates=["order_ts"])
print(orders[["distance_km", "priority_flag", "basket_minor", "quantity_sum"]].head(2))

Ha a laborfájl a telepítés helyén más mappában van, a lab/ relatív útvonalat kell használni; a pontos utat a Kérdés, célváltozó és döntési helyzet alfejezetben rögzített projektgyökérhez viszonyítva érdemes kezelni.

10.1.9 Eredmény értelmezése

A nyers A–B távolságot a basket_minor eltérése uralja: a különbség −10500-10500, a négyzete 110250000110250000, ami a 110260010110260010 teljes négyzetösszeg 99,99%99{,}99\%-a. A távolság közel 10500.4810500.48, tehát a többi jellemző gyakorlatilag láthatatlan. Ez a távolságazon alapuló modell torzítását okozná: a kosárérték határozná meg, hogy mely rendelések számítanak hasonlónak.

A standardizálás után a koordináták dimenziótlanok és összehasonlíthatók. A z-vektorok:

zA=(−1,5,−1,−1,25,−0,5),zB=(1,1,0,5,1).z_A=(-1{,}5,\ -1,\ -1{,}25,\ -0{,}5),\qquad z_B=(1,\ 1,\ 0{,}5,\ 1).

A különbség négyzetösszege 6,25+4+3,0625+2,25=15,56256{,}25+4+3{,}0625+2{,}25=15{,}5625, a távolság kerekítve 3,94493{,}9449. A négyzetes hozzájárulások most nagyjából 40%40\%, 26%26\%, 20%20\% és 14%14\%. A kép már nem egyetlen feature-ről szól; a kosárérték fontos marad, de nem egyedüli döntő. Az ellenőrzést akkor tekinthetjük helyesnek, ha a hozzájárulások összege 11, és a saját kézi Pitagorasz-összegünk a NumPy-eredménnyel 10−1210^{-12} relatív tűrésen belül egyezik; a shape mindkét távolságnál skalár, a dtype np.float64.

10.1.10 Feladatok

1. Értelmezés. Vezesd le a p=1p=1 esetet. Mi a np.linalg.norm(x) eredménye, ha x = np.array([-5.0])? Mi lesz a két 11 koordinátás vektor, a=(−5)a=(-5) és b=(3)b=(3) távolsága? Fogalmazd meg, mit jelent itt a standardizálás z-értéke.

2. Implementálás. Saját Python-függvénnyel, numpy.dot és numpy.linalg.norm használata nélkül, csak beépített sum-mal és math.sqrt-tal írd meg a dot(a,b), norm(a) és cosine(a,b) függvényeket. Ellenőrizd az a=(1,2,3)a=(1,2,3), b=(4,5,6)b=(4,5,6) példából ismert eredményeket 10−1210^{-12} tűréssel.

3. Hibakeresés. Az alábbi koszinusz-számítás miért hibás, ha x és y nem merőlegesek?

cosine = np.dot(x, y) / np.linalg.norm(x) * np.linalg.norm(y)

Javítsd ki, és állítsd elő azt az x–y párt is, ahol a hibás képlet véletlenül mégis helyes eredményt ad.

4. Megváltozott feltétel. Ugyanaz a két rendelés, de a distance_km értékét méterre váltjuk: A távolsága 2000020000 m, B-é 120000120000 m lesz; a többi koordináta változatlan. Számold ki a nyers távolságot az új vektorokkal, majd számold ki a standardizált távolságot a megfelelő méterre átváltott μ=80000\mu=80000 m és σ=40000\sigma=40000 m statisztikákkal. Milyen következtetést von le ez a skálainvarianciáról?

10.1.11 Megoldások és indoklás

1. p=1p=1 esetén a vektor egyetlen szám. A norma képlete x12=|x1|\sqrt{x_1^2}=|x_1|, tehát np.linalg.norm(np.array([-5.0])) eredménye 5.05.0. A távolság |(−5)−3|=8|(-5)-3|=8. Ha az egyetlen feature elvárt értéke μ\mu és szórása σ\sigma, akkor z=(x−μ)/σz=(x-\mu)/\sigma egy dimenziótlan normalizált koordináta: azt mondja meg, hány szórással van xx a középérték felett vagy alatt.

2.

import math

def dot(a, b):
    return sum(ai * bi for ai, bi in zip(a, b))

def norm(a):
    return math.sqrt(sum(ai * ai for ai in a))

def cosine(a, b):
    return dot(a, b) / (norm(a) * norm(b))

a = [1, 2, 3]
b = [4, 5, 6]
print(dot(a, b), norm(a), cosine(a, b))  # szemléltető: 32, 3.7416..., 0.9746...

Az invariant az ismert kézi értékekkel való egyezés: dot 3232, norm 14\sqrt{14}, a koszinusz 32/107832/\sqrt{1078}. Ha a hányadost abs(ertek - elvart) < 1e-12 szűrésű tesztben használjuk, a függvények helyesen működnek.

3. A Python kiértékelési sorrendje miatt a képlet valójában

x⋅y∥x∥2⋅∥y∥2\frac{x\cdot y}{\|x\|_2}\cdot\|y\|_2

lesz, tehát a második normával szoroz, nem oszt. A helyes alak:

cosine = np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y))

A hibás képlet akkor adhat véletlenül jó értéket, ha ∥y∥22=1\|y\|_2^2=1, mert akkor a szorzás és az osztás eredménye ugyanaz a hányados marad. Például y=(1,0)y=(1,0) és x=(2,0)x=(2,0) esetén a helyes koszinusz 11, a hibás kifejezés is 2/(2)⋅1=12/(2)\cdot 1=1. Ez az egybeesés inverz irányban is mutatja, miért nem elég egyetlen tesztpár.

4. A méterre váltott nyers eltérés:

(−100000,−1,−10500,−3)(-100000,-1,-10500,-3)

négyzetösszege 1010+1+110250000+9≈1,011025×101010^{10}+1+110250000+9\approx 1{,}011025\times10^{10}, a távolság kerekítve 100550,0100550{,}0. A distance_km most 99,999%99{,}999\% fölött uralja az eredményt, pedig a fizikai helyzet nem változott. A standardizált érték ellenben ugyanaz:

zA=(20000−80000)/40000=−1,5,zB=(120000−80000)/40000=1.z_A=(20000-80000)/40000=-1{,}5,\qquad z_B=(120000-80000)/40000=1.

A standardizált távolság a korábbi 3,94493{,}9449 marad. A standardizálás tehát eltünteti a pozitív lineáris mértékegység-átskálázás hatását; a nyers euklideszi távolság nem invariáns rá.

10.1.12 Gyakori tévedés és ellenpélda

A leggyakoribb tévedés az, hogy a nyers euklideszi távolságot skálázás nélkül „objektív hasonlóságnak” tekintjük. A fenti A–B példa az ellenpélda: kilométer helyett méterben megadva a távolság nagyságrendet ugrik, és a döntés egyetlen, önkényesen nagyobb számokban mért dimenzióra szűkül. A nagyobb numerikus egységű feature minden statisztikai hiba nélkül is dominál, mert a négyzetes büntetés nem ismeri a mértékegységet. Az önellenőrzés egyszerű: számítsd ki a hozzájárulásokat, és kérdezd meg, szeretnél-e modellt ezzel a nyers mércével. Ha a hozzájárulások 90%90\% fölött koncentrálódnak egyetlen koordinátára, az ritkán a tényleges jelentőséget mutatja, inkább skálaproblémát.

A másik félreértés a koszinusz-hasonlóságot távolságnak hívja. A koszinusz a hosszt elfelejti, és nem teljesíti a távolság nulla-feltételét: az (1,0)(1,0) és (2,0)(2,0) vektorok hasonlósága 11, pedig a pontok nem esnek egybe. A Kérdés, célváltozó és döntési helyzet alfejezetből ismert elv szerint a mértéket ahhoz a döntéshez kell kötni, amelyet a modell később támogat.

Különböző mértékegységű változók euklideszi távolságát megfelelő skálázás nélkül könnyű félreértelmezni. A skálázáshoz szükséges paramétereket a tanítóhalmazból becsüljük, ne a validációs vagy tesztadatból.

10.1.13 Rövid összefoglaló

A vektor az adattudományban egy megfigyelés rendezett numerikus jellemző-listája, a távolság pedig a különbségvektor euklideszi normája. A skaláris szorzat a koordinátaszorzatok összege, a koszinusz-hasonlóság irány szerint hasonlít, de nem távolság. A különböző mértékegységű koordináták négyzetes összegzése félrevezető; a standardizálás dimenziótlan közös skálát ad, és pozitív lineáris mértékegység-átskálázásra invariáns. A Northstar-példában a nyers távolságot 99,99%99,99\%-ban a kosárérték uralta, a standardizálás után a hozzájárulások kiegyensúlyozottabbak lettek. A következő alkalmazás a Mátrixszorzás és lineáris transzformáció mátrixszorzás, amely ezekből a koordinátánkénti műveletekből építi fel a lineáris transzformációkat.