Vous êtes sur la page 1sur 11

Aprendizaje Automático – Guı́a de Ejercicios*

Departamento de Computación – FCEyN


Universidad de Buenos Aires

Segundo cuatrimestre 2016

1. Introducción

Ejercicio 1.1. Describir la tarea, medida de performance y experiencia de los siguientes sistemas:

filtro de spam;
dictado de textos;
autenticación biométrica (ej: huellas dactilares);
detección de fraude en tarjetas de crédito.

Ejercicio 1.2. ¿Cuál es la diferencia entre la clasificación y la regresión?

Ejercicio 1.3. ¿Cuál es la diferencia entre el aprendizaje supervisado, el aprendizaje no supervi-


sado y el aprendizaje por refuerzos?

Ejercicio 1.4. El archivo titanic-train.csv contiene datos de pasajeros del naufragio del trans-
atlántico Titanic en 1912, incluyendo edad, sexo, clase del pasaje y supervivencia a la tragedia,
entre otros. Para una descripción completa, ver https://www.kaggle.com/c/titanic/data. Ana-
lizar los datos y escribir un programa en Python que clasifique a los pasajeros en supervivientes y
no supervivientes tan bien como sea posible. No usar ninguna técnica de Aprendizaje Automático,
por ahora. Calcular el porcentaje de aciertos sobre los mismos datos.

Ejercicio 1.5. Sea un problema de clasificación en el cual cada instancia tiene 2 atributos numéri-
cos (coordenadas x e y) y pertenece a una de dos clases posibles (blanco o negro). Para cada uno
de los tipos de hipótesis ilustrados a continuación, se pide:

describir el espacio de hipótesis H;


identificar los parámetros de la hipótesis;
describir su sesgo inductivo.

* Algunos ejercicios fueron adaptados de los libros “Machine Learning”, de Tom Mitchell (McGraw-Hill, 1997); “Pattern

Recognition and Machine Learning”, de Christopher Bishop (Springer, 2006); y “An Introduction to Statistical Learning”,
de James, Witten, Hastie & Tibshirani (Springer, 2015).

1
2. Repaso de probabilidades

Ejercicio 2.1. Se tiran dos dados de seis caras balanceados.

1. ¿Cuál es la probabilidad de que salga doble seis?


2. Si en uno de los dados salió un número par, ¿cuál es la probabilidad de que los dos dados
sumen siete?

Ejercicio 2.2. Tenemos un mazo de cartas francesas ({A, 2, 3, ..., 10, J, Q, K} × {♥, ♦, ♣, ♠}).
1. Si sacamos una carta al azar, ¿cuál es la probabilidad de que sea un 10 de Corazones?
2. Si sabemos que la carta elegida es roja (♥ o ♦), ¿cómo cambia esa probabilidad?
3. ¿Y si sabemos que la carta elegida es un 10?

Ejercicio 2.3. Demostrar los teoremas de Bayes y de Probabilidad Total.

Ejercicio 2.4. Supongamos que la probabilidad de que un paciente tenga una forma determinada
del virus de herpes es P (herpes) = 0,008. Se tiene un test con una sensibilidad de 0,98 (es decir,
P (⊕ | herpes) = 0,98) y una especificidad de 0,97 (es decir, P ( | ¬herpes) = 0,97), donde ⊕ y
representan los resultados positivo y negativo del test, respectivamente. Si un paciente se realiza
el test y le da resultado positivo, ¿cuál es la probabilidad de que realmente tenga ese virus de
herpes? Es decir, se pide calcular P (herpes | ⊕).

2
3. Construcción de árboles de decisión

Ejercicio 3.1. La estructura de un árbol de decisión permite modelar fórmulas de lógica propo-
sicional tomando la tabla de verdad de cada fórmula como dataset. Representar las siguientes
fórmulas booleanas mediante árboles de decisión:

(a) ¬p (d) p ∨ (q ∧ r)
(b) p ∧ q (e) p XOR q
(c) p ∨ q (f) (p ∧ ¬q) ∨ (r ∧ s)

Ejercicio 3.2. Hacer en papel y lápiz el árbol de decisión correspondiente a entrenar con los datos
de Juego al tenis.
Cielo Temperatura Humedad Viento clase
Sol Calor Alta Débil No
Sol Calor Alta Fuerte No
Nublado Calor Alta Débil Sı́
Lluvia Templado Alta Débil Sı́
Lluvia Frı́o Normal Débil Sı́
Lluvia Frı́o Normal Fuerte No
Nublado Frı́o Normal Fuerte Sı́
Sol Templado Alta Débil No
Sol Frı́o Normal Débil Sı́
Lluvia Templado Normal Débil Sı́
Sol Templado Normal Fuerte Sı́
Nublado Templado Alta Fuerte Sı́
Nublado Calor Normal Débil Sı́
Lluvia Templado Alta Fuerte No

Ejercicio 3.3. Armar 3 ejemplos posibles de entradas nuevas y usar el árbol del ejercicio anterior
para predecir la clase de salida.

Ejercicio 3.4. Preguntas conceptuales para discutir:


(a) ¿Cuál el sesgo inductivo del árbol de decisión?
(b) ¿Cuál es la motivación de usar entropı́a y ganancia de información?
(c) ¿Qué sucede cuando dos atributos empatan en ganancia de información? ¿Esta decisión es
parte del sesgo inductivo?
(d) ¿Cómo se comporta la ganancia de información cuando compara atributos con cantidad de
valores muy distintos? Por ejemplo, si el atributo 1 tiene dos valores posibles (true y false)
y el atributo 2 tiene 40 valores distintos (sin orden), ¿es justo usar ganancia de información
para elegir entre ellos? ¿Qué desventajas tiene? ¿Cómo se podrı́a mitigar?

Ejercicio 3.5. El archivo tree aa.py tiene una implementación parcial de árboles de decisión. Com-
pletar las siguientes funciones, usando las definiciones vistas en la clase teórica.
entropy( y ): Una función que dado un vector como parámetro ( y ) con distintos valores,
calcula su valor de entropı́a.

3
information gain( X , y ): Una función que toma la matriz X y el vector y, y devuelve el ı́ndice
que corresponde a la columna con mayor ganancia de información.
Usar el dataset Juego al tenis y las entradas propuestas anteriormente para testear la implementa-
ción.

Ejercicio 3.6. Comparar la versión de DecisionTreeClassifier de sklearn 1 con la implementación


desarrollada por ustedes. ¿En los datasets anteriores alguna de las dos implementaciones funciona
mejor que otra?

Ejercicio 3.7. Hipotetizar cómo cambia el comportamiento del algoritmo DecisionTreeClassifier


variando 2 de sus parámetros (por ejemplo: max depth y class weight). Armar ejemplos para
evaluar las posibles respuestas a esta pregunta.

4. Sobreajuste, validación cruzada y poda


Nota#1: Para tener la última versión de scikit-learn en los labos hay que ejecutar el siguiente
comando en una consola: pip install −−user −−upgrade sklearn.
Nota#2: Archivos necesarios: http://www.dc.uba.ar/materias/aa/2016/cuat2/metricas_bundle
Nota#3: Gracias a Pablo Brusco por la ayuda para armar esta sección.

Ejercicio 4.1. Matriz de Confusión


(a) En un problema de clasificación binaria, ¿a qué se denomina clase positiva y a qué clase ne-
gativa? Si nuestro problema consiste en clasificar spam vs no-spam, ¿cuál es la clase positiva?
Si nuestro problema es clasificar imágenes de perros vs gatos, ¿cuál es la clase positiva?
(b) Completar la implementación de la función confusion matrix en el archivo ‘metrics.py’. Veri-
ficar el funcionamiento corriendo el archivo ‘ejemplo1.py’. El Test 1 deberı́a pasar.
(c) ¿Por qué un falso positivo puede ser considerado distinto a un falso negativo? Dar un ejemplo
en donde es más grave tener falsos negativos que falsos positivos.

Ejercicio 4.2. Métricas


(a) Explicar con tus palabras la definición de accuracy, precision y recall.
(b) Completar las implementaciones de accuracy, recall, precision y Fβ . Verificar el funciona-
miento corriendo el archivo ‘ejemplo1.py’. El Test 2 deberı́a pasar.
(c) ¿Por qué es un problema medir accuracy de un clasificador para compararlo con otro? (Pensar
en desbalance de clases.) Dar un ejemplo en donde serı́a engañoso utilizar esta comparación.

Ejercicio 4.3. ¿Binaria o 2 clases?


Sean A y B clasificadores que distinguen entre imágenes de perros e imágenes de gatos. Al medir
la performance del clasificador (utilizando F1 para evitar el problema de accuracy) y “gato” como
clase positiva, obtenemos F1 (A) = 0,9, F1 (B) = 0,8. ¿Podemos concluir que el clasificador A es
mejor que el clasificador B para este problema?
Resolver los siguientes ı́tems para poder responder a la pregunta:
(a) Al calcular F1 utilizando “gato” como clase positiva, ¿importa qué ocurre con los perros que
fueron clasificados correctamente? Correr ‘ejemplo2.py’ y decidir cuál clasificador funciona
mejor, basándose en las métricas. Luego calcular las mismas métricas utilizando a “perro”
como la clase ‘positiva’.
1 http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

4
(b) ¿Qué sucede si la cantidad de instancias sobre las que fueron testeados es distinta? ¿Cómo se
ve afectada la métrica F1 al cambiar los True Negatives? Comentar la lı́nea que dice exit(0)
y correr el archivo ‘ejemplo2.py’. El gráfico muestra cómo varı́a la métrica F1 al aumentar la
cantidad de True Negatives (observar que estamos cambiando la cantidad de instancias sobre
las que testeamos). ¿Qué se puede concluir de este experimento?
(c) ¿Para qué sirve el parámetro average en la función f1 score de la librerı́a sklearn?

Ejercicio 4.4. Cross-validation

(a) Usando el dataset B.csv y DecisionTreeClassifier de sklearn, analizar cómo varı́a la perfor-
mance media en un esquema de cross-validation de k-folds reportando accuracy y roc auc, y
variando las siguientes caracterı́sticas:
Cantidad de nodos del árbol (ayuda#1: el atributo max leaf nodes puede resultar útil
para controlar la cantidad de nodos del árbol, ayuda#2: para saber la cantidad de nodos
de un árbol puede ejecutarse clf.tree .node count, siendo clf un DecisionTreeClassifier
entrenado).
Cantidad de folds.
Usando StratifiedKFold y StratifiedShuffleSplit.
(b) Repetir el análisis anterior usando el dataset U.csv

5. Reducción de dimensionalidad
Para los ejercicios de esta sección, considerar los siguientes ejemplos y sus conjuntos de datos:

Ejemplo A: Lectura de siglas (siglas-dev.csv)


Tarea: Determinar cómo pronunciar siglas en español. Este clasificador es útil en un sistema text-
to-speech al encontrar una sigla desconocida en un texto a sintetizar.
Input: Sigla. Ejemplos: DGI, IBM, FMI, UBA, ALUAR, CONADEP. Por simplicidad, excluimos siglas
con pronunciación especial: MIT (emaitı́), CNEA (conea), FCEN (efecen).
Output: Decidir si debe deletrearse (clase ‘deletreo’), o leerse como un acrónimo (‘acronimo’).
Atributos: longitud, cant vocales, cant consonantes, prop vocales, prop consonantes, cant conso-
nantes vecinas, cant vocales vecinas, cant consonantes distintas, cant vocales distintas, cant con-
sonantes iniciales, cant vocales iniciales, cant consonantes finales, cant vocales finales, cant le-
tra [A-Z] (26 atributos).

Ejemplo B: Reconocimiento del género del hablante (genero.csv)


Tarea: Determinar el género de una persona (masculino/femenino), a partir de una grabación
corta de su habla.
Input: archivo wav.
Output: m / f.
Atributos: 1582 atributos acústicos extraidos con OpenSmile. Datos originales y más información:
http://habla.dc.uba.ar/gravano/ith-2014/tp2/

Ejercicio 5.1. Experimentar con diferentes algoritmos de clasificación (árboles, Naive Bayes, SVM,
kNN) para los ejemplos A y B, usando 10-fold CV. ¿Qué algoritmos funcionan mejor para los datos
originales?

Ejercicio 5.2. Rankear los atributos de cada ejemplo según su ganancia de información. Conser-
var sólo los primeros k atributos (probar con distintos valores de k) y ver cómo afecta esto al

5
desempeño de los algoritmos del ejercicio anterior. ¿Hay diferencia en los atributos encontrados
si la seleccion se hace al principio o en cada iteracion del folding?

Ejercicio 5.3. Experimentar con otros métodos de selección de atributos. Implemente al menos 3
de las siguientes polı́ticas de seleccion de atributos y compare como funcionan en los dos datasets

Ranking de atributos por p-valor: Para cada atributo compare usando un test de hipótesis
(ttest2 , kruskall3 , ks test4 , etc) la diferencia entre la proyeccion del atributo separando por
clase y se quede con los k más significativamente distintos.
Random Search: Elija un subset de k atributos al azar
Genetic Search 5

Alguna idea mezclando Greedy Forward Selection, Greedy Backward Elimination


Usando 3 algoritmos de clasificación distintos, ¿cómo afecta al desempeño hacer selección de
atributos? En general, ¿cuán sensible es cada algoritmo de aprendizaje a la cantidad y calidad de
atributos?

Ejercicio 5.4. En ejemplo-pca.py hay un ejemplo de ejecución de Análisis de Componentes Prin-


cipales (PCA) en Python, usando la biblioteca sklearn.decomposition. Este código primero ge-
nera al azar los datos de la izquierda, y los transforma mediante PCA en los datos de la derecha:

Transformar con PCA los datos de los ejemplos A y B, conservar sólo las primeras k Componentes
(probar con distintos valores de k) y volver a evaluar los algoritmos de clasificación.

Ejercicio 5.5. Existen distintos métodos de reducir la dimensionalidad, Scikit-learn implementa


algunos de ellos. Pruebe los siguientes métodos e intente generar intuición sobre que propiedad
tiene cada uno. Piense en que casos (datasets) convendria uno u otro.

Multidimensional scaling 6
Non-Negative Matrix Factorization 7
Independent Component Analysis 8

2 http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.ttest_ind.html
3 http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.mstats.kruskalwallis.html
4 http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.stats.ks_2samp.html
5 http://topepo.github.io/caret/feature-selection-using-genetic-algorithms.html
6 http://scikit-learn.org/stable/modules/generated/sklearn.manifold.MDS.html
7 http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html
8 http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.FastICA.html

6
6. Regresión lineal

Ejercicio 6.1. Sea la siguiente definición de RSS (residual sum of squares):


n
X 2
RSS = yi − β̂0 − β̂1 · xi
i=1
δRSS δRSS
Derivar β̂0 y β̂1 a partir de δ β̂0
=0y δ β̂1
= 0, de modo de llegar a estas expresiones:

β̂0 = y − β̂1 · x
Pn
(x − x)(yi − y)
Pn i
β̂1 = i=1 2
i=1 (xi − x)

Cov[x,y]
Ejercicio 6.2. Probar que la expresión para β̂1 del ejercicio anterior es equivalente a Var[x] .
Interpretar geométricamente.

Ejercicio 6.3. Implementar las fórmulas del ejercicio 6.1 en Python. Probarlas con el dataset
‘Boston’ de sklearn, para ajustar una regresión lineal de la variable ‘MEDV’ (la variable objetivo
del dataset) en función de la variable ‘RM’.
from sklearn import datasets
boston = datasets.load_boston()
# Imprimir una descripción del dataset.
print boston.DESCR
# Usar sólo el atributo ‘RM’.
X = boston.data[: , [boston.feature_names.tolist().index(’RM’)] ]
Y = boston.target
Los valores estimados deberı́an ser aproximadamente: β̂0 = −34,6706; β̂1 = 9,1021. Ademas, pro-
bar con LinearRegression de Sklearn 9 para comparar los modelos.

Ejercicio 6.4. Implementar una solución al problema de regresión lineal basada en el algoritmo
iterativo de descenso por el gradiente.
Ayuda: En cada iteración, actualizar los valores de βˆ0 y βˆ1 de la siguiente manera:
new_beta0 = beta0 - learning_rate * beta0_gradient
new_beta1 = beta1 - learning_rate * beta1_gradient
Tener en cuenta que este algoritmo puede tardar en converger.

Ejercicio 6.5. Instalar la herramienta de estadı́stica libre y gratuita R.10 (En los laboratorios ya
está instalada.) Leer la Sección 3.6 del libro de James, Witten, Hastie & Tibshirani 11 y correr los
ejemplos en R.

Ejercicio 6.6. Sobre el dataset ‘Boston’, correr en R una regresión lineal múltiple para predecir el
valor de ‘MEDV’ en base a todos los otros atributos. Usar los p-valores para identificar y eliminar
atributos inservibles, y repetir el proceso. Para cargar el dataset, usar: library (MASS) y ?Boston.

Ejercicio 6.7. ¿Qué pasa si alguna de las variables predictoras es categórica? ¿Cómo se la puede
transformar en una (o más) variables numéricas para usar en la regresión?
9 http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
10 https://www.r-project.org/
11 http://www-bcf.usc.edu/
~gareth/ISL/

7
7. Otros problemas de regresión

Ejercicio 7.1. ¿Cómo se pueden adaptar los algoritmos de clasificación kNN, árboles de decisión
y SVM al problema de regresión?

Ejercicio 7.2. El dataset House Sales in King Country, USA,12 contiene información de inmuebles
tales como: superficies totales, superficies particulares, estado del inmueble, posición geográfi-
ca, etc., y su precio. Experimentar con distintos modelos de regresión múltiple usando cross-
validation, para intentar predecir el valor de la propiedad. ¿Qué métricas se pueden usar para
entender cuán bien funciona el modelo? ¿Alcanza con mirar sólo una métrica? En clasificación re-
currı́amos a la matriz de confusión para tener más información de un resultado particular; ¿cómo
se podrı́a hacer en un modelo de regresión para tener noción de cómo son los tipos de errores?

Ejercicio 7.3. Para problemas de clasificación se pueden usar esquemas de regresión. ¿Cómo se
harı́an los ajustes para pasar de una tarea a la otra? ¿Qué cosas habrı́a que tener en cuenta?

Ejercicio 7.4. El dataset del archivo affairs.csv tiene información de parejas (edad, religión,
hijos, etc.) y una variable categórica affair (0 ó 1) que indica si la persona ha sido infiel o no. Usar
regresión logı́stica en un esquema de cross validation para intentar clasificar la variable affair.
Comparar contra otros algoritmos de clasificación. El archivo Fair1978.pdf contiene un artı́culo
que basó sus resultados en estos datos, ası́ como una descripción de los atributos y sus valores.13

Ejercicio 7.5. Elegir un dataset y entrenar modelos de regresión de polinomios variando el valor
del grado M , de manera de reproducir (aproximadamente) los resultados de las siguientes figu-
ras,14 que ilustran el sobreajuste sobre los datos de entrenamiento y el compromiso entre sesgo y
varianza, respectivamente.

12 https://www.kaggle.com/harlfoxem/housesalesprediction/downloads/housesalesprediction.zip
13 Ray C. Fair, “A Theory of Extramarital Affairs”, Journal of Political Economy, 1978, vol. 86, no. I.
14 Tomadas del Bishop (p.8) y de http://scott.fortmann-roe.com/docs/BiasVariance.html

8
8. Redes Neuronales

Ejercicio 8.1. Construir a mano un perceptrón simple que resuelva el operador lógico AND: dadas
dos variables X1 y X2 , devuelve True o False. En las variables de entrada, interpretar Xi = 1 como
True y Xi = 0 como False. Idem para los operadores OR, NOR y NAND.

Ejercicio 8.2. Demostrar que un perceptrón simple con función de activación sigmoide es equiva-
lente a un modelo de regresión logı́stica.

Para resolver los siguientes ejercicios, usar el playground de TensorFlow disponible en http://
playground.tensorflow.org.

Ejercicio 8.3. Elegir el tercer dataset en el playground, que tiene dos grupos de puntos bien
separados. Experimentar con diferentes configuraciones de capas ocultas, nodos y atributos, y
estudiar el comportamiento de cada parte de la red durante el entrenamiento. Por ejemplo, usar:

un solo atributo (X1 ) y una capa con un nodo;


un solo atributo (X1 ) y dos o más capas con dos o más nodos;
dos atributos (X1 , X2 ) y una sola capa con un nodo; etc.

Ejercicio 8.4. Usando sólo los atributos X1 y X2 , construir una configuración mı́nima (en cantidad
de capas y de nodos por capa) de un perceptrón multicapa que resuelva el operador lógico XOR.
Usar el segundo dataset del playground.

Ejercicio 8.5. Usando sólo los atributos X1 y X2 , construir una perceptrón multicapa que pueda
aprender los otros dos problemas no linealmente separables incluidos en el playground: el cı́rculo
azul rodeado de amarillo (fácil) y la doble espiral (difı́cil).

Ejercicio 8.6. Estudiar cómo impacta en el aprendizaje de los dos ejercicios anteriores la inclusión
de otros atributos (por ejemplo, sin(X1 )), ası́ como la elección de distintas funciones de activación
(lineal, tanh, sigmoid).

Opciones para experimentar en mayor detalle con redes neuronales:


En Python: sklearn.neural network
http://scikit-learn.org/stable/modules/neural_networks_supervised.html

En Matlab (recomendado): Neural Toolbox


https://www.mathworks.com/help/nnet/getting-started-with-neural-network-toolbox.html

9
9. Refuerzos

Ejercicio 9.1. Completar la implementación de gridWorld alu.py (que se descarga de la página de


la materia). Se deben completar las funciones de la clase gridWorld.

possibleActions: Completar esta función, que dado un estado, devuelve una lista de acciones
que pueden tomarse, teniendo en cuenta los márgenes del mundo. Las acciones posibles son:
right, left,up,down y stay.
move: Completar esta función, que dado un estado y un acción, devuelve un estado (una
lista de dos elementos) tras ejecutar dicha accion.

learn: Completar esta función siguiendo lo descripto en la teorı́a, en la diapositiva titulada


“Algoritmo 2: Q-Learning”. Usar como función para elegir qué acción tomar dentro de las
posibles una distrubucion uniforme (random.choice sobre las acciones posibles).

Ejercicio 9.2. Teniendo el ejercicio anterior andando correctamente probar al menos otra polı́ti-
ca de elección de mejor acción (por ejemplo, e-greedy o softmax). Considerar las modificaciones
necesarias en la implementación, por ejemplo temperatura inicial y función de decamiento para
softmax. Comparar el desempeño de la nueva polı́tica con la desarrollada en el ejercicio anterior.

10
10. Aprendizaje no supervisado: Clustering

Ejercicio 10.1. El siguiente código construye un dataset de ejemplo, ejecuta K-Means y grafica
los resultados:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import cluster, datasets
from sklearn.preprocessing import StandardScaler

# crear y normalizar dataset


N = 1500
X, y = datasets.make_blobs(n_samples=N, centers=3, cluster_std=1.0)
X = StandardScaler().fit_transform(X)

# ejecutar k-means con k=2


algorithm = cluster.MiniBatchKMeans(n_clusters=2)
algorithm.fit(X)
y_pred = algorithm.labels_.astype(np.int)

# graficar
colors = np.array([x for x in ’bgrcmykbgrcmykbgrcmykbgrcmyk’])
colors = np.hstack([colors] * 20)
plt.scatter(X[:, 0], X[:, 1], color=colors[y_pred].tolist(), s=10)
plt.show()

1. Experimentar con diferentes valores para cluster_std (desvı́o estándar de las nubes de
puntos) y n_clusters (valor de K en K-Means).
2. Generar datasets con otras formas, como por ejemplo:

datasets.make_circles(n_samples=N, factor=.5, noise=.05)


datasets.make_moons(n_samples=N, noise=.05)

Ejecutar K-means, y también DBSCAN con el comando cluster.DBSCAN(eps=.2).


Experimentar con diferentes valores para noise y eps.
3. Ver más ejemplos en http://scikit-learn.org/stable/auto_examples/cluster/plot_
cluster_comparison.html.

Ejercicio 10.2. Programar K-Means y Clustering Jerárquico Aglomerativo. Comparar cómo fun-
cionan sus implementaciones sobre los datos del ejercicio anterior.

Ejercicio 10.3. ¿Qué tipo de tareas necesitan algoritmos de clustering? Pensar en 3 ejemplos.

11

Vous aimerez peut-être aussi