如何解决一维数据拟合不佳的问题?

时间:2019-08-17 22:34:22

标签: python distribution curve-fitting gaussian normal-distribution

我有数据集(1-D),只有一个独立的列。我想适合任何模型,以便从该模型中取样。原始数据 Data set

我尝试了Fitter程序包(此处为https://pypi.org/project/fitter/)中的各种理论分布,但都无法正常工作。然后我尝试使用sklearn进行内核密度估计。很好,但是由于它的工作方式,我无法防止出现负值。最后,我尝试使用正常日志,但这并不是很完美。

此处的日志代码正常

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy
import math
from sklearn.metrics import  r2_score,mean_absolute_error,mean_squared_error

NN = 3915 # sample same number as original data set

df = pd.read_excel (r'Data_sets2.xlsx',sheet_name="Set1")

eps = 0.1  # Additional term for c

"""
    Estimate parameters of log(c) as normal distribution
"""
df["c"] = df["c"] + eps
mu = np.mean(np.log(df["c"]))
s  = np.std(np.log(df["c"]))
print("Mean:",mu,"std:",s)


def simulate(N):
    c = []
    for i in range(N):
        c_s = np.exp(np.random.normal(loc = mu, scale = s, size=1)[0])
        c.append(round(c_s))
    return (c)


predicted_c = simulate(NN)


XX=scipy.arange(3915)
### plot C relation ###
plt.scatter(XX,df["c"],color='g',label="Original data")
plt.scatter(XX,predicted_c,color='r',label="Sample data")
plt.xlabel('Index')
plt.ylabel('c')
plt.legend()
plt.show()

原始vs样本

fitted data

我正在寻找的是如何改善拟合度,对可能更准确地拟合我的数据的模型的任何建议或方向,都表示赞赏。谢谢

1 个答案:

答案 0 :(得分:1)

这是使用电子表格数据进行统计统计分布Double Gamma的图形Python拟合器,我希望这可能会有所用,因为正态分布似乎不太适合此数据集。 dgamma的scipy文档位于https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.dgamma.html-顺便说一下,双重Weibull分布也几乎适用。

plot

import numpy as np
import scipy.stats as ss
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_excel (r'Data_sets2.xlsx',sheet_name="Set1")
eps = 0.1  # Additional term for c

data = df["c"] + eps

P = ss.dgamma.fit(data)
rX = np.linspace(min(data), max(data), 50)
rP = ss.dgamma.pdf(rX, *P)

plt.hist(data,bins=25, normed=True, color='slategrey')

plt.plot(rX, rP, color='darkturquoise')
plt.show()