예제 #1
0
파일: line_yatsm.py 프로젝트: jmorton/yatsm
def run_pixel(X, Y, dataset_config, yatsm_config, px=0, py=0):
    """ Run a single pixel through YATSM

    Args:
      X (ndarray): 2D (nimage x nband) feature input from ordinal date
      Y (ndarray): 2D (nband x nimage) image input
      dataset_config (dict): dict of dataset configuration options
      yatsm_config (dict): dict of YATSM algorithm options
      px (int, optional):       X (column) pixel reference
      py (int, optional):       Y (row) pixel reference

    Returns:
      model_result (ndarray): NumPy array of model results from YATSM

    """
    # Extract design info
    design_info = X.design_info
    # Continue if valid observations are less than 50% of dataset
    valid = cyprep.get_valid_mask(Y[:dataset_config['mask_band'] - 1, :],
                                  dataset_config['min_values'],
                                  dataset_config['max_values'])
    if valid.sum() < Y.shape[1] / 2.0:
        raise TSLengthException('Not enough valid observations')

    # Otherwise continue with masked values
    valid = (valid * np.in1d(Y[dataset_config['mask_band'] - 1, :],
                             dataset_config['mask_values'],
                             invert=True)).astype(np.bool)

    Y = Y[:dataset_config['mask_band'] - 1, valid]
    X = X[valid, :]

    if yatsm_config['reverse']:
        # TODO: do this earlier
        X = np.flipud(X)
        Y = np.fliplr(Y)

    yatsm = YATSM(X,
                  Y,
                  consecutive=yatsm_config['consecutive'],
                  threshold=yatsm_config['threshold'],
                  min_obs=yatsm_config['min_obs'],
                  min_rmse=yatsm_config['min_rmse'],
                  test_indices=yatsm_config['test_indices'],
                  retrain_time=yatsm_config['retrain_time'],
                  screening=yatsm_config['screening'],
                  screening_crit=yatsm_config['screening_crit'],
                  green_band=dataset_config['green_band'] - 1,
                  swir1_band=dataset_config['swir1_band'] - 1,
                  remove_noise=yatsm_config['remove_noise'],
                  dynamic_rmse=yatsm_config['dynamic_rmse'],
                  slope_test=yatsm_config['slope_test'],
                  lassocv=yatsm_config['lassocv'],
                  design_info=design_info,
                  px=px,
                  py=py,
                  logger=logger)
    yatsm.run()

    if yatsm_config['commission_alpha']:
        yatsm.record = yatsm.commission_test(yatsm_config['commission_alpha'])

    if yatsm_config['robust']:
        yatsm.record = yatsm.robust_record

    if yatsm_config['calc_pheno']:
        ltm = pheno.LongTermMeanPhenology(yatsm, yatsm_config['red_index'],
                                          yatsm_config['nir_index'],
                                          yatsm_config['blue_index'],
                                          yatsm_config['scale'],
                                          yatsm_config['evi_index'],
                                          yatsm_config['evi_scale'])
        yatsm.record = ltm.fit(year_interval=yatsm_config['year_interval'],
                               q_min=yatsm_config['q_min'],
                               q_max=yatsm_config['q_max'])

    return yatsm.record
예제 #2
0
파일: line_yatsm.py 프로젝트: jmorton/yatsm
def run_pixel(X, Y, dataset_config, yatsm_config, px=0, py=0):
    """ Run a single pixel through YATSM

    Args:
      X (ndarray): 2D (nimage x nband) feature input from ordinal date
      Y (ndarray): 2D (nband x nimage) image input
      dataset_config (dict): dict of dataset configuration options
      yatsm_config (dict): dict of YATSM algorithm options
      px (int, optional):       X (column) pixel reference
      py (int, optional):       Y (row) pixel reference

    Returns:
      model_result (ndarray): NumPy array of model results from YATSM

    """
    # Extract design info
    design_info = X.design_info
    # Continue if valid observations are less than 50% of dataset
    valid = cyprep.get_valid_mask(
      Y[:dataset_config['mask_band'] - 1, :],
      dataset_config['min_values'],
      dataset_config['max_values']
    )
    if valid.sum() < Y.shape[1] / 2.0:
        raise TSLengthException('Not enough valid observations')

    # Otherwise continue with masked values
    valid = (valid * np.in1d(Y[dataset_config['mask_band'] - 1, :],
                             dataset_config['mask_values'],
                             invert=True)).astype(np.bool)

    Y = Y[:dataset_config['mask_band'] - 1, valid]
    X = X[valid, :]

    if yatsm_config['reverse']:
        # TODO: do this earlier
        X = np.flipud(X)
        Y = np.fliplr(Y)

    yatsm = YATSM(X, Y,
                  consecutive=yatsm_config['consecutive'],
                  threshold=yatsm_config['threshold'],
                  min_obs=yatsm_config['min_obs'],
                  min_rmse=yatsm_config['min_rmse'],
                  test_indices=yatsm_config['test_indices'],
                  retrain_time=yatsm_config['retrain_time'],
                  screening=yatsm_config['screening'],
                  screening_crit=yatsm_config['screening_crit'],
                  green_band=dataset_config['green_band'] - 1,
                  swir1_band=dataset_config['swir1_band'] - 1,
                  remove_noise=yatsm_config['remove_noise'],
                  dynamic_rmse=yatsm_config['dynamic_rmse'],
                  slope_test=yatsm_config['slope_test'],
                  lassocv=yatsm_config['lassocv'],
                  design_info=design_info,
                  px=px,
                  py=py,
                  logger=logger)
    yatsm.run()

    if yatsm_config['commission_alpha']:
        yatsm.record = yatsm.commission_test(yatsm_config['commission_alpha'])

    if yatsm_config['robust']:
        yatsm.record = yatsm.robust_record

    if yatsm_config['calc_pheno']:
        ltm = pheno.LongTermMeanPhenology(
            yatsm,
            yatsm_config['red_index'], yatsm_config['nir_index'],
            yatsm_config['blue_index'], yatsm_config['scale'],
            yatsm_config['evi_index'], yatsm_config['evi_scale'])
        yatsm.record = ltm.fit(year_interval=yatsm_config['year_interval'],
                               q_min=yatsm_config['q_min'],
                               q_max=yatsm_config['q_max'])

    return yatsm.record
예제 #3
0
파일: run_yatsm.py 프로젝트: jmorton/yatsm
    # Renew the generator for style
    if plot_style == 'xkcd':
        style_context = plt.xkcd()
    else:
        style_context = plt.style.context(plot_style)

    if isinstance(plot_index, int):
        with style_context:
            plot_results()
            plt.tight_layout()
            plt.title('Modeled Timeseries')
            plt.show()

    if args['--commit_alpha']:
        yatsm.record = yatsm.commission_test(float(args['--commit_alpha']))

        # Renew the generator for style
        if plot_style == 'xkcd':
            style_context = plt.xkcd()
        else:
            style_context = plt.style.context(plot_style)

        if isinstance(plot_index, int):
            with style_context:
                plot_results()
                plt.tight_layout()
                plt.title('Modeled Timeseries (with commission test)')
                plt.show()

    if args['--pheno']: