如何找到真实数据的概率分布和参数?(Python3)

2024-05-28 18:04:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个来自sklearn的数据集,我绘制了load_diabetes.target数据的分布(即load_diabetes.data用来预测的回归值)。

我使用这个是因为它的回归变量/属性的数量最少。

使用Python 3,如何获得与此最相似的发行版的发行版类型和参数?

我只知道target值都是正的和倾斜的(正倾斜/右倾斜)。Python中有没有一种方法可以提供一些发行版,然后获得最适合于target数据/向量的版本?或者,根据给出的数据提出一个合适的建议?这对那些有理论统计知识,但很少有经验将其应用于“真实数据”的人来说是非常有用的。

奖金 使用这种方法来计算“真实数据”的后验分布是否有意义?如果没有,为什么不呢?

from sklearn.datasets import load_diabetes
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import pandas as pd

#Get Data
data = load_diabetes()
X, y_ = data.data, data.target

#Organize Data
SR_y = pd.Series(y_, name="y_ (Target Vector Distribution)")

#Plot Data
fig, ax = plt.subplots()
sns.distplot(SR_y, bins=25, color="g", ax=ax)
plt.show()

enter image description here


Tags: 数据方法importtargetdataasloadplt
3条回答

您可以使用该代码(根据最大可能性)将不同的分布与您的数据相匹配:

import matplotlib.pyplot as plt
import scipy
import scipy.stats

dist_names = ['gamma', 'beta', 'rayleigh', 'norm', 'pareto']

for dist_name in dist_names:
    dist = getattr(scipy.stats, dist_name)
    param = dist.fit(y)
    # here's the parameters of your distribution, scale, location

您可以看到一个关于如何使用这里获得的参数的示例片段:Fitting empirical distribution to theoretical ones with Scipy (Python)?

然后,您可以选择具有最佳对数似然的分布(还有其他与“最佳”分布匹配的标准,如贝叶斯后验概率、AIC、BIC或BICc值等)。

对于你的加分问题,我认为没有通用的答案。如果您的数据集是有效的,并且在与实词数据相同的条件下获得,则可以执行此操作。

据我所知,没有自动获取样本分布类型和参数的方法(因为推断样本分布本身就是一个统计问题)。

在我看来,你所能做的就是:

(对于每个属性)

  • 尝试将每个属性与一个相当大的可能分布列表相匹配 (例如,有关Scipy的示例,请参见Fitting empirical distribution to theoretical ones with Scipy (Python)?

  • 评估你所有的适合度,选择最好的一个。这可以通过在您的样本和每个fit分布之间执行Kolmogorov-Smirnov测试(同样,您在Scipy中有一个实现)并选择最小化D的测试统计量(即样本和fit之间的差异)来完成。

奖励:这是有意义的-因为你将建立一个模型,对每个变量,因为你选择一个适合每一个-虽然你的预测的好处将取决于你的数据质量和分布,你正在使用拟合。毕竟,你在建一个模型。

使用这种方法

import scipy.stats as st
def get_best_distribution(data):
    dist_names = ["norm", "exponweib", "weibull_max", "weibull_min", "pareto", "genextreme"]
    dist_results = []
    params = {}
    for dist_name in dist_names:
        dist = getattr(st, dist_name)
        param = dist.fit(data)

        params[dist_name] = param
        # Applying the Kolmogorov-Smirnov test
        D, p = st.kstest(data, dist_name, args=param)
        print("p value for "+dist_name+" = "+str(p))
        dist_results.append((dist_name, p))

    # select the best fitted distribution
    best_dist, best_p = (max(dist_results, key=lambda item: item[1]))
    # store the name of the best fit and its p value

    print("Best fitting distribution: "+str(best_dist))
    print("Best p value: "+ str(best_p))
    print("Parameters for the best fit: "+ str(params[best_dist]))

    return best_dist, best_p, params[best_dist]

相关问题 更多 >

    热门问题