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 .. code-block:: '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``: .. py:function:: mes_proper.extreu(mostra) Retorna la etiqueta i el vector associats a una mostra. :param str mostra: string que conté una etiqueta i nombres separats per un o més espais. :rtype: tuple(str, list[float]) :return: tupla amb l'etiqueta i el vector (representatat com a llista de reals) associats a la mostra. Per exemple: .. literalinclude:: test-extreu.txt :language: python :lines: 3-15 .. note:: Disposes de més tests al fitxer :download:`test-extreu.txt`. La distància euclidiana entre dos vectors :math:`\mathbf{v_1} = (v_{1_1}, v_{1_2}, \dots, v_{1_n})` i :math:`\mathbf{v_2} = (v_{2_1}, v_{2_2}, \dots, v_{2_n})` es calcula mitjançant la següent fórmula: .. math:: 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``: .. py:function:: 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. :param list[float] vector1: Llista de nombres reals. :param list[float] vector2: Llista de nombres reals. :rtype: float :return: La distància euclidiana entre els dos vectors. Per exemple: .. literalinclude:: test-distancia.txt :language: pycon :lines: 3-11 .. note:: Disposes de més tests al fitxer :download:`test-distancia.txt`. A més a més, disposem d'una col·lecció de mostres emmagatzemades en una llista d'strings. Per exemple: .. literalinclude:: test-etiqueta.txt :language: pycon :lines: 3-6 Dissenya la funció següent i desa-la al fitxer ``mes_proper.py``: .. py:function:: 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. :param list[str] dades: llista de mostres. :param list[float] vector: vector de nombres reals. :rtype: str :return: Etiqueta de la mostra de *dades* més propera a *vector*. Aquesta funció **ha de cridar** a les funcions anteriors :func:`extreu` i :func:`distancia`. Per exemple: .. literalinclude:: test-etiqueta.txt :language: pycon :lines: 3-15 .. note:: Disposes de més tests al fitxer :download:`test-etiqueta.txt`. Disposeu de solucions al fitxer :download:`mes_proper.py`