Моделирование коррелированных многомерных данных

Я пытаюсь создать синтетические реализации из исторических данных об ураганах. Ураган параметризуется в моей задаче набором дескрипторов (т. е. размером шторма, интенсивностью шторма, скоростью шторма и направлением шторма — все они относятся к значениям, когда ураган пересекает некоторую береговую линию). Реализации будут использоваться для вероятностных прогнозов наводнений, вызванных ураганами. Предполагается, что исторические данные об ураганах поступают из некоторого основного многомерного распределения. Идея состоит в том, чтобы извлечь дополнительные выборки из этого базового распределения (сохранение моментов, корреляция, физические ограничения, такие как положительный размер шторма и т. д.).

Я применил метод гауссовой дисперсии ближайшего соседа, модифицированный на основе метода, разработанного Тейлором и Томпсоном и опубликованного в Computational Statistics and Data Analysis, 1986. Я хотел бы посмотреть, есть ли лучшие способы сделать это.

Выборка данных (ураганы в Мексиканском заливе 1940-2005 гг.):

Ураганы в Мексиканском заливе, 1940-2005 гг.

def TT_alg(data_list, sample_size, num_neighbors=5, metric=2):

    dummy_list = []
    dimension = len(data_list[0])

    # transform the data to the interval [0,1]
    aa = numpy.array([(max([row[i] for row in data_list]) - min([row[i] for row in   data_list])) for i in range(dimension)])
    bb = numpy.array([min([row[j] for row in data_list]) for j in range(dimension)])

    data_array = numpy.array(data_list)
    data_array_normed = (data_array - bb) / aa

    # setup nearest neighbor tree
    tree = scipy.spatial.KDTree(data_array_normed)

    # perform nearest neighbor random walk
    for ijk in range(sample_size):

        sample = random.choice(data_array_normed)

        kNN = tree.query(sample, k=num_neighbors, p=metric)
        x_mu = numpy.array([numpy.average([data_array_normed[i][j] for i in kNN[1]]) for j in range(dimension)])
        x_si = numpy.array([numpy.std([data_array_normed[i][j] for i in kNN[1]]) for j in range(dimension)])
        s_gs = [numpy.random.normal(mu, si) for mu, si in zip(x_mu, x_si)]
        dummy_list.append(s_gs)

    dummy_array = numpy.array(dummy_list)

    # go back to original scale
    data_array_unnormed = (dummy_array * aa) + bb

    return data_array_unnormed.tolist()

Пример для Neighbor_size=5 и Distance_metric=Euclidean.

введите здесь описание изображения


person ZuLu    schedule 28.09.2013    source источник
comment
возможно, вам повезет больше, если вы разместите этот вопрос на Cross-Validated (сайт SE для статистики и машинного обучения). Вы также можете попробовать эту статью.   -  person Antoine    schedule 07.09.2015


Ответы (1)


Ваши данные почти наверняка не являются гауссовскими, скорость, интенсивность и размер должны быть положительными, а размер и интенсивность явно искажены. Логарифмически нормальное распределение правдоподобно. Я бы порекомендовал преобразовать ваши данные в журнал перед попыткой распределения.

Один из способов попытаться зафиксировать структуру корреляции (которая определенно присутствует в опубликованных вами данных!) – оценить среднее значение M и матрицу дисперсии/ковариации V журнала. -преобразованные данные. Затем разложите матрицу дисперсии/ковариации, используя разложение Холецкого, чтобы получить V = транспонировать(C) C. Если Z — вектор независимых нормалей, тогда X = M + transpose(C) Z будет вектором коррелированных нормалей с желаемой структурой среднего и дисперсии/ковариации. Возведение в степень элементов X даст ваши смоделированные результаты. В результатах не должно быть таких артефактов, как отрицательные размеры бури, видимые на последнем графике. Дополнительные сведения см. в этой статье.

person pjs    schedule 28.09.2013