我正在尝试从历史飓风数据中生成合成实现。飓风在我的问题中通过一组描述符(即风暴大小,风暴强度,风暴速度和风暴标题 - 参数化 - 都参考了飓风穿越某些海岸线时的值)。这些实现将用于对飓风产生的洪水进行概率预测。假设历史飓风数据来自一些潜在的多变量分布。这个想法是从这个基础分布中提取额外的样本(保留时刻,相关性,物理边界,如正暴风雨大小等)。
我实施了一种最近邻高斯分散方法,该方法是根据Taylor和Thompson开发的技术修改的 - 发表在计算统计和数据分析,1986年。我想看看是否有更好的方法来做到这一点。
数据样本(墨西哥湾飓风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()
Neighborhood_size = 5和distance_metric = Euclidean的示例。
答案 0 :(得分:1)
您的数据几乎肯定不是高斯数据,速度,强度和大小都必须是正数,大小和强度都明显偏斜。对数正态分布似乎是合理的。我建议在尝试分配合适之前对数据进行日志转换。
尝试捕获相关结构的一种方法(肯定存在于您发布的数据中!)将估算平均 M 和方差/协方差矩阵 V 对数转换后的数据。然后使用Cholesky decomposition分解方差/协方差矩阵,得到 V =转置( C ) C 。如果 Z 是独立法线的向量,则 X = M +转置( C ) Z 将是具有所需均值和方差/协方差结构的相关法线的向量。指出 X 的元素将产生您的模拟结果。结果应该避免诸如上一个图表中可见的负风暴大小之类的伪像。有关详细信息,请参阅this paper。