这是我第一次使用Scipy,因为我找不到许多库可以直接生成KDE数据,而不像Pandas那样预先绘制(data.plot=‘kde’)。我试图将KDE中的数据作为一个列表或数组来获取,但它指的是0x000002C4A8D077F0>上的KDE对象
是否有一个np.array(密度) (Numpy)或density.values (Pandas)类似的函数可以检索这些值?
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
data = [992.9832, 846.1371, 994.2491, ..., 0.0]
# generate histogram data
h, e = np.histogram(data, bins='auto')
width = 1 * (e[1] - e[0])
center = (e[:-1] + e[1:]) / 2
print(np.array(data).mean())
x = np.linspace(e.min(), e.max())
# plot the histogram
plt.figure(figsize=(8,6))
plt.bar(center, h, align='center', width=width, label='histogram')
plt.axvline(np.array(data).mean(), color='k', linestyle='dashed', linewidth=1)
plt.legend()
plt.show()
# Plot KDE
density = stats.gaussian_kde(data)
print('DENSITY TYPE:', type(density))
print('DENSITY:', density)
plt.plot(center, density(center))
发布于 2021-04-01 13:40:45
你估计过密度
kde = stats.gaussian_kde(data)
您需要在数据范围内评估密度(或者更宽的范围,您可以选择)
evaluated = kde.evaluate(np.linspace(data.min(), data.max(), 100))
让我们试一下
# generate random variates
np.random.seed(42)
data = sps.norm(loc=200, scale=5).rvs(100)
plt.hist(data, density=True);
现在让我们估算和评估密度
density = gaussian_kde(data)
data_space = np.linspace(data.min(), data.max())
evaluated = density.evaluate(data_space)
plt.hist(data, density=True)
plt.plot(data_space, evaluated);
并且在您选择的范围内有一个密度数组(本例中为data_space
,但您可以定义所需的行空间)。
print(evaluated)
[0.00371907 0.00455801 0.00561179 0.00693696 0.0085618 0.01047394
0.01262245 0.01493411 0.01733577 0.01977291 0.02221777 0.02466837
0.0271459 0.02969787 0.03240771 0.03540247 0.03884495 0.04290023
0.04767829 0.05316985 0.05920179 0.06543718 0.07142939 0.07671788
0.08093304 0.08387167 0.08551486 0.08598526 0.08546673 0.08412519
0.0820653 0.07933652 0.07597516 0.07205101 0.06768935 0.06305743
0.05832807 0.05364531 0.04911138 0.04479586 0.04075165 0.03701897
0.03361161 0.03049646 0.02758628 0.02475911 0.02190045 0.01894903
0.01592369 0.01291898]
备注
被评估的PDF没有标准化,也就是说它不等于1
evaluated.sum()
2.147314809573033
如果您需要将其规范化,您可以简单地将它除以和(等于除以连续变量的积分)。
evaluated /= evaluated.sum()
evaluated.sum()
1.0
https://stackoverflow.com/questions/66903255
复制相似问题