【发布时间】:2019-12-26 17:58:43
【问题描述】:
我有一个数据集 (1D) 链接:dataset,其值范围为 21,000 到 8,000,000。当我绘制日志值的直方图时,我可以看到大致有两个峰值。我尝试在 Python 中使用 sklearn 包来拟合高斯混合。我试图根据最低 AIC/BIC 找到最好的 n_components。使用 Full covariance_type,BIC 最好是 44,AIC 是 98(我只测试了 100)。但是一旦我使用这些数字,我的身材就很差。此外,我测试了所有其他 covariance_types,但我无法适应我的数据。我只试了 2 个,我得到了更好的合身度。
import pandas as pd
import numpy as np
from sklearn.mixture import GaussianMixture as GMM
import matplotlib.pyplot as plt
df = pd.read_excel (r'Data_sets.xlsx',sheet_name="Set1")
b=df['b'].values.reshape(-1,1)
b=np.log(b)
####### finding best n_components ########
k= np.arange(1,100,1)
clfs= [GMM(n,covariance_type='full').fit(b) for n in k]
aics= [clf.aic(b) for clf in clfs]
bics= [clf.bic(b) for clf in clfs]
plt.plot(k,bics,color='orange',marker='.',label='BIC')
plt.plot(k,aics,color='g',label='AIC')
plt.legend()
plt.show()
这是我尝试绘制数据的直方图 + 拟合高斯混合的密度 pdf
clf=GMM(38,covariance_type='full').fit(b)
n, bins, patches = plt.hist(b,bins='auto',density=True,color='#0504aa',alpha=0.7, rwidth=0.85)
xpdf=np.linspace(b.min(),b.max(),len(bins)).reshape(-1,1)
density= np.exp(clf.score_samples(xpdf))
plt.plot(xpdf,density,'-r')
print("Best number of K by BIC is", bics.index(min(bics)))
print("Best number of K by AIC is", aics.index(min(aics)))
这里我绘制了 bins=50 的直方图,顶部直方图用于原始数据集 =3915;根据 BIC 的建议,使用 n_components=44 的 10,000 个样本中的最后一个。看起来 GMM(44) 很合适。
我的问题,导致这些结果的错误在哪里(1)是否因为我的数据不适合高斯混合? (2) 我的实现错了吗?感谢您提供解决问题的帮助或建议。通过更新(直方图),看起来 GMM 很适合数据。但是,我不明白为什么第一个 plot hist+kde 不合适。我猜是因为 hist 和 kde 都使用不同的 y 比例,但不确定。 谢谢
【问题讨论】:
-
你有多少数据?你为什么要这样做?即,您在拟合模型后对它做什么?
-
数据包含 3915 个点。拟合的原因是之后从拟合的高斯模型中采样。这里链接到数据以防万一,s000.tinyupload.com/?file_id=57695956768621085643
-
如果你想从中取样,只需使用尽可能多的组件,例如100. 否则KDE 可能会更容易。使用它当然在计算上更简单
-
谢谢!但我想证明该模型非常适合数据。使用 GMM,我可以说我根据 BIC 选择了最佳数量的组件 -> 然后显示确认拟合的密度图。之后,我可以自信地轻松采样。此外,当分量很大时说 100,一些高斯将有非常微小的概率,如 0.0001,这就像过拟合。谢谢
标签: python scikit-learn gaussian kernel-density