Pop

Curso Tensorflow con Anaconda -7. Ejemplo predicción precios (2)

7. Ejemplo predicción precios (2)

  • En esta entrada del blog vamos mejorar el código visto en el vídeo anterior. La idea es compactar el código en una única función a la que podremos llamar para entrenar el modelo. Para mejorar nuestro modelo haremos entrenamientos ajustando los hiperparámetros.
  • Los hiperparámetros son valores definidos antes del entrenamiento ,es decir ,los parámetros de entrada de la función que veremos en este capítulo. Son diferentes según los algoritmos y puede estar condicionados entre si.  Los hiperparámetrosse eligen mediante el método de prueba y error.
  • Muchos de los ejercicios de codificación contienen los siguientes hiperparámetros:
  1.  pasos, que es el número total de iteraciones de entrenamiento. Un paso calcula la pérdida de un lote y usa ese valor para modificar los pesos del modelo una vez.
  2.  tamaño del lote, que es el número de ejemplos (elegidos de forma aleatoria) para un solo paso. La  formula aplicada es: total ejemplos entrenados = pasos * tamaño del lote.
  3. También se suelen utilizar los periodos  que controlan el nivel de detalle de los informes. Por ejemplo, si la variable de periodos está ajustada en 7 y el hiperparámetro de paso está ajustado en 70, el ejercicio dará el resultado del valor de la pérdida cada 10 pasos (o 7 veces). 
  • Os dejo el vídeo donde vemos como se hace esta función:
  • Os dejo el código visto en el vídeo:
def train_model(learning_rate, steps, batch_size, input_feature="total_rooms"):
  """Función para entrenar un modelo de regresión lineal de una característica
  Args:
    learning_rate: Float con la tasa de aprendizaje.
    steps: El número de pasos de un entrenamiento.Debe ser >0
    batch_size: Tamaño del lote.Debe ser >0
    input_feature: Cadena que especifica la característica de entrada
  """
  
  periods = 10
  steps_per_period = steps / periods

  my_feature = input_feature
  my_feature_data = california_housing_dataframe[[my_feature]]
  my_label = "median_house_value"
  targets = california_housing_dataframe[my_label]

  # Creamos columna de caraterísticas
  feature_columns = [tf.feature_column.numeric_column(my_feature)]
  
  # Creamos función de entrada
  training_input_fn = lambda:my_input_fn(my_feature_data, targets, batch_size=batch_size)
  prediction_input_fn = lambda: my_input_fn(my_feature_data, targets, num_epochs=1, shuffle=False)
  
  # Creamos el objeto linear_regressor
  my_optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)
  my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)
  linear_regressor = tf.estimator.LinearRegressor(
      feature_columns=feature_columns,
      optimizer=my_optimizer
  )

  # Traza el estado de la línea de nuestro modelo en cada período
  plt.figure(figsize=(15, 6))
  plt.subplot(1, 2, 1)
  plt.title("Linea aprendida en este periodo")
  plt.ylabel(my_label)
  plt.xlabel(my_feature)
  sample = california_housing_dataframe.sample(n=300)
  plt.scatter(sample[my_feature], sample[my_label])
  colors = [cm.coolwarm(x) for x in np.linspace(-1, 1, periods)]

  # Entrenamos el modelo dentro de un bucle para poder evaluar las métricas de perdida
  print("Entrenando...")
  print("Desviación de la raíz cuadrada media en los datos de entrenamiento:")
  root_mean_squared_errors = []
  for period in range (0, periods):
    # Entrenamos el modelo desde el periodo anterior
    linear_regressor.train(
        input_fn=training_input_fn,
        steps=steps_per_period
    )
    # calcular predicciones.
    predictions = linear_regressor.predict(input_fn=prediction_input_fn)
    predictions = np.array([item['predictions'][0] for item in predictions])
    
    # calcular pérdida..
    root_mean_squared_error = math.sqrt(
        metrics.mean_squared_error(predictions, targets))
    # Mostramos la pérdida actual
    print("  period %02d : %0.2f" % (period, root_mean_squared_error))
  
    root_mean_squared_errors.append(root_mean_squared_error)
    # Rastreamos pesos y sesgos a lo largo del tiempo
    y_extents = np.array([0, sample[my_label].max()])
    
    weight = linear_regressor.get_variable_value('linear/linear_model/%s/weights' % input_feature)[0]
    bias = linear_regressor.get_variable_value('linear/linear_model/bias_weights')

    x_extents = (y_extents - bias) / weight
    x_extents = np.maximum(np.minimum(x_extents,
                                      sample[my_feature].max()),
                           sample[my_feature].min())
    y_extents = weight * x_extents + bias
    plt.plot(x_extents, y_extents, color=colors[period]) 
  print("Model training finished.")

  # Mostramos el gráfico de perdida por periodos
  plt.subplot(1, 2, 2)
  plt.ylabel('RMSE')
  plt.xlabel('Periodos')
  plt.title("RMSE vs. Periodos")
  plt.tight_layout()
  plt.plot(root_mean_squared_errors)

  # Mostramos datos
  calibration_data = pd.DataFrame()
  calibration_data["predictions"] = pd.Series(predictions)
  calibration_data["targets"] = pd.Series(targets)
  display.display(calibration_data.describe())

  print("Final RMSE de los datos entrenados: %0.2f" % root_mean_squared_error)
    
train_model(
    learning_rate=0.00002,
    steps=500,
    batch_size=5
)

Curso Tensorflow con Anaconda - 6. Ejemplo predicción precios (1)

6. Ejemplo predicción precios (1)

  • Una vez que hemos visto un ejemplo de uso de la API Pandas en la anterior entrada del blog. En esta ocasión vamos a empezar a usar la librería Tensorflow. El objeto de este ejemplo es aprender los conceptos fundamentales de TensorFlow. Usaremos la clase LinearRegressor en  para predecir el precio promedio de la vivienda, basado en una característica de entrada.
  • En el vídeo vemos como predecir el precio de la vivienda en california en función a unos datos de entrada.
  • Os dejo el código visto en el vídeo:
from __future__ import print_function

#Importamos las librerias necesarias para este ejemplo
import math
from IPython import display
from matplotlib import cm
from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
from sklearn import metrics
import tensorflow as tf
from tensorflow.python.data import Dataset

#preparamos los mensajes de registro para la depuración
tf.logging.set_verbosity(tf.logging.ERROR)
pd.options.display.max_rows = 10
pd.options.display.float_format = '{:.1f}'.format

#cargamos el conjunto de datos con el que trabajaremos.Para más detalles ver el vídeo anterior.
california_housing_dataframe = pd.read_csv("https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv", sep=",")

#Haremos una distribución aleatoria de los datos y escalaremos median_house_value para estar en #unidades de miles
#para que pueda aprenderse un poco más fácilmente con las tasas de aprendizaje en un rango que #usualmente usamos.
california_housing_dataframe = california_housing_dataframe.reindex(
np.random.permutation(california_housing_dataframe.index))
california_housing_dataframe["median_house_value"] /= 1000.0
california_housing_dataframe
california_housing_dataframe.describe()

# Como el objetivo o target es predecir el valor medio de la vivienda utilizaremos como característica #de  entrada el número de habitaciones. median_house_value es nuestra etiqueta y total_rooms es #nuestra característca de entrada.
my_feature = california_housing_dataframe[["total_rooms"]]
feature_columns = [tf.feature_column.numeric_column("total_rooms")]
targets = california_housing_dataframe["median_house_value"]

# Configuramos la interfaz LinearRegressor de la API  de tensorflow Estimator
# https://www.tensorflow.org/api_docs/python/tf/estimator/LinearRegressor
# usamosremos el método GradientDescentOptimizer para entrenar al modelo
my_optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.0000001)
my_optimizer = tf.contrib.estimator.clip_gradients_by_norm(my_optimizer, 5.0)

# configuramos modelo de regresión lineal con nuestra columna de característica y el optimizador
linear_regressor = tf.estimator.LinearRegressor(feature_columns=feature_columns,optimizer=my_optimizer)

#función que utilizaremos para trata los datos de entrada
def my_input_fn(features, targets, batch_size=1, shuffle=True, num_epochs=None):
    """Entrena un modelo de regresión lineal de una característica.
    Parametros de entrada: 
    features: DataFrame de características
      targets:  DataFrame de objetivos
      batch_size: Tamaño de los lotes a pasar al modelo.
      shuffle: Verdadero o falso mezclar los datos 
      num_epochs:Número de iteracciones. None = se repite infinitamanete
    Returns:
      Tupla de (características, etiquetas) para el siguiente lote de datos
    """
  
    # Convertimos en un dict de arrays numpy.
    features = {key:np.array(value) for key,value in dict(features).items()}                                           
    # Lo colocamos como un objeto Dataset de tensorflow,damos un tamaño a cada lote y asignamos el #numero de iteraciones
    ds = Dataset.from_tensor_slices((features,targets))
    ds = ds.batch(batch_size).repeat(num_epochs)
    
    if shuffle:
      ds = ds.shuffle(buffer_size=10000)
    
    # Devolevemos el nuevo lote datos
    features, labels = ds.make_one_shot_iterator().get_next()
    return features, labels

#ENTRENAMIENTO DEL MODELO
#parar empezar a entrenar al modelo llamamos a la función que acabamos de crear
_ = linear_regressor.train(
    input_fn = lambda:my_input_fn(my_feature, targets),
    steps=100
)

#EVALUACIÖN DEL MODELO
# Creamos una función de entrada para nuestras nuestras predicciones
prediction_input_fn =lambda: my_input_fn(my_feature, targets, num_epochs=1, shuffle=False)

# llamamos al método predict que se encargar de hacer las predicciones
predictions = linear_regressor.predict(input_fn=prediction_input_fn)

# Pasamos predicciones a array NumPy para poder ahcer los calculos
predictions = np.array([item['predictions'][0] for item in predictions])

# Mostramos por pantalla el error cuadratico medio y su raiz que es el valor que utilizaremos para #evaluar
mean_squared_error = metrics.mean_squared_error(predictions, targets)
root_mean_squared_error = math.sqrt(mean_squared_error)
print("Error cuadrático medio de los datos entrenados: %0.3f" % mean_squared_error)
print("Raiz Error cuadrático medio de los datos entrenados %0.3f" % root_mean_squared_error)

#para ver si el modelo es bueno o malo comparamos la raíz del error cuadrático medio con el máximo #y minimo de nuestros
#targets y los mostramos por pantalla
min_house_value = california_housing_dataframe["median_house_value"].min()
max_house_value = california_housing_dataframe["median_house_value"].max()
min_max_difference = max_house_value - min_house_value

print("Valor medio de la casa mínimo: %0.3f" % min_house_value)
print("Valor medio de la casa máximo: %0.3f" % max_house_value)
print("Diferencia entre el Min y el Max: %0.3f" % min_max_difference)
print("Raíz del error cuadrático medio: %0.3f" % root_mean_squared_error)

#Ahora el objetivo es reducir el valor del error cuadrático medio. Para ello evaluamos los #resultados utilizando el objeto
#DataFrame y sus metodos  vistos en el capítulo anterior
calibration_data = pd.DataFrame()
calibration_data["predictions"] = pd.Series(predictions)
calibration_data["targets"] = pd.Series(targets)
calibration_data.describe()

# Ahora vamos a mostrar los datos en un gráfica de regresión lineal como vimos el principio del #curso
ejemplo = california_housing_dataframe.sample(n=1000)
# Obtengo los valores máximo y minimo de la columna  total_rooms.
x_0 = ejemplo["total_rooms"].min()
x_1 = ejemplo["total_rooms"].max()

# Retrieve the final weight and bias generated during training.
weight = linear_regressor.get_variable_value('linear/linear_model/total_rooms/weights')[0]
bias = linear_regressor.get_variable_value('linear/linear_model/bias_weights')

# obteneemos el peso y sesgo generado durante el entrenamiento (y =mx +b) 
y_0 = weight * x_0 + bias 
y_1 = weight * x_1 + bias

# Pintamos la linea de regresion con el metodo plot de la api pyplot
plt.plot([x_0, x_1], [y_0, y_1], c='r')

# nombre ejes grafica
plt.ylabel("valor medio casa")
plt.xlabel("total habitaciones")

# Trazamos la gráfica de dispersión y mostramos por pantalla
plt.scatter(ejemplo["total_rooms"], ejemplo["median_house_value"])
plt.show()

Curso Tensorflow con Anaconda - 5.Ejemplo de uso de la API Pandas

5.Ejemplo de uso de la API Pandas

  • Esta entrada la vamos a dedicar a conocer un poco mejora Pandas, que  es una API de análisis de datos orientada a columnas. Es una gran herramienta para manejar y analizar los datos de entrada,  y muchos marcos de machine learning admiten las estructuras de datos panda como entradas. 
  • En el vídeo podemos ver un ejemplo de uso de esta API:
  • Os dejo el código visto en el vídeo:
from __future__ import print_function

#importo las librerias necesarias para los ejemplos
import pandas as pd
import numpy as np

#imprime vesión de pandas por pantalla
pd.__version__


"""
Las estructuras de datos primarias en pandas se implementan con dos clases:

DataFrame-->Tabla de datos relacionales, con filas y columnas.
Serie --> una sola columna.

Un DataFrame contiene una o más series y un nombre para cada serie.
El marco de datos es una abstracción comúnmente utilizada para la manipulación de datos.
Una forma de crear una serie es construir un objeto de serie. Por ejemplo:"""

pd.Series(['San Francisco', 'San Jose', 'Sacramento'])
city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])
population = pd.Series([852469, 1015785, 485199])
pd.DataFrame({ 'City name': city_names, 'Population': population })

#importo las librerias necesarias para los ejemplos
import pandas as pd
import numpy as np

#cargamos dataframe via csv
california_housing_dataframe = pd.read_csv("https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv", sep=",")
california_housing_dataframe.describe()
california_housing_dataframe.head()
california_housing_dataframe.hist('housing_median_age')

cities = pd.DataFrame({ 'City name': city_names, 'Population': population })
cities['City name']
cities['City name'][1]


cities['Area square miles'] = pd.Series([46.87, 176.53, 97.92])
cities['Population density'] = cities['Population'] / cities['Area square miles']

#solucion problema 1
cities['Is wide and has saint name'] = (cities['Area square miles'] > 50) & cities['City name'].apply(lambda name: name.startswith('San'))
cities 

Curso Tensorflow con Anaconda - 4.Conceptos básicos.Reducción de la pérdida

4.Conceptos básicos.Reducción de la pérdida

  • En el vídeo anterior vimos que entrenando a los modelos se producen perdida, por lo tanto necesitamos una buena forma de reducirla.  El enfoque iterativo es un método muy utilizado para reducir la pérdida.En la siguiente esquema podemos verlo:


  • El modelo tomará uno o más atributos como entrada y devuelve una predicción  como resultado. Suponemos un modelo que toma un atributo y devuelve una predicción y'=b+w1x1.
  • La parte de "Cálculo de pérdida" del diagrama es la función de pérdida que usará el modelo. Supongamos que usamos la función de pérdida al cuadrado en la parte de "Actualizar parámetros" del diagrama.Aquí, el sistema de aprendizaje automático examina el valor de la función de pérdida y genera valores nuevos.El aprendizaje continúa iterando hasta que el algoritmo descubre los parámetros del modelo con la pérdida más baja posible.
  •  En general, iteras hasta que la pérdida general deja de cambiar o, al menos, cambia muy lentamente. Cuando eso ocurre, decimos que el modelo ha convergido.

  • Vamos a sustituir el cuadro verde que cuadro verde que "actualiza los parámetros" por algo más concreto. Para el tipo de problemas de regresión que hemos estado examinando, la representación resultante de pérdida siempre será convexa. La representación siempre tendrá forma de tazón, como la que veis en la siguiente imagen donde tendremos que buscar el punto de convergencia.


  • Un mecanismo  útil, muy popular en el aprendizaje automático, es el  descenso de gradientes. La primera etapa en el descenso de gradientes es elegir un valor de inicio (un punto de partida) para w1. Elegimos un punto de partida levemente mayor que 0. Luego, el algoritmo de descenso de gradientes calcula la gradiente de la curva de pérdida en el punto de partida tomando un paso en dirección de la gradiente negativa para reducir la pérdida lo más rápido posible. Vamos repitiendo el proceso hasta alcanzar el mínimo.

  • Os dejo esta explicación en vídeo.En el siguiente capítulo empezamos con el código:


Curso Tensorflow con Anaconda - 3.Regresión lineal y un ejemplo

3.Regresión lineal y un ejemplo

  •  En esta entrada del blog veremos la regresión lineal.En la siguiente gráfica podéis ver una relación lineal que representa la relación entre la temperatura y la frecuencia con que cantan unos grillos. La línea que vemos trazada en la gráfica cumple la fórmula Y=Mx +B donde:
          - Y es la temperatura en grados centígrados, correspondiente al valor que intentamos predecir.
          - M es la pendiente de la línea.
          - x es la cantidad de cantos por minuto, correspondiente al valor de nuestro atributo de entrada.
          - B es la intersección en y.
  • En función de por donde pasa la linea de regresión tendremos una perdida mayor ó menor:


  • Para una definición más formal de lo que es la regresión lineal os dejo el siguiente enlace: https://es.wikipedia.org/wiki/Regresi%C3%B3n_lineal . 
  • En el vídeo os cuento con más detalle lo visto en estas dos imágenes y os muestro un poco de código escrito en python.
.
  • Os dejo el código visto en el vídeo:
import tensorflow as tf
enterosVector = tf.constant([1,2,3])
with tf.Session() as s:
print(s.run(enterosVector))
import tensorflow as tf
matriz = tf.constant([[7,5,4],[1,2,3]])
with tf.Session() as s:
print(s.run(matriz))
import tensorflow as tf
matrizCadenas = tf.constant([ ["Hola ","me ","llamo "],["pepe "," el "," programador"] ],tf.string)
with tf.Session() as s:
print(s.run(matrizCadenas))

Curso Tensorflow con Anaconda - 2.Conceptos básicos aprendizaje automático y ejemplo

2.Conceptos básicos  aprendizaje automático y ejemplo

  •  Antes de meternos de lleno con la programación vamos a ver un poco de terminología básica referente al aprendizaje automático. Una posible definición es: Los sistemas de machine-learning aprenden cómo combinar entradas para producir predicciones útiles sobre datos nunca  antes vistos.
  • Os pongo algunos conceptos de terminología de machine learning
            - Etiquetas:Una etiqueta es el valor que estamos prediciendo, es decir, la variable.Por ejemplo:La etiqueta podría ser el precio futuro del trigo
      - Atributos: Un atributo es una variable de entrada, es decir, la variable x en la regresión lineal simple. Un proyecto de aprendizaje automático simple podría  usar un solo atributo, mientras que otro más sofisticado podría usar millones de atributos, especificados como: {x1,x2,....xn}. Por ejemplo en un un detector de spam, los atributos podrían incluir los siguientes:

                              - palabras en el texto del correo electrónico
        - dirección del remitente
          - hora del día a la que se envió
            - presencia de la frase "un truco increíble" en el correo electrónico
              -Ejemplos: Un ejemplo es una instancia de datos en particular. Los ejemplos puede ser ejemplos etiquetados o ejemplos sin etiqueta.Los ejemplos etiquetados se usan para entrenar el modelo. En nuestro ejemplo del detector de spam,  los ejemplos etiquetados serían los correos electrónicos individuales que los usuarios marcaron explícitamente como "es spam" o "no es spam".Un ejemplo sin etiqueta contiene atributos, pero no la etiqueta.En el detector de spam, los ejemplos sin etiqueta son correos electrónicos nuevos que las personas todavía no han etiquetado.
                - Modelos: Un modelo define la relación entre los atributos y la etiqueta.Dos fases:
                  A)Entrenamiento significa crear o aprender el modelo. Es decir, le muestras ejemplos etiquetados al modelo y permites que este aprenda  gradualmente las relaciones entre los atributos y la etiqueta.

                                  B) Inferencia significa aplicar el modelo entrenado a ejemplos sin etiqueta.
                    Por ejemplo, un modelo de detección de spam podría asociar de manera muy definida determinados atributos con "es spam"
                                   - Regresión o clasificación: Un modelo de regresión predice valores continuos, por ejemplo cuál es la probabilidad de que un usuario haga clic en un  anuncio. Un modelo de clasificación predice valores discretos por ejemplo distinguir si una imagen es de un perro, un gato o un hámster.
                      • En el vídeo os cuento toda esta teoría y ademas vemos otro ejemplo de código:
                      E
                      • Os dejo el código visto en el vídeo:
                      import tensorflow as tf

                              #escalar
                      entero = tf.Variable(5,tf.int32)
                      puntoflotante = tf.Variable(4.989787328,tf.float32)

                      #vector
                      cadena = tf.string_join(["Me ", " llamo " , " Bartolo"])
                      vectorEnteros = tf.Variable([1,2,3,4,5],tf.int16);
                      puntoflotante = tf.Variable([4.989787328,3.14,2.9833],tf.float32)

                      #Matrices al menos 2 dimensiones
                      matrizEnteros = tf.Variable([ [7,5,4],[1,2,3] ],tf.int32) 
                      matrizfloat = tf.Variable([ [1.1,1.2,1.3],[1.1,1.2,1.3] ],tf.float32) 
                      matrizString = tf.Variable([ ["Hola ","me ","llamo "],["pepe "," el "," programador"] ],tf.string) 

                      Curso Tensorflow con Anaconda - 1.Introducción e instalación del entorno

                      1.Introducción e instalación del entorno

                      • En el curso haremos uso de TensorFlow que es una biblioteca de código abierto para aprendizaje automático desarrollado por Google para satisfacer necesidades en sus sistemas. Con  TensorFlow , los chicos de google, son capaces de construir y entrenar redes neuronales para detectar y descifrar patrones análogos al aprendizaje y razonamiento usados por los humano.
                      • En este primer capítulo vamos a preparar nuestro entorno de trabajo.Para ello utilizaremos Anaconda donde programaremos en Phyton (va de serpientes la cosa jeje) .Desde el siguiente enlace podéis descargar el instalador que más se adecue a vuestro sistema: https://www.anaconda.com/download/
                      • En el vídeo podéis ver paso a paso la instalación y configuración del entrono de trabajo para hacer nuestro primer programa:

                      • Después de realizar correctamente la instalación y configuración,como hemos visto en el vídeo, os dejo el código que he utilizado para comprobar que efectivamente ya tenemos nuestro nuevo entrono de trabajo listo:
                      import tensorflow as tf
                      vector =tf.constant([1,45,78])
                      with tf.Session() as s:
                      print(s.run(vector))

                      Curso HTML5. Novedades - 11 Geolocalización

                      11. Curso HTML5. Novedades.  Geolocalización

                      • Vamos a finalizar con nuestro curso de html . Después de ver en la entrada anterior las etiquetas vídeo y canvas. En este capítulo cerraremos nuestro curso hablando sobre la geolocalización.
                      • Con esta nueva API podemos obtener la posición y los cambios producidos en tiempo real, de los visitantes de nuestra página. Sin embargo dado que ésto puede comprometer la privacidad del usuario, éste debe de dar siempre su permiso para poder obtenerla.
                      • Aquí os dejo un vídeo con ejemplos de uso de esta API:
                      • Os dejo también el código html visto en el vídeo:

                      <!DOCTYPE html>
                      <html>
                      <head>
                          <meta charset="utf-8" />
                          <title>Pruebas</title>
                          <link href="StyleSheet1.css" rel="stylesheet" />
                          <script type="text/javascript">
                              function dibuja() {
                                  var c = document.getElementById('myCanvas');
                                  var cxt = c.getContext("2d");
                                  /*cxt.fillStyle = "#FF0000";
                                  cxt.beginPath();
                                  cxt.arc(70, 18, 15, 0, Math.PI * 2, true);
                                  cxt.closePath();
                                  cxt.fill();

                                  cxt.moveTo(10, 10);
                                  cxt.lineTo(150, 150);
                                  cxt.lineTo(10, 50);
                                  cxt.stroke();*/

                                  var grd = cxt.createLinearGradient(0, 0, 175, 50);
                                  grd.addColorStop(0,'#FF0000');
                                  grd.addColorStop(1,'#00FF00');
                                  cxt.fillStyle = grd;
                                  cxt.fillRect(0,0,175,50);

                              }

                          
                      function getLocation() {
                        if (navigator.geolocation) {
                          navigator.geolocation.getCurrentPosition(showPosition);
                        } else {
                          x.innerHTML = "Geolocation is not supported by this browser.";
                        }
                      }

                      function showPosition(position) {
                      alert( "Latitud: " + position.coords.latitude + 
                        " Longitud: " + position.coords.longitude); 
                      }

                           

                                  
                          </script>
                      </head>
                      <body>
                          <form >
                              <article>
                                  <header>
                                      <h1>Mi primera página html</h1>
                                  </header>
                              </article>
                              <nav>
                                  <ul>
                                      <li><a href="#">Uno</a></li>
                                      <li><a href="#">Dos</a></li>
                                      <li><a href="#">Tres</a></li>
                                      <li><a href="#">Cuatro</a></li>
                                  </ul>
                              </nav>
                              <article class="pagina">
                                  <section class="contenedor">
                                      <br />
                                      <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIIrOH9SJeXDSEeOFtMxez5Zfnozh9J3l27GClLeYM0LZSaUFN1zCiN3AG604Yxm03evhidS9gxy9bkM9TtOrgoBP1yPbk6CFIb6v8oiqpxWOMVcbEc-h66TLgHrRYXSZ0ZxPhSdtb0A/s640/Basedatosnba.png" />
                                      <figcaption><mark> diseño de BBDD para web Scrapping</mark></figcaption>
                                  </section>
                                  <aside>
                                    
                                          <input type="search" placeholder="Busqueda" />
                                          <input type="email" placeholder="email" />
                                          <input type="url" placeholder="url"  />
                                          <input type="tel" placeholder="telefono" /><br />
                                          <input type="number" placeholder="numero" min="0" max="10" />
                                          <input type="range" name="nunmero" id="numero"  min="0" max="100" step="25" /> <br />
                                          <input type="date" name="fecha" id="fecha"   />
                                          <input type="week" name="semana" id="semana"  />
                                          <input type="month" name="mes" id="mes" /> <br /><br />
                                          <input type="time" name="hora" id="hora" checked />
                                          <input type="datetime" name="fechahora" id="fechahora"  />
                                          <input type="color" name="micolor" id="micolor"  /><br /><br />
                                          <progress value="20" max="100" >60%</progress>
                                          <meter min="0" max="100" value="75" ></meter>
                                          <audio controls="controls" class="audio">
                                              <source src="Rock_Intro_4.mp3" type="audiompeg"  />
                                          </audio><br /><br />
                                          <video controls="controls" height="300" width="300"  muted>
                                              <source src="Suscribete.mp4" type="video/mp4" />
                                          </video><br />
                                          <canvas id="myCanvas" >

                                          </canvas>
                                          <input type="submit" value="Enviar" onclick="getLocation();" />
                                     
                                  </aside>
                              </article>
                              <article class="pagina">
                                  <section class="contenedor">
                                      <br />
                                      <mark>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</mark> <br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                  </section>
                                  <aside>
                                      <p>YYYYYYYYYYYYYYYy</p>
                                  </aside>
                              </article>
                              <article>
                                  <footer>
                                      <ul>
                                          <li><a href="#">Derechos de uso</a></li>
                                          <li><a href="#">Copyright</a></li>
                                      </ul>
                                  </footer>
                              </article>
                          </form>
                      </body>
                      </html>

                      Curso HTML5. Novedades - 10 Tags:Canvas(2)

                      10. Curso HTML5. Novedades.  Tags: Canvas(2)

                      • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior las etiquetas video y canvas. En este capítulo profundizaremos en el uso de la etiqueta canvas.
                      • Como ya avanzamos en la entrada anterior  la etiqueta canvas consiste en una región definida en el código HTML con atributos de altura y ancho. Utilizando JavaScript se puede acceder a la zona a través de un conjunto completo de funciones, permitiendo así que los gráficos sean generados dinámicamente. 
                      • Canvas se apoya en las versiones actuales de Mozilla Firefox, Google Chrome, Internet Explorer, Safari y Opera. Las versiones anteriores de Internet Explorer, como la versión 8 y anteriores no son compatibles.
                      • Aquí os dejo un vídeo con ejemplos de uso de estos controles:
                      • Os dejo también el código html visto en el vídeo:
                      <!DOCTYPE html>
                      <html>
                      <head>
                          <meta charset="utf-8" />
                          <title>Pruebas</title>
                          <link href="StyleSheet1.css" rel="stylesheet" />
                          <script type="text/javascript">
                              function dibuja() {
                                  var c = document.getElementById('myCanvas');
                                  var cxt = c.getContext("2d");
                                  /*cxt.fillStyle = "#FF0000";
                                  cxt.beginPath();
                                  cxt.arc(70, 18, 15, 0, Math.PI * 2, true);
                                  cxt.closePath();
                                  cxt.fill();

                                  cxt.moveTo(10, 10);
                                  cxt.lineTo(150, 150);
                                  cxt.lineTo(10, 50);
                                  cxt.stroke();*/

                                  var grd = cxt.createLinearGradient(0, 0, 175, 50);
                                  grd.addColorStop(0,'#FF0000');
                                  grd.addColorStop(1,'#00FF00');
                                  cxt.fillStyle = grd;
                                  cxt.fillRect(0,0,175,50);

                              }

                                  
                          </script>
                      </head>
                      <body>
                          <form >
                              <article>
                                  <header>
                                      <h1>Mi primera página html</h1>
                                  </header>
                              </article>
                              <nav>
                                  <ul>
                                      <li><a href="#">Uno</a></li>
                                      <li><a href="#">Dos</a></li>
                                      <li><a href="#">Tres</a></li>
                                      <li><a href="#">Cuatro</a></li>
                                  </ul>
                              </nav>
                              <article class="pagina">
                                  <section class="contenedor">
                                      <br />
                                      <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIIrOH9SJeXDSEeOFtMxez5Zfnozh9J3l27GClLeYM0LZSaUFN1zCiN3AG604Yxm03evhidS9gxy9bkM9TtOrgoBP1yPbk6CFIb6v8oiqpxWOMVcbEc-h66TLgHrRYXSZ0ZxPhSdtb0A/s640/Basedatosnba.png" />
                                      <figcaption><mark> diseño de BBDD para web Scrapping</mark></figcaption>
                                  </section>
                                  <aside>
                                    
                                          <input type="search" placeholder="Busqueda" />
                                          <input type="email" placeholder="email" />
                                          <input type="url" placeholder="url"  />
                                          <input type="tel" placeholder="telefono" /><br />
                                          <input type="number" placeholder="numero" min="0" max="10" />
                                          <input type="range" name="nunmero" id="numero"  min="0" max="100" step="25" /> <br />
                                          <input type="date" name="fecha" id="fecha"   />
                                          <input type="week" name="semana" id="semana"  />
                                          <input type="month" name="mes" id="mes" /> <br /><br />
                                          <input type="time" name="hora" id="hora" checked />
                                          <input type="datetime" name="fechahora" id="fechahora"  />
                                          <input type="color" name="micolor" id="micolor"  /><br /><br />
                                          <progress value="20" max="100" >60%</progress>
                                          <meter min="0" max="100" value="75" ></meter>
                                          <audio controls="controls" class="audio">
                                              <source src="Rock_Intro_4.mp3" type="audiompeg"  />
                                          </audio><br /><br />
                                          <video controls="controls" height="300" width="300"  muted>
                                              <source src="Suscribete.mp4" type="video/mp4" />
                                          </video><br />
                                          <canvas id="myCanvas" >

                                          </canvas>
                                          <input type="submit" value="Enviar" onclick="dibuja();" />
                                     
                                  </aside>
                              </article>
                              <article class="pagina">
                                  <section class="contenedor">
                                      <br />
                                      <mark>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</mark> <br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                  </section>
                                  <aside>
                                      <p>YYYYYYYYYYYYYYYy</p>
                                  </aside>
                              </article>
                              <article>
                                  <footer>
                                      <ul>
                                          <li><a href="#">Derechos de uso</a></li>
                                          <li><a href="#">Copyright</a></li>
                                      </ul>
                                  </footer>
                              </article>
                          </form>
                      </body>
                      </html>

                      Curso HTML5. Novedades - 9 Tags: Video y canvas(1)

                      9. Curso HTML5. Novedades.  Tags: video y canvas(1)

                      • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior algunas de las nuevas etiquetas que trajo html5. En este capítulo veremos las etiquetas de video y canvas.
                      • Os cuento un poco para que se usan las nuevas etiquetas antes de ver el vídeo: 
                      1. Etiqueta videoNuevo elemento HTML5 que permite incluir un fichero de vídeo dentro de una página Web sin la necesidad de recurrir a un plugin. Únicamente en el caso de que el navegador no acepte HTML5 se utilizará el plugin.
                      2. Etiqueta canvas:  Con HTML5 podemos  dibujar, manipular bits de imágenes e incluso de video. Para ello primero creamos e identificamos un canvas. Después vía javascript ( https://es.wikipedia.org/wiki/JavaScript)  dibujamos lo que nos apetezca.
                      • Aquí os dejo un vídeo con ejemplos de uso de estos controles:
                      • Os dejo también el código html visto en el vídeo:
                      <!DOCTYPE html>
                      <html>
                      <head>
                          <meta charset="utf-8" />
                          <title>Pruebas</title>
                          <link href="StyleSheet1.css" rel="stylesheet" />
                          <script type="text/javascript">
                              function dibuja() {
                                  var c = document.getElementById('myCanvas');
                                  var cxt = c.getContext("2d");
                                  cxt.fillStyle = "#FF0000";
                                  cxt.beginPath();
                                  cxt.arc(70, 18, 15, 0, Math.PI * 2, true);
                                  cxt.closePath();
                                  cxt.fill();
                              }
                          </script>
                      </head>
                      <body>
                          <form >
                              <article>
                                  <header>
                                      <h1>Mi primera página html</h1>
                                  </header>
                              </article>
                              <nav>
                                  <ul>
                                      <li><a href="#">Uno</a></li>
                                      <li><a href="#">Dos</a></li>
                                      <li><a href="#">Tres</a></li>
                                      <li><a href="#">Cuatro</a></li>
                                  </ul>
                              </nav>
                              <article class="pagina">
                                  <section class="contenedor">
                                      <br />
                                      <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIIrOH9SJeXDSEeOFtMxez5Zfnozh9J3l27GClLeYM0LZSaUFN1zCiN3AG604Yxm03evhidS9gxy9bkM9TtOrgoBP1yPbk6CFIb6v8oiqpxWOMVcbEc-h66TLgHrRYXSZ0ZxPhSdtb0A/s640/Basedatosnba.png" />
                                      <figcaption><mark> diseño de BBDD para web Scrapping</mark></figcaption>
                                  </section>
                                  <aside>
                                    
                                          <input type="search" placeholder="Busqueda" />
                                          <input type="email" placeholder="email" />
                                          <input type="url" placeholder="url"  />
                                          <input type="tel" placeholder="telefono" /><br />
                                          <input type="number" placeholder="numero" min="0" max="10" />
                                          <input type="range" name="nunmero" id="numero"  min="0" max="100" step="25" /> <br />
                                          <input type="date" name="fecha" id="fecha"   />
                                          <input type="week" name="semana" id="semana"  />
                                          <input type="month" name="mes" id="mes" /> <br /><br />
                                          <input type="time" name="hora" id="hora" checked />
                                          <input type="datetime" name="fechahora" id="fechahora"  />
                                          <input type="color" name="micolor" id="micolor"  /><br /><br />
                                          <progress value="20" max="100" >60%</progress>
                                          <meter min="0" max="100" value="75" ></meter>
                                          <audio controls="controls" class="audio">
                                              <source src="Rock_Intro_4.mp3" type="audiompeg"  />
                                          </audio><br /><br />
                                          <video controls="controls" height="300" width="300"  muted>
                                              <source src="Suscribete.mp4" type="video/mp4" />
                                          </video><br />
                                          <canvas id="myCanvas" >

                                          </canvas>
                                          <input type="submit" value="Enviar" onclick="dibuja();" />
                                     
                                  </aside>
                              </article>
                              <article class="pagina">
                                  <section class="contenedor">
                                      <br />
                                      <mark>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</mark> <br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                  </section>
                                  <aside>
                                      <p>YYYYYYYYYYYYYYYy</p>
                                  </aside>
                              </article>
                              <article>
                                  <footer>
                                      <ul>
                                          <li><a href="#">Derechos de uso</a></li>
                                          <li><a href="#">Copyright</a></li>
                                      </ul>
                                  </footer>
                              </article>
                          </form>
                      </body>
                      </html>

                      Curso HTML5. Novedades - 8 Tags: progess, meter y audio

                      8. Curso HTML5. Novedades.  Tags: progess, meter y audio

                      • Vamos a continuar con nuestro curso de html . Después de ver en la entrada anterior algunas de las nuevas campos de formulario que traía html5. En este capítulo veremos las etiquetas progress, meter y audio.
                      • Os cuento un poco para que se usan las nuevas etiquetas antes de ver el vídeo: 
                      1. Etiqueta progressSe utiliza para indicar el progreso de una tarea. Un ejemplo de su representación en html es:  <progress value="25" max="100">25%</progress>
                      2. Etiqueta meter: Representa el valor conocido de un rango, entre un mínimo y un máximo.
                      3. Etiqueta audioEs un nuevo elemento HTML5 que permite incluir un fichero de audio dentro de una página Web sin la necesidad de recurrir a un plugin. Únicamente en el caso de que el navegador no acepte HTML5 se utilizará el plugin.
                      • Aquí os dejo un vídeo con ejemplos de uso de estos controles:

                      • Os dejo también el código html visto en el vídeo:
                      <!DOCTYPE html>
                      <html>
                      <head>
                          <meta charset="utf-8" />
                          <title>Pruebas</title>
                          <link href="StyleSheet1.css" rel="stylesheet" />
                      </head>
                      <body>
                          <form>
                              <article>
                                  <header>
                                      <h1>Mi primera página html</h1>
                                  </header>
                              </article>
                              <nav>
                                  <ul>
                                      <li><a href="#">Uno</a></li>
                                      <li><a href="#">Dos</a></li>
                                      <li><a href="#">Tres</a></li>
                                      <li><a href="#">Cuatro</a></li>
                                  </ul>
                              </nav>
                              <article class="pagina">
                                  <section class="contenedor">
                                      <br />
                                      <img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNIIrOH9SJeXDSEeOFtMxez5Zfnozh9J3l27GClLeYM0LZSaUFN1zCiN3AG604Yxm03evhidS9gxy9bkM9TtOrgoBP1yPbk6CFIb6v8oiqpxWOMVcbEc-h66TLgHrRYXSZ0ZxPhSdtb0A/s640/Basedatosnba.png" />
                                      <figcaption><mark> diseño de BBDD para web Scrapping</mark></figcaption>
                                  </section>
                                  <aside>
                                    
                                          <input type="search" placeholder="Busqueda" />
                                          <input type="email" placeholder="email" />
                                          <input type="url" placeholder="url"  />
                                          <input type="tel" placeholder="telefono" /><br />
                                          <input type="number" placeholder="numero" min="0" max="10" />
                                          <input type="range" name="nunmero" id="numero"  min="0" max="100" step="25" /> <br />
                                          <input type="date" name="fecha" id="fecha"   />
                                          <input type="week" name="semana" id="semana"  />
                                          <input type="month" name="mes" id="mes" /> <br /><br />
                                          <input type="time" name="hora" id="hora" checked />
                                          <input type="datetime" name="fechahora" id="fechahora"  />
                                          <input type="color" name="micolor" id="micolor"  /><br /><br />
                                          <progress value="20" max="100" >60%</progress>
                                          <meter min="0" max="100" value="75" ></meter>
                                          <audio controls="controls" class="audio">
                                              <source src="Rock_Intro_4.mp3" type="audiompeg"  />
                                          </audio><br /><br />
                                          <input type="submit" value="Enviar" />
                                     
                                  </aside>
                              </article>
                              <article class="pagina">
                                  <section class="contenedor">
                                      <br />
                                      <mark>ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ</mark> <br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                      ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ<br />
                                  </section>
                                  <aside>
                                      <p>YYYYYYYYYYYYYYYy</p>
                                  </aside>
                              </article>
                              <article>
                                  <footer>
                                      <ul>
                                          <li><a href="#">Derechos de uso</a></li>
                                          <li><a href="#">Copyright</a></li>
                                      </ul>
                                  </footer>
                              </article>
                          </form>
                      </body>
                      </html>

                      Curso .NET Core en C# - 34.Creamos nuestro propio log

                      34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...