我正在尝试使用Python中的SAS从replicate an example开始,在这里我适合汇总统计信息中的分布。提供给我的摘要统计信息是总数,最小值,最大值,p50,p75,p85,p95,p98,p99和p99.9。这些测量来自机器的分布式网络,包括延迟或大小分布。目标是从每台计算机重建混合,然后组合这些分布以估计整个网络的分布,并以流式方式定期进行此操作。
我正在浏览PyMC,Pyro和Pomegranate的文档,并了解混合模型的基本知识,但是我不了解的是如何设置每个分布的初始参数,在给定可用数据的情况下可以使用哪个初始参数,或者如何将每个分布移至相应的分位数以构造总体分布。
在这些框架中,有没有可能?
答案 0 :(得分:-2)
在Pyro forums的帮助下回答我自己的问题。下面的代码包含问题上半部分的解决方案,找到与收集的分位数的参数匹配的分布:
import torch
import torch.distributions as dist
from torch.optim import Adam
from typing import List, Tuple
def find_cauchy_params(quantiles: List[Tuple[float, float]]):
alpha = torch.tensor(1.0, requires_grad=True)
beta = torch.tensor(1.0, requires_grad=True)
quantile_tensors = [
(quantile, torch.tensor(quantile_value))
for quantile, quantile_value in quantiles
]
def loss_fn():
loss = 0.0
d = dist.Cauchy(alpha, beta)
for quantile, quantile_value in quantile_tensors:
loss += (quantile - d.cdf(quantile_value)) ** 2
return loss
optim = Adam([alpha, beta], lr=0.01)
for step in range(1000):
optim.zero_grad()
loss = loss_fn()
print("loss", loss)
loss.backward()
optim.step()
print("alpha = {}".format(alpha.item()))
print("beta = {}".format(beta.item()))
find_cauchy_params(
[(0.5, 0.0), (0.75, 0.0), (0.95, 1.0), (0.98, 1.0), (0.99, 8.0), (0.999, 11.0)]
)
截断的输出:
...
loss tensor(0.0317, grad_fn=<AddBackward0>)
loss tensor(0.0317, grad_fn=<AddBackward0>)
loss tensor(0.0317, grad_fn=<AddBackward0>)
loss tensor(0.0317, grad_fn=<AddBackward0>)
alpha = -0.04828706011176109
beta = 0.11657208949327469