Curso sobre programacion c# y Visual Studio 2019. En este blog veremos tutoriales para aprender a crear nuestras aplicaciones de consola,aplicaciones web, SQL , Tensorflow y Machine Learning
Hola a todos.Seguimos con nuestro curso dedicado a los patrones de diseño software.Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.
En esta entrada veremos el patrón de diseño Factory, que consiste en utilizar una clase constructora abstracta con unos cuantos métodos definidos y otros abstractos. Es un patrón de diseño creacional y que sirve para construir una jerarquía de clases. En nuestro caso la jerarquía de clase que hemos creado tiene el aspecto que veis en la imagen:
En el siguiente vídeo vemos con un ejemplo como construir esta estructura de clases basándonos en el patrón de diseño factory.
Os dejo el código de las diferentes clases vistas en el vídeo:
*Clase BaseDatosGenerica:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
public abstract class BaseDatosGenerica
{
public abstract string dameCadenaConexion();
}
}
*Clase Oracle:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
class Oracle:BaseDatosGenerica
{
public override string dameCadenaConexion()
{
return "CAdena conexión base de datos Oracle";
}
}
}
*Clase SqlServer
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
class SqlServer:BaseDatosGenerica
{
public override string dameCadenaConexion()
{
return "Cadena conexión base de datos SQlServer";
}
}
}
*Clase MySql
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
class MySql:BaseDatosGenerica
{
public override string dameCadenaConexion()
{
return "Cadena conexión base de datos Mysql";
}
}
}
* Clase Configuracion:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Factory
{
class Configuracion
{
public const int SqlServer = 1;
public const int Oracle = 2;
public const int MySql = 3;
public BaseDatosGenerica CrearConexion(int BaseDatos)
{
BaseDatosGenerica baseDatos = null;
if (BaseDatos == 1)
baseDatos = new SqlServer();
else if (BaseDatos == 2)
baseDatos = new Oracle();
else if (BaseDatos == 3)
baseDatos = new MySql();
else
throw new Exception("Base de datos no soportada");
Hola a todos.Hoy comenzamos un nuevo curso dedicado a los patrones de diseño software.Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.En definitiva un patrón de diseño es una forma reutilizable de resolver un problema común.
Algunos de lo motivos por lo que se usan son los siguientes: ahorran tiempo y nos ayudan a estar seguros de la validez de nuestros código.Además los patrones de diseño establecen un lenguaje común entre todos los miembros del equipo.
Quizás lo mas complicado es elegir que patrón de diseño se adapta mejor para resolver nuestro problema, para ello es necesario conocer qué tipo de problemas soluciona cada uno y descubrir cómo aplicarlo a casos concretos.
Patrones creación: Son los que facilitan la tarea de creación de nuevos objetos, de tal forma que el proceso de creación pueda ser desacoplado de la implementación del resto del sistema.Los patrones creacionales están basados en la encapsulación, ya que nos facilitan la tarea de creación de nuevos objetos encapsulando el proceso.Los que veremos en este curso son:
Factory
Builder
Singleton
Prototype superficial
Prototype deep
Patrones estrucuturales: Son patrones que nos facilitan la modelización de nuestros software especificando la forma en la que unas clases se relacionan con otras:
Adapter
Facade
Proxy
Bridge
Patrones comportamiento:
Memento
Strategy
Iterator
En siguiente vídeo os cuento en consistirá el curso:
Una incorporación es un espacio de dimensiones relativamente bajas al que se pueden trasladar vectores de dimensiones altas. Las incorporaciones permiten llevar a cabo el aprendizaje automático con más facilidad en entradas de gran tamaño.
El filtrado colaborativo es la tarea de realizar predicciones acerca de los intereses de un usuario en función de los intereses de muchos otros usuarios. Por ejemplo,observemos la tarea de recomendación de películas. Imagina que tenemos 1,000,000 usuarios y una lista de las películas que cada uno de ellos ha visto (de un catálogo de 500,000 películas). Nuestro objetivo es recomendar películas a los usuarios. Para resolver este problema, se necesita un método que determine qué películas son similares entre sí. En la imagen vemos como hemos agrupado las películas similares cerca.
Si distribuimos las películas en una incorporación de dos dimensiones, definimos una distancia entre las películas de manera tal que las películas estén cerca entre sí (y por lo tanto se infiere que son similares). En términos más generales, lo que hicimos es asignar estas películas a un espacio de incorporación, donde se describe cada palabra mediante un conjunto de coordenadas en dos dimensiones. Por ejemplo, en este espacio, "Shrek" se asigna a (-1.0, 0.95) y "Bleu" se asigna a (0.65, -0.2).
En general, al aprender una incorporación de d dimensiones, cada película se representa con d números de valores reales y cada uno de ellos proporciona la coordenada en cada dimensión. Los datos categóricos hacen referencia a atributos de entrada que representan uno o más elementos discretos de un conjunto de opciones finito.Se representan de manera más eficaz a través de tensores dispersos, que son tensores con muy pocos elementos distintos de cero. Por ejemplo, si queremos crear un modelo de recomendaciones de películas, podemos asignar un ID único a cada película posible y, luego, representar al usuario como un tensor disperso de las películas que ha mirado, tal como se muestra en la Figura.
Cada fila de la matriz en la Figura 3 corresponde a un usuario y puede ser representado con un tensor disperso, ya que cada usuario solo mira una pequeña fracción de las películas posibles. La última fila corresponde al tensor disperso [1, 3, 999999]
Os dejo el vídeo con la explicación:
Os dejo el código visto en el vídeo:
"""Objetivos:
- En este ejercicio, exploraremos datos dispersos y trabajaremos con incrustaciones utilizando datos de texto de reseñas
de películas (del conjunto de datos de la ACL 2011 IMDB). Estos datos ya han sido procesados en formato tf.Example.
- Convertir datos de cadena de revisión de películas en un vector de características.
- Implementar un modelo lineal de análisis.
- Implementar un modelo neuronal utilizando una incorporación que proyecte datos en dos dimensiones.
- Visualicar la inserción para ver lo que el modelo ha aprendido sobre las relaciones entre las palabras.
"""
#Importemos nuestras dependencias y descarguemos los datos de entrenamiento y prueba
En vídeos anteriores, presentamos modelos de clasificación binaria que podían elegir una de dos opciones posibles, como el caso en el que distinguimos si un correo electrónico dado "es spam" o "no es spam". En este vídeo, investigaremos la clasificación de clases múltiples, que puedes elegir entre posibilidades múltiples. Por ejemplo:
¿Este perro es un beagle, un basset hound o un sabueso?
¿Esta flor es una iris sibirica, hollandica, versicolor o setosa?
Algunos problemas de clases múltiples del mundo real implican elegir entre millones de clases individuales.Por ejemplo, supongamos un modelo de clasificación de clases múltiples que pueda identificar la imagen de lo que fuera.
En la imagen vemos un ejemplo de "uno frente a todos", que es un enfoque que nos proporciona una mane
ra de aprovechar la clasificación binaria. En un problema de clasificación dado con N soluciones posibles, una solución de uno frente a todos consiste en N clasificadores binarios independientes.
Otro posible enfoque es utilizar Softmax. La regresión logística genera un decimal entre 0 y 1.0. Por ejemplo, si un clasificador de correo electrónico tiene un resultado de regresión logística de 0.8, hay un 80% de posibilidad de que un correo electrónico sea spam y un 20% de que no lo sea. La suma de las probabilidades de que un correo electrónico sea spam o no es 1.0.
Softmax lleva esta idea al plano de las clases múltiples. Es decir, softmax asigna probabilidades decimales a cada clase en un caso de clases múltiples. Esas probabilidades decimales deben sumar 1.0. Esta restricción adicional permite que el entrenamiento converja más rápido.
Os dejo un vídeo donde os cuento todo esto:
Os dejo el código visto en el vídeo:
#Capacitar a un modelo lineal y una red neuronal para clasificar los dígitos escritos a mano.
"""
Primero, descargamos el conjunto de datos, importemos TensorFlow y otras utilidades, y carguemos los datos en un dataframe. """
En este capítulo veremos como entrenar una red neuronal.Cabe destacar que la propagación inversa es el algoritmo de entrenamiento más común en las redes neuronales. Permite que el descenso de gradientes sea factible para las redes neuronales de varias capas.En nuestro caso TensorFlow realiza la propagación inversa automáticamente, de manera que no necesitamos conocimientos específicos del algoritmo.
En el siguiente vídeo vemos un ejemplo en el que tratamos de mejorar el rendimiento de la red neuronal que entrenamos en el vídeo anterior:
Os dejo el código visto en el vídeo:
#Objetivo: mejorar el rendimiento de una red neuronal mediante la normalización de las #funciones y la aplicación de varios algoritmos de optimización
#Primero cargamos los datoscon los que vamos a trabajar.Visto en videos anteriores
En este capítulo veremos una introducción a las redes neuronales. Las redes neuronales son una versión mucho más sofisticada de las combinaciones de atributos. Básicamente, las redes neuronales aprenden las combinaciones de atributos correspondientes que necesitas.
Supongamos que nos encontramos con un problema de clasificación no lineal, es decir no se puede predecir con exactitud una etiqueta con un modelo de forma b+w1x1+w2x2. Es decir, la "superficie de decisión" no es una línea.
En el siguiente vídeo os cuento todo esto y además veremos un ejemplo de código: