0

我在文件中有以下几行数据(当然还有更多行):

data1 0.20
data2 2.32
data3 0.02
dataX x.xx

data1 1.13
data2 3.10
data3 0.96
dataX x.xx

....

我想为每个数据创建概率分布*。我可以手动做到这一点,但也许有一个库可以让我更自动地做到这一点。理想情况下,我想避免预先格式化行(并用上述行提供库,但如果不可能,我将不得不这样做)。

更新

对不起,不准确。我想找到的是有多少数字属于自定义范围。例子:

[0.0 - 0.1) - 2 numbers;
[0.1 - 0.2) - 3 numbers;
[0.2 - 0.3) - ...

当然,我想轻松设置不同的范围(更宽或更窄),然后 - 有了它 - 我想生成图表。

4

2 回答 2

1

“概率”的概念有点微妙——如果数据是平稳随机过程的输出,那么您可以通过测量过去的输出来估计该过程未来输出的概率。但是相同的数据集可以确定性地生成,在这种情况下不涉及概率,并且每次运行该过程时,您都会得到相同的数据(而不是具有相似分布的不同数据)。

在任何一种情况下,您都可以通过将数据分箱为直方图来获得数据的分布。可以通过以下方式将数据格式化为单独的列表:

import collections, re

data = ["data1 0.20", "data2 2.32", "data3 0.02",
        "data1 1.13", "data2 3.10", "data3 0.96" ]

hist = collections.defaultdict(list)
for d in data:
    m = re.match("data(\d+)\s+(\S+)", d)
    if m:
        hist[int(m.group(1))].append(float(m.group(2)))
for k in hist.keys():
    print(k, hist[k])

生产:

1 [0.2, 1.13]
2 [2.32, 3.1]
3 [0.02, 0.96]

然后,您可以使用如何在 Python 中将一系列浮点值合并到直方图中来构建直方图?. 最后,对 bin 值进行归一化,使其总和为 1.0(将每个 bin 除以所有 bin 的总数)以形成概率分布。不是用于创建数据的概率分布,而是它的近似值。

于 2012-09-21T13:35:11.943 回答
0

您可以使用scipy stats norm(和集合)。

拆分您的数据(我认为您的意思是采用这种形式):

raw_data = ( line.split() for line in raw_data.split('\n') )

data = collections.defaultdict(list)
for item in raw_data:
    data[item[0]] = item[1]

data['data1'] # [0.2, 1.13...]

然后对于每个数据集:

for i in xrange(X):
    scipy.stats.norm.fit(data['data'+i]) # (mean, standard deviation)

scipy.stats.norm.fit(data['data1']) # (0.66499999999999992, 0.46499999999999991)

目前尚不清楚您的确切概率是多少,但均值和标准差是一个好的开始(您可以在scipy 的统计函数中找到其他概率)。

于 2012-09-21T14:23:50.917 回答