5

2 成分ガウス混合モデルを以下に示すデータに当てはめることに興味があります。対数変換されたカウント比率データ、0 を超えることはできませんただし、ここでプロットしているのは、0 ~ 1 の間に正規化された対数変換されたカウントであるため、データが取る最大値は 0 です。結果のフィットを取得しますが、これは明らかに私が望んでいるものではありません。

from sklearn.mixture import GaussianMixture
import numpy as np

# start with some count data in (0,1]
logged_counts = np.log(counts)
model = GaussianMixture(2).fit(logged_counts.reshape(-1,1))

# plot resulting fit
x_range = np.linspace(np.min(logged_counts), 0, 1000)
pdf = np.exp(model.score_samples(x_range.reshape(-1, 1)))
responsibilities = model.predict_proba(x_range.reshape(-1, 1))
pdf_individual = responsibilities * pdf[:, np.newaxis]

plt.hist(logged_counts, bins='auto', density=True, histtype='stepfilled', alpha=0.5)
plt.plot(x_range, pdf, '-k', label='Mixture')
plt.plot(x_range, pdf_individual, '--k', label='Components')
plt.legend()
plt.show()

sklearn の 2 成分 GMM を使用した近似一番上のコンポーネントの平均を 0 に固定し、もう一方の平均、2 つの分散、および混合分数のみを最適化できれば幸いです。(さらに、右側のコンポーネントに半法線を使用できるようにしたいと考えています。) python/sklearn の組み込み関数を使用してこれを行う簡単な方法はありますか、または使用してそのモデルを自分で構築する必要がありますか?確率的プログラミング言語?

4

2 に答える 2

1

Sklearn は、たとえばthis other answerに示されているように、単一の分布の平均 (別名「場所」) を修正する可能性を提供します。flocこれを行う手段は、メソッドにパラメーターを提供することですfit(「固定位置」を表します)。

ただし、Drey が述べたように、それはGMM では不可能ですコードを詳しく見てみると、GaussianMixture BaseMixture を拡張していることがわかります。そして、対応するfitメソッドを見ると、それが期待値最大化アルゴリズムを実行し、固定された結果などから何も認めないことがわかります。

この機能を既存のコードに追加することは、EM 実装との激しい論争を伴う可能性があり、おそらく何よりも多くの問題を引き起こすでしょう。

とはいえ、GMM はその種の配布に最適なモデルではないようです。よく見ると、ベータ版ディストリビューションの混合がうまくいくようです。

驚くべき Python ライブラリpomegranateは非常に使いやすく、任意の分布の混合物に適合させることができます。ここでは、サポートされているディストリビューションのコードを確認できます。ベータ版が存在するようです:

https://pomegranate.readthedocs.io/en/latest/

乾杯!
アンドレス

于 2021-04-05T22:09:49.437 に答える