28. Pojęcie metryki.
Treści kształcenia. Pojęcie metryki. Przegląd metryk Minkowskiego, uwagi o nazwach metryk w materiałach anglojęzycznych (np. Czebyszewa czy Manhattan). Do wyboru omówienie: metryka Hamminga na łańcuchach znaków (kodowanie, kody z wykrywaniem błędów), metryka Levenshteina (przetwarzanie informacji, analiza plagiatów itp.), odległości cosinusowe i miary podobieństwa w informatyce - np. w rozpoznawaniu wzorców (grafika) czy porównywaniu łańcuchów znaków. Konstrukcja i zastosowania metryk wagowych (też w informatyce) - kule w takich metrykach. Metryki w analizie obrazów.
Efekty kształcenia. Potrafi rozpoznać i wykorzystać metryki i różne miary odległości w informatyce. Rozpoznaje różnice w ich zastosowaniu.
Wstęp¶
W zagadnieniach naukowych, ale również w codzienności badamy różnego rodzaju “odległości” między różnymi obiektami. Może to być odległość od szkoły czy sklepu, ale również odległość (czas) między programami telewizyjnymi. Jeszcze innym rodzajem odległości może posługiwać się student, gdy oblicza średnią ocen i weryfikuje (porównując ją do ustalonego progu), czy otrzyma stypendium naukowe.
Widzimy, że rozpatrywane powyżej zbiory są rozmaitej natury, więc i “odległości” także będą się różniły. Co więcej nawet, odległości między obiektami tej samej natury mogą być w różnych sytuacjach różnie rozumiane. Jeśli np. chcemy pokonać odległość z miasta A do miasta B, to czym innym jest odległość na mapie (jest ona najbliższa tzw. odległości euklidesowej), a odległość wynikająca z realnego układu dróg czy sieci kolejowej.
W matematyce przyjmuje się pewne założenia minimalne, aby zdefiniować pojęcie metryki odpowiadające pojęciu odległości. Daje to możliwość definiowania tego pojęcia na dowolnym niepustym zbiorze.
Def. Niech będzie niepustym zbiorem, zaś funkcją spełniającą dla dowolnych następujące warunki:
,
,
.
Funkcję nazywamy metryką, zaś parę przestrzenią metryczną.
Ostatni warunek w definicji nazywany jest nierównością trójkąta, drugi z warunków bywa nazywany warunkiem symetrii, a pierwszy warunkiem identyczności
Zauważmy, że w każdym niepustym zbiorze możemy wprowadzić metrykę, istotnie, wystarczy przyjąć, że dla mamy . Tak zdefiniowaną metrykę nazywamy metryką dyskretną.
Przykłady przestrzeni metrycznych¶
Przykład 1 - metryka euklidesowa¶
Najbardziej naturalnym przykładem metryki jest metryka euklidesowa. Najogólniejszy wariant tej metryki definiuje się w następujący sposób: niech , gdzie . Dla
W szczególności dla , wektory redukują się do liczb rzeczywistych (dla uproszczenia oznaczmy je również przez ), zaś formuła , jako że , redukuje się do
Dla mamy:
Powyższa formuła jest identyczna ze znanym z geometrii analitycznej wzorem na odległość punktów na płaszczyźnie.
Poniżej zilustrujemy działanie metryki euklidesowej w dla czterech wybranych punktów tworzących czworościan. Obliczymy odległości między nimi. Powtarzające się wartości ilustrować będą własność symetrii (własność 2 w definicji metryki). Porównując długości odpowiednich krawędzi tworzących trójkąty, łatwo można zauważyć, że spełniona jest nierówność trójkąta.
%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import itertools
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
# rysowanie punktow
a, b, c1, c2, z1, z2, z3 = 1, 2, 3, 4, 3, 6, 3
pts = [(a,0,0),(b,0,0),(c1,c2,0),(z1,z2,z3)]
for p in pts:
ax.scatter(p[0], p[1], p[2], zdir='z', c='r')
# rysowanie czworoscianu
for a, b in itertools.product(pts, pts):
x = np.linspace(a[0], b[0], 100)
y = np.linspace(a[1], b[1], 100)
z = np.linspace(a[2], b[2], 100)
d = np.sqrt( sum([(a[i]-b[i])**2 for i in (0, 1, 2)]) )
s = "%.2f" % d
m = [(a[i]+b[i])/2. for i in (0, 1, 2)]
ax.plot(x, y, z)
if d>0:
ax.text(m[0], m[1], m[2], s)
print(a, b, s)
plt.show();(1, 0, 0) (1, 0, 0) 0.00
(1, 0, 0) (2, 0, 0) 1.00
(1, 0, 0) (3, 4, 0) 4.47
(1, 0, 0) (3, 6, 3) 7.00
(2, 0, 0) (1, 0, 0) 1.00
(2, 0, 0) (2, 0, 0) 0.00
(2, 0, 0) (3, 4, 0) 4.12
(2, 0, 0) (3, 6, 3) 6.78
(3, 4, 0) (1, 0, 0) 4.47
(3, 4, 0) (2, 0, 0) 4.12
(3, 4, 0) (3, 4, 0) 0.00
(3, 4, 0) (3, 6, 3) 3.61
(3, 6, 3) (1, 0, 0) 7.00
(3, 6, 3) (2, 0, 0) 6.78
(3, 6, 3) (3, 4, 0) 3.61
(3, 6, 3) (3, 6, 3) 0.00

Przykład 2 - metryki Minkowskiego¶
Metryka euklidesowa jest szczególnym przypadkiem pewnej rodziny metryk. Jeśli we wzorze zamiast wykładnika 2 wstawimy , a otrzymaną sumę podniesiemy do potęgi , otrzymamy tzw. metrykę Minkowskiego:
Przypadek nazywany jest w literaturze metryką Manhattan.
Zilustrujmy działanie metryki Minkowskiego. Dla oraz wygenerujemy dwa (losowe) wektory, każda składowa będzie liczbą rzeczywistą z przedziału . Dla tak wygenerowanych wektorów wyznaczymy ich odległości w metrykach Minkowskiego (wg rosnącego ):
from random import random #uruchomić kod kilkukrotnie
#generowanie wektorow w R^10, random - rozklad jednostajny na (0,1), przeskalowanie funkcja 100x-50, przyblizenie do 4 miejsc
#po przecinku
a = []
b = []
for i in range(10):
x = round(100* random() - 50, 4)
y = round(100* random() - 50, 4)
a.append(x)
b.append(y)
dist = [] #wektor przechowujacy kolejne odleglosci dla metryk Minkowskiego od p \in [1,100]
for p in range(1, 101): #iteracja po p
s = 0
for i in range(10): #obliczanie odleglosci w metryce d_p
s += abs(a[i] - b[i]) ** p
d = round(s ** (1/p), 4) # przyblizenie d_p(a,b)
dist.append(d) # i dodanie do listy
l_infinity_dist = max([abs(a[i]-b[i]) for i in range(10)]) # obliczenie odleglosci w d_infinity
print(f'a = {a}')
print(f'b = {b}')
print(f'max of |a-b| = {l_infinity_dist:.4f}')
print(dist) a = [21.5348, 43.109, 36.5494, 48.505, -15.6275, 13.7209, 30.4978, 15.8788, 30.4912, 36.2639]
b = [20.0621, -6.4751, 13.47, -18.9435, -18.0501, -1.4824, -43.8739, 38.2926, -41.9914, 9.3093]
max of |a-b| = 74.3717
[355.4333, 140.6895, 108.2245, 96.3146, 90.2845, 86.6723, 84.2782, 82.5819, 81.3216, 80.3512, 79.5832, 78.9617, 78.4496, 78.0213, 77.6585, 77.3479, 77.0795, 76.8457, 76.6406, 76.4596, 76.2988, 76.1555, 76.027, 75.9113, 75.8068, 75.7121, 75.6259, 75.5474, 75.4755, 75.4095, 75.3488, 75.293, 75.2413, 75.1935, 75.1492, 75.108, 75.0697, 75.034, 75.0006, 74.9694, 74.9402, 74.9128, 74.8871, 74.8629, 74.8401, 74.8187, 74.7984, 74.7794, 74.7613, 74.7442, 74.7281, 74.7128, 74.6982, 74.6845, 74.6714, 74.6589, 74.6471, 74.6359, 74.6251, 74.6149, 74.6052, 74.5959, 74.5871, 74.5786, 74.5706, 74.5628, 74.5555, 74.5484, 74.5417, 74.5352, 74.5291, 74.5231, 74.5175, 74.512, 74.5068, 74.5018, 74.4971, 74.4925, 74.488, 74.4838, 74.4798, 74.4759, 74.4721, 74.4685, 74.465, 74.4617, 74.4585, 74.4554, 74.4525, 74.4496, 74.4469, 74.4443, 74.4417, 74.4393, 74.437, 74.4347, 74.4325, 74.4304, 74.4284, 74.4265]
Kilkukrotne wywołanie powyższego kodu pozwala zauważyć dwie własności. Widzimy, że wraz ze wzrostem wartości zdają się tworzyć ciąg nierosnący. Ponadto koncentrują się one “w pobliżu” liczby
Rzeczywiście dowodzi się, że dla dowolnego oraz dowolnego
dla dowolnych . Ponadto formuła
definiuje metrykę w zwaną metryką maksimum. W literaturze metryka ta nazywana jest także metryką Czebyszewa lub metryką nieskończoność.
Przykład 3 - generowanie metryk przez funkcje różnowartościowe¶
Niech będzie dowolną funkcją różnowartościową. Wówczas funkcja określona dla dowolnych wzorem
jest metryką.
Sprawdźmy, że spełnione są warunki z definicji metryki.
Jeśli , to . Warunek implikuje . Z różnowartościowości dostajemy .
Dla dowolnych mamy .
Z nierówności trójkąta dla metryki euklidesowej (w przypadku jednowymiarowym) mamy:
dla dowolnych .
Powyższy przykład daje nam możliwość definiowania rozmaitych metryk. Przyjmując oraz dostajemy metrykę określoną wzorem
Zauważmy, że w tej metryce odległość między dowolnymi elementami ze zbioru nie przekracza 1.
Przykład 4 - generowanie metryk przez funkcje rosnące i subaddytywne¶
Niech będzie przestrzenią metryczną. Wykazać, że funkcja
jest metryką w .
Niech dla . Z definicji wynika, że . Wyrażenie to jest dobrze określone, bo funkcja przyjmuje wartości nieujemne. Zatem fakt
jest równoważny
który z kolei jest równoważny warunkowi .
Drugi z warunków wynika bezpośrednio z faktu, że jest metryką i spełnia warunek symetrii (warunek 2 definicji). Aby udowodnić warunek trójkąta, ustalmy dowolne . Mamy do udowodnienia poniższą nierówność
Zauważmy, że dla funkcja określona wzorem jest rosnąca. Istotnie, dla mamy ciąg implikacji
Zatem
Zauważmy, że w powyższym przykładzie istotne były trzy własności funkcji :
,
jest rosnąca w ,
jest subaddytywna, tzn. dla .
W ramach ćwiczenia można pokazać, że jeśli jest przestrzenią metryczną, to również jest przestrzenią metryczną, gdzie
gdzie jest funkcją spełniającą warunki .
Przykład 5 - metryka Hamminga¶
Innym ważnym z punktu widzenia zastosowań informatycznych przykładem jest tzw. metryka Hamminga. Przypuśćmy, że mamy pewien skończony zbiór znaków . Niech będzie ustaloną liczbą. Przez oznaczmy zbiór wszystkich ciągów znaków ze zbioru o długości . Przez oznaczmy liczbę indeksów, na których ciągi różnią się.
Pokażemy, że jest metryką. Pierwsze dwa warunki są oczywiste. Udowodnijmy nierówność trójkąta. Niech . Niech i niech . Oznaczmy przez zbiór indeksów, którymi różnią się ciągi i i niech oznacza zbiór indeksów, którymi różnią się elementy i . Zauważmy, że zbiór indeksów, na którym różnią się ciągi i , zawiera się w sumie (jeśli , to różni się od i od na tym indeksie, istnieje więc możliwość, że ). Jeśli więc oznacza zbiór indeksów, na których ciągi i się różnią, to .
Zatem
Zilustrujmy działanie metryki Hamminga prostym przykładem. Ponieważ wszystkie typy danych przedstawiają się w pamięci komputera za pomocą ciągów binarnych, przyjmijmy , i niech , , . Wówczas , , .
Kule w przestrzeniach metrycznych¶
Def. Niech będzie przestrzenią metryczną. Kulą otwartą o środku w punkcie i promieniu nazywamy zbiór
Zbiór
nazywamy kulą domkniętą o środku w punkcie i promieniu . Gdy , w powyższych oznaczeniach kul będziemy pomijali indeks. Takie kule będziemy nazywali kulami jednostkowymi (otwartą lub domkniętą).
Przykładowo w metryce dyskretnej mamy , ale przy dowolnym . Dla różnych metryk określonych na tym samym zbiorze kule mogą przedstawiać różne zbiory. Przeanalizujmy, jak zmieniają się kule jednostkowe o środku w punkcie dla i metryk Minkowskiego przy różnych .
Metryka Manhattan (): ,
Metryka euklidesowa (): ,
Metryka maksimum (): .
Na wykresach poniżej wygenerujemy sfery jednostkowe w poszczególnych metrykach Minkowskiego. Sferą o środku w i promieniu w przestrzeni metrycznej nazywamy zbiór
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(8,8))
#ustawienia osi
ax = fig.add_subplot(1, 1, 1)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
x = [-1, 0, 1, 0, -1]
y = [0, -1, 0, 1, 0]
plt.plot(x,y, 'r') #rysujemy kwadrat o wierzcholkach w punktach o wspolrzednych (x,y) z list x i y
plt.title('Sfera jednostkowa o środku (0,0) w metryce Manhattan')
plt.show();
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(1, 1, 1)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
x_1 = np.linspace(-1, 1, 100) #dzielimy odcinek [-1,1] na 100 rownych kawalkow
x_2 = np.linspace(1,-1, 100) #dzielimy odcinek [-1,1] na 100 rownych kawalkow
x_e = np.concatenate((x_1, x_2), axis=0) # laczenie tablic (jednowymiarowych) x_1 i x_2
y_1 = np.sqrt(1- x_1 ** 2) # gorny plat kuli
y_2 = (-1) * np.sqrt(1 -x_2 ** 2) #dolny plat kuli
y_e = np.concatenate((y_1, y_2), axis=0)
plt.plot(x_e,y_e, 'r')
plt.title('Sfera jednostkowa o środku (0,0) w metryce euklidesowej')
plt.show();
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(1, 1, 1)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
x_inf = [-1, 1, 1, -1, -1]
y_inf = [-1, -1, 1, 1, -1]
plt.plot(x_inf,y_inf, 'r')
plt.title('Sfera jednostkowa o środku (0,0) w metryce nieskończoność')
plt.show();
Podsumujmy naszą pracę pisząc kod funkcji, która dla zadanego (można wywołać ją także z ) wyrysuje nam sferę jednostkową o środku w punkcie .
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
def draw_sphere(p=0.5):
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(1, 1, 1)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
x_1 = np.linspace(-1, 1, 100)
x_2 = np.linspace(1,-1, 100)
x_p = np.concatenate((x_1, x_2), axis=0)
y_1 = np.power(1- np.power(abs(x_1), p), (1/p))
y_2 = (-1) * np.power(1- np.power(abs(x_1), p), (1/p))
y_p = np.concatenate((y_1, y_2), axis=0)
plt.plot(x_p,y_p, 'r')
plt.title(f'Sfera jednostkowa o środku (0,0) w metryce Minkowskiego dla p={p}')
plt.show();
draw_sphere() #można wywołać z dowolnym p>0 (domyślnie p = 0.5)
Średnica zbioru, odległość punktu od zbioru, odległość między zbiorami¶
Pojęcie metryki umożliwia nam wprowadzenie pojęć średnicy zbioru, odległości punktu od zbioru, odległości między zbiorami w przestrzeniach metrycznych.
Def. Średnicą zbioru przestrzeni metrycznej nazywamy liczbę
Odległością punktu od zbioru nazywamy liczbę
Odległością między zbiorami i nazywamy liczbę
Zauważyliśmy wcześniej, że średnica zbioru w metryce
wynosi 1.
Jeśli i , to
Jeśli jest zbiorem liczb parzystych, to
Istotnie, dla dowolnego biorąc oraz (zauważmy, że przy takim wyborze jedna z liczb jest parzysta i jedna jest nieparzysta) mamy
Z dowolności wynika, że .