Soluciones de programación Haskell desde los primeros principios
Una de las «mejores prácticas» más defendidas en programación es el principio DRY: No te repitas. Se pueden utilizar muchas técnicas para hacer cumplir este principio: encapsulación, parametrización, inversión de control, y muchas más. Una de estas técnicas es la abstracción y una de las principales diferencias entre la programación funcional (PF) y la programación orientada a objetos (POO) es la forma en que se aplica la abstracción. Una práctica común en la POO es limitar la abstracción al mínimo estrictamente útil para el problema en cuestión. En la programación orientada a objetos, la abstracción prematura se considera a menudo un fallo, al igual que la optimización prematura.
En FP, por otro lado, la abstracción es generalmente empujada tan lejos como sea posible. Cada problema se divide en una serie de funciones lo más simples posible, que luego se componen para construir la solución del problema. La identificación de estas abstracciones suele ser la parte más importante de la resolución del problema. De hecho, los programadores de FP suelen pasar más tiempo tratando de encontrar qué problema deben resolver que resolviéndolo. Y por supuesto, generalmente parece que estas funciones son las mismas de un problema a otro. Sólo la forma en que se componen es diferente. Esta es la razón por la que la abstracción es una de las técnicas más valoradas por los programadores de FP.
Curso de fp aplicado
Con el fin de comparar los resultados experimentales de todos los trabajos presentados en este estudio, se utilizará un ratio \(\rho\) (Ecuación 1) [23] para indicar el nivel máximo de desequilibrio entre clases. \(C_{i}\) es un conjunto de ejemplos en la clase i, y \(max_i{|C_{i}|\}\) y \(min_i{|C_{i}|\}\) devuelven el tamaño máximo y mínimo de la clase sobre todas las clases i, respectivamente. Por ejemplo, si la clase más grande de un conjunto de datos tiene 100 muestras y su clase más pequeña tiene 10 muestras, entonces los datos tienen una proporción de desequilibrio de \ (\rho = 10\). Dado que el número real de muestras puede resultar más importante que la proporción, la Tabla 18 también incluye los tamaños de clase máximo y mínimo para todos los experimentos de este estudio.Métricas de rendimientoLa matriz de confusión de la Tabla 1 resume los resultados de la clasificación binaria. Los errores FP y FN corresponden a errores de tipo I y II, respectivamente. Todas las métricas de rendimiento enumeradas en esta sección pueden derivarse de la matriz de confusión.Tabla 1 Matriz de confusiónTabla de tamaño completo
La tabla 4 incluye los resultados del entrenamiento de la CNN con datos equilibrados que se generaron mediante ROS. Muestra que el sobremuestreo se comporta significativamente mejor que los resultados de referencia de la Tabla 3. La Dist. 1 se excluye de la Tabla 4 porque ya está equilibrada, es decir, ROS no es aplicable. En este experimento, ROS mejoró los resultados de clasificación de todas las distribuciones. La Dist. 5 y la Dist. 9 registraron los mayores aumentos de rendimiento, pasando de puntuaciones F1 totales de referencia de 0,10 a 0,73 y 0,72, respectivamente. Los resultados de clasificación de ROS para las distribuciones Dist. 2-Dist. 11 son comparables a los resultados obtenidos por la CNN de referencia en la Dist. 1, lo que sugiere que ROS ha restaurado completamente el rendimiento del modelo.Tabla 3 Clasificación desequilibrada de CIFAR-10 [79]Tabla completa
Escribirte un haskell
Me estoy introduciendo en la Programación Funcional [FP] (usando Scala). Una cosa que se desprende de mis aprendizajes iniciales es que la PF depende en gran medida de la recursividad. Y también parece que, en FPs puros la única manera de hacer cosas iterativas es escribiendo funciones recursivas.
¿Puede alguien aclararme por qué la recursión es tan importante para el paradigma de la programación funcional? ¿Hay algo en las especificaciones de los lenguajes de programación funcional que se «viola» si hacemos cosas iterativas? Si es así, también me gustaría saberlo.
PS: Tenga en cuenta que soy un novato en la programación funcional, así que siéntase libre de señalarme los recursos existentes si explican/responden a mi pregunta. También entiendo que Scala en particular proporciona soporte para hacer cosas iterativas también.
La programación funcional pura significa programar sin efectos secundarios. Lo que significa que, si escribes un bucle por ejemplo, el cuerpo de tu bucle no puede producir efectos secundarios. Así, si quieres que tu bucle haga algo, tiene que reutilizar el resultado de la iteración anterior y producir algo para la siguiente iteración. Así, el cuerpo de tu bucle es una función, tomando como parámetro el resultado de la ejecución anterior y llamándose a sí mismo para la siguiente iteración con su propio resultado. Esto no tiene una gran ventaja sobre escribir directamente una función recursiva para el bucle.
Bitemyapp
Este tutorial muestra cómo clasificar un conjunto de datos muy desequilibrado en el que el número de ejemplos de una clase supera ampliamente al de otra. Se trabajará con el conjunto de datos de detección de fraudes con tarjetas de crédito alojado en Kaggle. El objetivo es detectar apenas 492 transacciones fraudulentas de un total de 284.807 transacciones. Utilizarás Keras para definir el modelo y los pesos de las clases para ayudar al modelo a aprender de los datos desequilibrados. .
Los datos en bruto tienen algunos problemas. En primer lugar, las columnas Time y Amount son demasiado variables para utilizarlas directamente. Elimina la columna Time (ya que no está claro qué significa) y toma el logaritmo de la columna Amount para reducir su rango.
Divida el conjunto de datos en conjuntos de entrenamiento, validación y prueba. El conjunto de validación se utiliza durante el ajuste del modelo para evaluar la pérdida y cualquier métrica, sin embargo el modelo no se ajusta con estos datos. El conjunto de prueba no se utiliza en absoluto durante la fase de entrenamiento y sólo se utiliza al final para evaluar la generalización del modelo a los nuevos datos. Esto es especialmente importante con los conjuntos de datos desequilibrados, en los que el sobreajuste es una preocupación significativa por la falta de datos de entrenamiento.