2 minute read

El trabajo de esta semana se ha centrado en corregir los errores detectados a la hora de implementar IDW. Se ha corregido la información del blog de la semana 19.

Estos errores consistian en aplicar una correcta combinación convexa para la determinacion de los pesos de cada punto. La corrección aplicada consiste en emplear la fórmula D = λ1·A + λ2·B + λ3·C, donde λ1, λ2 y λ3 son pesos aleatorios que siguen una distribución normal truncada en el rango [0, 1]. Los pesos se normalizan para que sumen 1, lo que garantiza que la combinación sea convexa.

El otro error corregido es la manera de expresar y calcular los valores aleatorias de λ. Se busca obtener un valor aleatorio entre 0 y 1, pero que los valores intermedios tengan una probabilidad mayor a los valores cercanos a los extremos. Para lograr esto se aplica spicy.stats.tuncnorm. De esta manera el peso λ sigue una distribución aleatoria truncada en el rango [0, 1].

          from scipy.stats import truncnorm

          # Parámetros de la distribución normal truncada
          media = 0.5
          desviacion_estandar = 0.2
          limite_inferior = 0
          limite_superior = 1

          # Convertir los límites al espacio de la distribución normal estándar
          a = (limite_inferior - media) / desviacion_estandar
          b = (limite_superior - media) / desviacion_estandar

          # Generar lambda con distribución normal truncada
          lambdaComb = truncnorm.rvs(a, b, loc=media, scale=desviacion_estandar)
          lambdaComb = np.clip(lambdaComb, 0.0, 1.0)  # Asegurarse de que esté en el rango [0, 1]

          # Interpolación aplicando C = λA + (1-λ)B
          interpolated_point = lambdaComb * point + (1 - lambdaComb) * neighbor_point
        # Generar pesos aleatorios que sumen 1
        lambda_1 = truncnorm.rvs(a ,b, loc=media, scale=desviacion_estandar)
        lambda_2 = truncnorm.rvs(a ,b, loc=media, scale=desviacion_estandar)
        lambda_3 = truncnorm.rvs(a ,b, loc=media, scale=desviacion_estandar)

         # Normalizar los pesos para que sumen 1
        total = lambda_1 + lambda_2 + lambda_3
        lambda_1 /= total
        lambda_2 /= total
        lambda_3 /= total
                
        # Interpolacion aplicando D=λ1*​A+λ2*​B+λ3*​C
        interpolated_point = lambda_1 * point_A + lambda_2 * point_B + lambda_3 * point_C

Además de las correcciones he probado a aplicar el muestreo a las nubes de puntos del dataset Goose.

El muestreo aleatorio se aplica correctamente como se puede ver en el video.

Arriba izquierda nube original. Arriba derecha indece de densidad 0.7. Abajo izquierda indice de densidad 0.5. Abajo derecha indice de densidad 0.3

En el caso de la voxelización, si utilizamos la vista cenital podemos ver que la estructura de la nube se mantiene. Pero al ver la camara en tercera persona se pierde todo el detalle de la nube. Este error probablemente se deba a la mala configuracion del tamaño del voxel.

muestreo_voxel_cenital.png
Vista cenital tras aplicar el muestreo por voxelización.
muestreo_voxel.png
Vista en tercera persona tras aplicar el muestreo por voxelización.