3. Més proper

Definim mostra com a una etiqueta seguida d’una serie de valors reals, tots entre 0 i 1 (ambdós inclosos), que anomenem vector. Disposem de mostres codificades com a strings a on la separació entre cada element és un o més espais. Per exemple, aquesta mostra

'setosa 0.1  0.5 0.43 0.21'

conté l’etiqueta setosa i el vector 0.1 0.5 0.43 0.21.

Dissenya la funció següent i desa-la al fitxer mes_proper.py:

mes_proper.extreu(mostra)

Retorna la etiqueta i el vector associats a una mostra.

Paràmetres:

mostra (str) – string que conté una etiqueta i nombres separats per un o més espais.

Tipus de retorn:

tuple(str, list[float])

Retorna:

tupla amb l’etiqueta i el vector (representatat com a llista de reals) associats a la mostra.

Per exemple:

>>> mostra1 = 'setosa 0.1  0.5 0.43 0.21'
>>> etiq, dades = extreu(mostra1)
>>> etiq
'setosa'
>>> dades
[0.1, 0.5, 0.43, 0.21]

>>> mostra2 = 'virginica 0.81 0.73 0.75 0.1 0.68 0.23'
>>> etiq, dades = extreu(mostra2)
>>> etiq
'virginica'
>>> dades
[0.81, 0.73, 0.75, 0.1, 0.68, 0.23]

Nota

Disposes de més tests al fitxer test-extreu.txt.

La distància euclidiana entre dos vectors \(\mathbf{v_1} = (v_{1_1}, v_{1_2}, \dots, v_{1_n})\) i \(\mathbf{v_2} = (v_{2_1}, v_{2_2}, \dots, v_{2_n})\) es calcula mitjançant la següent fórmula:

\[d(\mathbf{v_1}, \mathbf{v_2}) = \sqrt{\sum_{i=1}^{n} (v_{1_i} - v_{2_i})^2}\]

Dissenya la funció següent i desa-la al fitxer mes_proper.py:

mes_proper.distancia(vector1, vector2)

Retorna la distància euclidiana entre dos vectors (llistes de reals). Es suposa que els vectors tenen la mateixa longitud.

Paràmetres:
  • vector1 (list[float]) – Llista de nombres reals.

  • vector2 (list[float]) – Llista de nombres reals.

Tipus de retorn:

float

Retorna:

La distància euclidiana entre els dos vectors.

Per exemple:

>>> v1 = [0.1, 0.5, 0.43, 0.21]
>>> v2 = [0.53, 0.29, 0.1, 0.5]
>>> round(distancia(v1,v2),4)
0.6496

>>> v3 = [0.53, 0.72, 0.16, 0.1]
>>> v4 = [0.53, 0.72, 0.16, 0.1]
>>> distancia(v3,v4)
0.0

Nota

Disposes de més tests al fitxer test-distancia.txt.

A més a més, disposem d’una col·lecció de mostres emmagatzemades en una llista d’strings. Per exemple:

>>> dades = [
... 'setosaA 0.1  0.5 0.43 0.21', 'virginicaA 0.53 0.29 0.1 0.5',
... 'setosaB 0.2 0.33 0.11 0.0', 'versicolorA 0.655 0.7   0.433 0.762',
... 'versicolorB 0.131 0.532 0.01   0.0', 'setosaC 0.0 0.0 0.1 0.21',

Dissenya la funció següent i desa-la al fitxer mes_proper.py:

mes_proper.etiqueta(dades, vector)

Retorna l’etiqueta de la mostra de la llista dades més propera al vector donat segons la distància euclidiana. Per simplificar, suposarem que no pot haver-hi empats i que la llista dades conté com a mínim una mostra.

Paràmetres:
  • dades (list[str]) – llista de mostres.

  • vector (list[float]) – vector de nombres reals.

Tipus de retorn:

str

Retorna:

Etiqueta de la mostra de dades més propera a vector.

Aquesta funció ha de cridar a les funcions anteriors extreu() i distancia().

Per exemple:

>>> dades = [
... 'setosaA 0.1  0.5 0.43 0.21', 'virginicaA 0.53 0.29 0.1 0.5',
... 'setosaB 0.2 0.33 0.11 0.0', 'versicolorA 0.655 0.7   0.433 0.762',
... 'versicolorB 0.131 0.532 0.01   0.0', 'setosaC 0.0 0.0 0.1 0.21',
... 'versicolorC 0.53 0.29 0.1 0.3']

>>> v1 = [0.1, 0.48, 0.42, 0.22]
>>> etiqueta(dades, v1)
'setosaA'

>>> v2 = [0.1, 0.3, 0.4, 1.0]
>>> etiqueta(dades, v2)
'virginicaA'

Nota

Disposes de més tests al fitxer test-etiqueta.txt.

Disposeu de solucions al fitxer mes_proper.py