def _gaussian_fit(array):
if array.shape[0] < 2:
logging.error("Cannot fit a Gaussian with two distances.")
return 0
array_2 = -(np.array(sorted(array)).reshape(-1, 1))
array = np.array(list(array_2) + list(array)).reshape(-1, 1)
try:
# new sklearn GMM
gmm = mixture.GaussianMixture(n_components=3,
covariance_type='diag')
gmm.fit(array)
# gmmmean = np.max(gmm.means_)
# gmmsigma = gmm.covariances_[np.argmax(gmm.means_)]
except AttributeError:
# use old sklearn method
gmm = mixture.GMM(n_components=3)
gmm.fit(array)
# gmmmean = np.max(gmm.means_)
# gmmsigma = gmm.covars_[np.argmax(gmm.means_)]
# Extract optimal threshold
plt.hist(array, bins=50, normed=True) # debug, print
lin = np.linspace(0, 1, 10000)[:, np.newaxis]
# plt.plot(lin, np.exp(gmm.score_samples(lin)[0]), 'r')
pred = gmm.predict(lin)
try:
idx = np.min(np.where(pred == np.argmax(gmm.means_))[0])
except ValueError:
# print("Error", np.unique(pred))
idx = 0
plt.axvline(x=lin[idx], linestyle='--', color='r')
# plt.gcf().savefig("threshold_naive{}.png".format(k))
plt.close()
threshold = lin[idx][0] # threshold
# np.save("threshold_naive", threshold)
return threshold
评论列表
文章目录